package com.temenos.interaction.core.hypermedia.transition; /* * #%L * interaction-core * %% * Copyright (C) 2012 - 2017 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 com.temenos.interaction.core.MultivaluedMapImpl; import com.temenos.interaction.core.command.*; import com.temenos.interaction.core.command.InteractionCommand.Result; import com.temenos.interaction.core.entity.Entity; import com.temenos.interaction.core.entity.EntityMetadata; import com.temenos.interaction.core.entity.EntityProperties; import com.temenos.interaction.core.entity.Metadata; import com.temenos.interaction.core.hypermedia.*; import com.temenos.interaction.core.resource.EntityResource; import org.junit.Before; import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import javax.ws.rs.core.Response.Status; import java.util.*; import static junit.framework.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author ikarady */ public class TestAutoTransitioner { private static final String ENTITY_NAME = "Person"; private @Mock EntityMetadata entityMetadataMock; private @Mock Metadata metadataMock; private @Mock Transformer transformerMock; private ResourceState defaultState; private ResourceState initialState; private Entity entity0; private Entity entity1; private Entity entity2; private Entity entity3; private Entity entity4; @Before public void setup() throws InteractionException { MockitoAnnotations.initMocks(this); when(metadataMock.getEntityMetadata(any(String.class))).thenReturn(entityMetadataMock); when(transformerMock.transform(Matchers.any())).thenReturn(new HashMap<String, Object>()); defaultState = new ResourceState(ENTITY_NAME, "defaultState", new ArrayList<Action>(), "/defaultState"); initialState = new ResourceState(ENTITY_NAME, "initialState", new ArrayList<Action>(), "/initialState"); entity0 = new Entity("Customer0", new EntityProperties()); entity1 = new Entity("Customer1", new EntityProperties()); entity2 = new Entity("Customer2", new EntityProperties()); entity3 = new Entity("Customer3", new EntityProperties()); entity4 = new Entity("Customer4", new EntityProperties()); } @Test public void testTransition() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", new ArrayList<Action>()); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController(), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertNull(autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testTransitionWithEntityIn() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().setEntity(entity0).build(), transformerMock, stubCommandController(new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build())), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals(entity0, autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testTransitionWithEntityInOut() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().setEntity(entity0).build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().setEntity(entity1).build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals(entity1, autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testTransitionWithPathParameter() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().addPathParameters("path").build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals("path", autoTransitioner.getOutcome().getInteractionContext().getPathParameters().getFirst("path")); assertFalse(autoTransitioner.getOutcome().getInteractionContext().getQueryParameters().containsKey("path")); } @Test public void testTransitionWithQueryParameter() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().addQueryParameters("query").build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals("query", autoTransitioner.getOutcome().getInteractionContext().getPathParameters().getFirst("query")); assertEquals("query", autoTransitioner.getOutcome().getInteractionContext().getQueryParameters().getFirst("query")); } @Test public void testTransitionWithResponseHeader() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().addResponseHttpHeaders(new HashMap<String, String>(){{put("responseHeader1","responseValue1");}}).build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertTrue(autoTransitioner.getOutcome().getInteractionContext().getResponseHeaders().containsKey("responseHeader1")); assertEquals("responseValue1", autoTransitioner.getOutcome().getInteractionContext().getResponseHeaders().get("responseHeader1")); } @Test public void testTransitionFailure() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getFailureCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @Test public void testTransitionError() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getErrorCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @Test public void testMultipleTransitions() { ResourceState state1 = new ResourceState(initialState, "state1", toList(new Action("GET", Action.TYPE.VIEW))); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("DO", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(initialState, "state3", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state4 = new ResourceState(initialState, "state4", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).flags(Transition.AUTO).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); initialState.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); initialState.addTransition(new Transition.Builder().target(state4).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().setEntity(entity0).build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("GET", getFailureCommandBuilder().setEntity(entity1).build()), new AbstractMap.SimpleEntry<>("DO", getErrorCommandBuilder().setEntity(entity2).build()), new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setEntity(entity3).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().setEntity(entity4).build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state3, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals(entity3, autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testDynamicTransition() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new DynamicResourceState(ENTITY_NAME, "state2", null, "path"); ResourceState state3 = new ResourceState(initialState, "state3", new ArrayList<Action>()); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController(), mockResourceLocatorProvider(state3), mockLazyResourceStateResolver()) .setParameterResolverProvider(mockResourceParameterResolverProvider()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state3, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals("path", autoTransitioner.getOutcome().getInteractionContext().getPathParameters().getFirst("path")); assertEquals("path", autoTransitioner.getOutcome().getInteractionContext().getQueryParameters().getFirst("path")); } @Test public void testLazyTransition() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new LazyResourceState("state2"); ResourceState state3 = new ResourceState(initialState, "state3", new ArrayList<Action>()); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController(), mockResourceLocatorProvider(), mockLazyResourceStateResolver(state3)); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state3, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); } @Test public void testTransitionThroughInterim() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setInterim(true).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state3, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); } @Test public void testTransitionThroughInterimWithInterimContentOnly() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().setEntity(entity0).build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setInterim(true).setEntity(entity1).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build())), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state3, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals(entity1, autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testTransitionThroughInterimWithContent() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().setEntity(entity0).build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setInterim(true).setEntity(entity1).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().setEntity(entity2).build())), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state3, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals(entity2, autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testInterimTransitionOnly() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setInterim(true).build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @Test public void testTransitionWithOrphanInterim() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().setEntity(entity0).build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setEntity(entity1).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().setInterim(true).setEntity(entity2).build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertTrue(autoTransitioner.transition().isSuccessful()); assertEquals(state2, autoTransitioner.getOutcome().getInteractionContext().getCurrentState()); assertEquals(entity1, autoTransitioner.getOutcome().getInteractionContext().getResourceEntity()); } @Test public void testTransitionFailureThroughInterim() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setInterim(true).build()), new AbstractMap.SimpleEntry<>("POST", getFailureCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @Test public void testInterimTransitionFailure() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getFailureCommandBuilder().setInterim(true).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build())), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @Test public void testTransitionErrorThroughInterim() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getSuccessCommandBuilder().setInterim(true).build()), new AbstractMap.SimpleEntry<>("POST", getErrorCommandBuilder().build()) ), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @Test public void testInterimTransitionError() { ResourceState state1 = new ResourceState(initialState, "state1", new ArrayList<Action>()); ResourceState state2 = new ResourceState(initialState, "state2", toList(new Action("PUT", Action.TYPE.ENTRY))); ResourceState state3 = new ResourceState(state2, "state3", toList(new Action("POST", Action.TYPE.ENTRY))); initialState.addTransition(new Transition.Builder().target(state1).build()); initialState.addTransition(new Transition.Builder().target(state2).flags(Transition.AUTO).build()); state2.addTransition(new Transition.Builder().target(state3).flags(Transition.AUTO).build()); AutoTransitioner autoTransitioner = new AutoTransitioner( new InteractionContextBuilder().build(), transformerMock, stubCommandController( new AbstractMap.SimpleEntry<>("PUT", getErrorCommandBuilder().setInterim(true).build()), new AbstractMap.SimpleEntry<>("POST", getSuccessCommandBuilder().build())), mockResourceLocatorProvider(), mockLazyResourceStateResolver()); assertFalse(autoTransitioner.transition().isSuccessful()); } @SafeVarargs private final CommandController stubCommandController(AbstractMap.SimpleEntry<String, TransitionCommand>... entries) { MapBasedCommandController commandController = new MapBasedCommandController(); for (AbstractMap.SimpleEntry<String, TransitionCommand> entry : entries) { commandController.getCommandMap().put(entry.getKey(), entry.getValue()); } return commandController; } private ResourceLocatorProvider mockResourceLocatorProvider() { return mockResourceLocatorProvider(defaultState); } private ResourceLocatorProvider mockResourceLocatorProvider(final ResourceState state) { ResourceLocator resourceLocator = new ResourceLocator() { @Override public ResourceState resolve(Object... alias) { return state; }}; ResourceLocatorProvider resourceLocatorProviderMock = mock(ResourceLocatorProvider.class); when(resourceLocatorProviderMock.get(anyString())).thenReturn(resourceLocator); return resourceLocatorProviderMock; } private LazyResourceStateResolver mockLazyResourceStateResolver() { return mockLazyResourceStateResolver(defaultState); } private LazyResourceStateResolver mockLazyResourceStateResolver(ResourceState state) { ResourceStateProvider resourceStateProviderMock = Mockito.mock(ResourceStateProvider.class); when(resourceStateProviderMock.getResourceState(anyString())).thenReturn(state); return new LazyResourceStateResolver(resourceStateProviderMock); } private ResourceParameterResolverProvider mockResourceParameterResolverProvider() { ResourceParameterResolver parameterResolver = new ResourceParameterResolver() { @Override public ParameterAndValue[] resolve(Object[] aliases, ResourceParameterResolverContext context) { ParameterAndValue[] params = new ParameterAndValue[aliases.length]; for (int i = 0; i < aliases.length; i++) { String value = aliases[i].toString(); params[i] = new ParameterAndValue(value, value); } return params; } }; ResourceParameterResolverProvider parameterResolverMock = mock(ResourceParameterResolverProvider.class); when(parameterResolverMock.get(anyString())).thenReturn(parameterResolver); return parameterResolverMock; } private CommandBuilder getSuccessCommandBuilder() { return new CommandBuilder().setResult(Result.SUCCESS); } private CommandBuilder getFailureCommandBuilder() { return new CommandBuilder().setResult(Result.FAILURE); } private CommandBuilder getErrorCommandBuilder() { return new CommandBuilder().setException(new InteractionException(Status.INTERNAL_SERVER_ERROR)); } @SafeVarargs private final <T> List<T> toList(T... array) { List<T> list = new ArrayList<T>(); Collections.addAll(list, array); return list; } private class CommandBuilder { private Result result; private Entity entity; private boolean isInterim; private InteractionException exception; CommandBuilder setResult(Result result) { this.result = result; return this; } CommandBuilder setEntity(Entity entity) { this.entity = entity; return this; } CommandBuilder setInterim(boolean interim) { isInterim = interim; return this; } CommandBuilder setException(InteractionException exception) { this.exception = exception; return this; } TransitionCommand build() { return new TransitionCommand() { @Override public Result execute(InteractionContext ctx) throws InteractionException { if (exception != null) { throw exception; } else if (entity != null) { ctx.setResource(new EntityResource<>(entity.getName(), entity)); } return result; } @Override public boolean isInterim() { return isInterim; } }; } } private class InteractionContextBuilder { private Entity entity = null; private MultivaluedMapImpl<String> pathParameters = new MultivaluedMapImpl<>(); private MultivaluedMapImpl<String> queryParameters = new MultivaluedMapImpl<>(); private Map<String,String> responseHttpHeaders = null; InteractionContextBuilder setEntity(Entity entity) { this.entity = entity; return this; } InteractionContextBuilder addPathParameters(String... pathParameters) { if (pathParameters != null) { for (String pathParameter : pathParameters) { this.pathParameters.putSingle(pathParameter, pathParameter); } } return this; } InteractionContextBuilder addQueryParameters(String... queryParameters) { if (queryParameters != null) { for (String queryParameter : queryParameters) { this.queryParameters.putSingle(queryParameter, queryParameter); } } return this; } InteractionContextBuilder addResponseHttpHeaders(Map<String,String> responseHttpHeaders) { this.responseHttpHeaders = responseHttpHeaders; return this; } InteractionContext build() { InteractionContext ctx = new InteractionContext(null, null, pathParameters, queryParameters, initialState, metadataMock); if (entity != null) { ctx.setResource(new EntityResource<>(entity.getName(), entity)); } if(responseHttpHeaders != null){ ctx.getResponseHeaders().putAll(responseHttpHeaders); } return ctx; } } }