package com.temenos.interaction.core.hypermedia; /* * #%L * interaction-core * %% * Copyright (C) 2012 - 2016 Temenos Holdings N.V. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; /** * @author aburgos */ public class TestDefaultResourceStateProvider { static ResourceStateMachine hypermediaEngine; static PathTree paths; static String ENTITY_NAME = "TEST"; private boolean simpleResourceStatesComparison(ResourceState rs1, ResourceState rs2) { if(!rs1.getEntityName().equals(rs2.getEntityName())) return false; if(!rs1.getName().equals(rs2.getName())) return false; if(!rs1.getPath().equals(rs2.getPath())) return false; return true; } @BeforeClass public static void setUpClass() { ResourceState initial = new ResourceState(ENTITY_NAME, "initial", new ArrayList<Action>(), "/entity"); ResourceState published = new ResourceState(ENTITY_NAME, "published", new ArrayList<Action>(), "/published"); ResourceState publishedDeleted = new ResourceState(published, "publishedDeleted", new ArrayList<Action>()); ResourceState draft = new ResourceState(ENTITY_NAME, "draft", new ArrayList<Action>(), "/draft"); ResourceState draftDeleted = new ResourceState(draft, "draftDeleted", new ArrayList<Action>()); // create draft initial.addTransition(new Transition.Builder().method("PUT").target(draft).build()); // updated draft draft.addTransition(new Transition.Builder().method("PUT").target(draft).build()); // publish draft.addTransition(new Transition.Builder().method("PUT").target(published).build()); // delete draft draft.addTransition(new Transition.Builder().method("DELETE").target(draftDeleted).build()); // delete published published.addTransition(new Transition.Builder().method("DELETE").target(publishedDeleted).build()); hypermediaEngine = new ResourceStateMachine(initial); // fill out paths paths = new PathTree(); paths.put(initial.getPath(), "GET", initial.getName()); paths.put(draft.getPath(), "PUT", draft.getName()); paths.put(published.getPath(), "PUT", published.getName()); paths.put(draftDeleted.getPath(), "DELETE", draftDeleted.getName()); paths.put(publishedDeleted.getPath(), "DELETE", publishedDeleted.getName()); } @Test public void testIsLoaded() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); assertTrue(rsp.isLoaded("initial")); assertTrue(rsp.isLoaded("published")); assertTrue(rsp.isLoaded("publishedDeleted")); assertTrue(rsp.isLoaded("draft")); assertTrue(rsp.isLoaded("draftDeleted")); } @Test public void testGetResourceStateString() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); ResourceState initial = new ResourceState(ENTITY_NAME, "initial", new ArrayList<Action>(), "/entity"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("initial"), initial)); ResourceState published = new ResourceState(ENTITY_NAME, "published", new ArrayList<Action>(), "/published"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("published"), published)); ResourceState draft = new ResourceState(ENTITY_NAME, "draft", new ArrayList<Action>(), "/draft"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("draft"), draft)); ResourceState publishedDeleted = new ResourceState("TEST", "publishedDeleted", new ArrayList<Action>(), "/published"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("publishedDeleted"), publishedDeleted)); ResourceState draftDeleted = new ResourceState("TEST", "draftDeleted", new ArrayList<Action>(), "/draft"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("draftDeleted"), draftDeleted)); } @Test public void testDetermineState() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); ResourceState initial = new ResourceState(ENTITY_NAME, "initial", new ArrayList<Action>(), "/entity"); assertTrue(simpleResourceStatesComparison(rsp.determineState(new Event("", "GET"), "/entity"), initial)); ResourceState published = new ResourceState(ENTITY_NAME, "published", new ArrayList<Action>(), "/published"); assertTrue(simpleResourceStatesComparison(rsp.determineState(new Event("", "PUT"), "/published"), published)); ResourceState draft = new ResourceState(ENTITY_NAME, "draft", new ArrayList<Action>(), "/draft"); assertTrue(simpleResourceStatesComparison(rsp.determineState(new Event("", "PUT"), "/draft"), draft)); ResourceState publishedDeleted = new ResourceState(published, "publishedDeleted", new ArrayList<Action>()); assertTrue(simpleResourceStatesComparison(rsp.determineState(new Event("", "DELETE"), "/published"), publishedDeleted)); ResourceState draftDeleted = new ResourceState(draft, "draftDeleted", new ArrayList<Action>()); assertTrue(simpleResourceStatesComparison(rsp.determineState(new Event("", "DELETE"), "/draft"), draftDeleted)); } @Test public void testGetResourceStatesByPath() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); Map<String, Set<String>> resourceStatesByPath = rsp.getResourceStatesByPath(); assertEquals(3, resourceStatesByPath.size()); assertEquals(new HashSet<String>(Arrays.asList("initial")), resourceStatesByPath.get("/entity")); assertEquals(new HashSet<String>(Arrays.asList("publishedDeleted", "published")), resourceStatesByPath.get("/published")); assertEquals(new HashSet<String>(Arrays.asList("draftDeleted", "draft")), resourceStatesByPath.get("/draft")); } @Test public void testGetResourceMethodsByState() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); Map<String, Set<String>> resourceMethodsByState = rsp.getResourceMethodsByState(); assertEquals(5, resourceMethodsByState.size()); assertEquals(new HashSet<String>(Arrays.asList("GET")), resourceMethodsByState.get("initial")); assertEquals(new HashSet<String>(Arrays.asList("PUT")), resourceMethodsByState.get("published")); assertEquals(new HashSet<String>(Arrays.asList("PUT")), resourceMethodsByState.get("draft")); assertEquals(new HashSet<String>(Arrays.asList("DELETE")), resourceMethodsByState.get("publishedDeleted")); assertEquals(new HashSet<String>(Arrays.asList("DELETE")), resourceMethodsByState.get("draftDeleted")); } @Test public void testGetResourcePathsByState() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); Map<String, String> resourcePathsByState = rsp.getResourcePathsByState(); assertEquals(5, resourcePathsByState.size()); assertEquals("/entity", resourcePathsByState.get("initial")); assertEquals("/published", resourcePathsByState.get("published")); assertEquals("/draft", resourcePathsByState.get("draft")); assertEquals("/published", resourcePathsByState.get("publishedDeleted")); assertEquals("/draft", resourcePathsByState.get("draftDeleted")); } @Test public void testGetResourceStateStringString() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); ResourceState initial = new ResourceState(ENTITY_NAME, "initial", new ArrayList<Action>(), "/entity"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("GET", "/entity"), initial)); ResourceState published = new ResourceState(ENTITY_NAME, "published", new ArrayList<Action>(), "/published"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("PUT", "/published"), published)); ResourceState draft = new ResourceState(ENTITY_NAME, "draft", new ArrayList<Action>(), "/draft"); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("PUT", "/draft"), draft)); ResourceState publishedDeleted = new ResourceState(published, "publishedDeleted", new ArrayList<Action>()); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("DELETE", "/published"), publishedDeleted)); ResourceState draftDeleted = new ResourceState(draft, "draftDeleted", new ArrayList<Action>()); assertTrue(simpleResourceStatesComparison(rsp.getResourceState("DELETE", "/draft"), draftDeleted)); } @Test public void testGetResourceStateId() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); assertEquals(rsp.getResourceStateId("GET", "/entity"), "initial"); assertEquals(rsp.getResourceStateId("PUT", "/draft"), "draft"); assertEquals(rsp.getResourceStateId("DELETE", "/draft"), "draftDeleted"); assertEquals(rsp.getResourceStateId("PUT", "/published"), "published"); assertEquals(rsp.getResourceStateId("DELETE", "/published"), "publishedDeleted"); } @Test(expected=MethodNotAllowedException.class) public void testMethodNotAllowedExceptionforGetResourceStateId() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); // allowed method String resourceId = rsp.getResourceStateId("GET", "/entity"); assertEquals("initial", resourceId); // not allowed method rsp.getResourceStateId("DELETE", "/entity"); } @Test(expected=MethodNotAllowedException.class) public void testMethodNotAllowedExceptionforGetResourceState() throws Exception { DefaultResourceStateProvider rsp = new DefaultResourceStateProvider(hypermediaEngine); // allowed method ResourceState resource = rsp.getResourceState("GET", "/entity"); assertEquals("initial", resource.getName()); // not allowed method rsp.getResourceState("DELETE", "/entity"); } }