package com.temenos.interaction.core.hypermedia;
/*
* #%L
* interaction-core
* %%
* Copyright (C) 2012 - 2013 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.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.temenos.interaction.core.hypermedia.expression.Expression;
public class TestTransition {
@Test
public void testEquality() {
ResourceState begin = new ResourceState("entity", "", new ArrayList<Action>(), "/");
ResourceState begin2 = new ResourceState("entity", "", new ArrayList<Action>(), "/");
Transition.Builder tb = new Transition.Builder();
tb.source(begin)
.target(begin2)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
t.equals(null);
Transition.Builder tb2 = new Transition.Builder();
tb2.source(begin)
.target(begin2)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t2 = tb2.build();
assertEquals(t, t2);
assertEquals(t.hashCode(), t2.hashCode());
}
@Test
public void testEqualityNullTarget() {
ResourceState begin = new ResourceState("entity", "", new ArrayList<Action>(), "/");
Transition.Builder tb = new Transition.Builder();
tb.source(begin)
.target(null)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
Transition.Builder tb2 = new Transition.Builder();
tb2.source(begin)
.target(null)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t2 = tb2.build();
assertEquals(t, t2);
assertEquals(t.hashCode(), t2.hashCode());
t2.setTarget(mock(ResourceState.class));
assertFalse(t.equals(t2));
t2.setTarget(null);
t.setSource(mock(ResourceState.class));
assertFalse(t.equals(t2));
}
@Test
public void testEqualityNullSource() {
ResourceState begin2 = new ResourceState("entity", "", new ArrayList<Action>(), "/");
Transition.Builder tb = new Transition.Builder();
tb.source(null)
.target(begin2)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
Transition.Builder tb2 = new Transition.Builder();
tb2.source(null)
.target(begin2)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t2 = tb2.build();
assertEquals(t, t2);
assertEquals(t.hashCode(), t2.hashCode());
t2.setSource(mock(ResourceState.class));
assertFalse(t.equals(t2));
t2.setSource(null);
t.setSource(mock(ResourceState.class));
assertFalse(t.equals(t2));
}
@Test
public void testEqualityNullSourceName() {
ResourceState begin2 = new ResourceState("entity", "", new ArrayList<Action>(), "/");
Transition.Builder tb = new Transition.Builder();
ResourceState state = mock(ResourceState.class);
when(state.getName()).thenReturn("target");
tb.source(state)
.target(begin2)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
Transition.Builder tb2 = new Transition.Builder();
ResourceState state2 = mock(ResourceState.class);
tb2.source(state2)
.target(begin2)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t2 = tb2.build();
assertFalse(t.equals(t2));
t2.setSource(state);
t.setSource(state2);
assertFalse(t.equals(t2));
}
@Test
public void testEqualityNullTargetName() {
ResourceState begin = new ResourceState("entity", "", new ArrayList<Action>(), "/");
Transition.Builder tb = new Transition.Builder();
ResourceState state = mock(ResourceState.class);
when(state.getName()).thenReturn("target");
tb.target(state)
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
Transition.Builder tb2 = new Transition.Builder();
ResourceState state2 = mock(ResourceState.class);
tb2.target(state2)
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t2 = tb2.build();
assertFalse(t.equals(t2));
t2.setTarget(state);
t.setTarget(state2);
assertFalse(t.equals(t2));
}
@Test
public void testInequality() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "exists", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "/");
Transition.Builder tb = new Transition.Builder();
tb.source(begin)
.target(end)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
Transition.Builder tb2 = new Transition.Builder();
tb2.source(begin)
.target(exists)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t2 = tb2.build();
assertFalse(t.equals(t2));
assertFalse(t.hashCode() == t2.hashCode());
Transition.Builder tb3 = new Transition.Builder();
tb3.source(begin)
.target(end)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t3 = tb3.build();
Transition.Builder tb4 = new Transition.Builder();
tb4.source(begin)
.target(end)
.flags(Transition.AUTO);
Transition t4 = tb2.build();
assertFalse(t3.equals(t4));
assertFalse(t3.hashCode() == t4.hashCode());
}
@Test
public void testInequalityUriParameters() {
ResourceState begin = new ResourceState("entity", "collection", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "onetype", new ArrayList<Action>(), "{id}");
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("id", "abc");
Transition t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.uriParameters(uriParameters)
.target(exists)
.build();
uriParameters.clear();
uriParameters.put("id", "xyz");
Transition t2 = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.uriParameters(uriParameters)
.target(exists)
.build();
assertFalse(t.equals(t2));
assertFalse(t.hashCode() == t2.hashCode());
}
@Test
public void testGetId() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Transition t = new Transition.Builder()
.source(begin)
.method("PUT")
.target(end)
.build();
assertEquals("entity.begin>PUT>entity.end", t.getId());
}
@Test
public void testToString() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "/begin");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "/end");
Transition.Builder tb = new Transition.Builder();
tb.source(begin)
.target(end)
.method("PUT");
Transition t = tb.build();
assertEquals("entity.begin>PUT>entity.end", t.toString());
}
@Test
public void testIsAnyOfTypes() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "/begin");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "/end");
Transition.Builder tb = new Transition.Builder();
tb.source(begin)
.target(end)
.method("PUT")
.flags(Transition.FOR_EACH);
Transition t = tb.build();
assertFalse(t.isAnyOfTypes(Transition.AUTO, Transition.EMBEDDED, Transition.FOR_EACH_EMBEDDED));
assertTrue(t.isAnyOfTypes(Transition.AUTO, Transition.EMBEDDED, Transition.FOR_EACH));
assertTrue(t.isAnyOfTypes(Transition.FOR_EACH));
}
@Test
public void testGetLabel() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Transition.Builder tba = new Transition.Builder();
tba.source(begin)
.target(end)
.method("GET")
.label("A");
Transition ta = tba.build();
assertEquals("A", ta.getLabel());
Transition.Builder tbb = new Transition.Builder();
tbb.source(begin)
.target(end)
.method("GET")
.label("B");
Transition tb = tbb.build();
assertEquals("B", tb.getLabel());
}
@Test
public void testIdMultiTransitions() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Transition ta = new Transition.Builder()
.source(begin)
.method("GET")
.target(end)
.label("A")
.build();
Transition taPut = new Transition.Builder()
.source(begin)
.method("PUT")
.target(end)
.label("A")
.build();
assertEquals("entity.begin>GET(A)>entity.end", ta.getId());
assertEquals("entity.begin>PUT(A)>entity.end", taPut.getId());
Transition tb = new Transition.Builder()
.source(begin)
.method("GET")
.target(end)
.label("B")
.build();
assertEquals("entity.begin>GET(B)>entity.end", tb.getId());
}
@Test
public void testCheckTransitionFromCollectionToEntityResource() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Transition t = new Transition.Builder()
.source(begin).method("GET").target(end).build();
assertFalse(t.isGetFromCollectionToEntityResource());
begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
end = new CollectionResourceState("entity", "end", new ArrayList<Action>(), "{id}");
t = new Transition.Builder()
.source(begin).method("GET").target(end).build();
assertFalse(t.isGetFromCollectionToEntityResource());
begin = new CollectionResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
t = new Transition.Builder()
.source(begin).method("GET").target(end).build();
assertTrue(t.isGetFromCollectionToEntityResource());
begin = new CollectionResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
end = new ResourceState("otherEntity", "end", new ArrayList<Action>(), "{id}");
t = new Transition.Builder()
.source(begin).method("GET").target(end).build();
assertFalse(t.isGetFromCollectionToEntityResource());
begin = new CollectionResourceState("otherEntity", "begin", new ArrayList<Action>(), "{id}");
end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
t = new Transition.Builder()
.source(begin).method("GET").target(end).build();
assertFalse(t.isGetFromCollectionToEntityResource());
}
@Test
public void testIdMultiTransitionsWithParametersNoLabel() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Map<String, String> params = new HashMap<String, String>();
params.put("paramA", "hello A");
Transition ta = new Transition.Builder()
.source(begin)
.method("GET")
.uriParameters(params)
.target(end)
.build();
Transition taPut = new Transition.Builder()
.source(begin)
.method("PUT")
.target(end)
.build();
assertEquals("entity.begin>GET>entity.end", ta.getId());
assertEquals("entity.begin>PUT>entity.end", taPut.getId());
params = new HashMap<String, String>();
params.put("paramB", "hello B");
Transition tb = new Transition.Builder()
.source(begin)
.method("GET")
.uriParameters(params)
.target(end)
.build();
assertEquals("entity.begin>GET>entity.end", tb.getId());
}
@Test
public void testGetLinkId() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Transition.Builder tba = new Transition.Builder();
tba.source(begin)
.target(end)
.method("GET")
.label("A")
.linkId("123456");
Transition ta = tba.build();
assertEquals("123456", ta.getLinkId());
Transition.Builder tbb = new Transition.Builder();
tbb.source(begin)
.target(end)
.method("GET")
.label("B")
.linkId("123456");
Transition tb = tbb.build();
assertEquals("123456", tb.getLinkId());
}
@Test
public void testResourceLocator() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceLocator locator = mock(ResourceLocator.class);
Transition.Builder tba = new Transition.Builder();
tba.source(begin)
.locator(locator)
.method("GET")
.label("A")
.linkId("123456");
Transition t = tba.build();
assertEquals(locator, t.getLocator());
}
@Test
public void testEvaluation() {
ResourceState begin = new ResourceState("entity", "begin", new ArrayList<Action>(), "{id}");
ResourceState end = new ResourceState("entity", "end", new ArrayList<Action>(), "{id}");
Expression expression = mock(Expression.class);
Transition.Builder tba = new Transition.Builder();
tba.source(begin)
.target(end)
.method("GET")
.evaluation(expression)
.label("A")
.linkId("123456");
Transition t = tba.build();
assertEquals(expression, t.getCommand().getEvaluation());
}
@Test
public void testEqualityLinkId() {
ResourceState begin = new ResourceState("entity", "collection", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "onetype", new ArrayList<Action>(), "{id}");
Transition t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label("label1")
.linkId("123456")
.build();
Transition t2 = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label("label1")
.linkId("123456")
.build();
assertTrue(t.equals(t2));
assertTrue(t.hashCode() == t2.hashCode());
}
@Test
public void testInequalityLinkId() {
ResourceState begin = new ResourceState("entity", "collection", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "onetype", new ArrayList<Action>(), "{id}");
Transition t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label("label1")
.linkId("12345")
.build();
Transition t2 = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label("label1")
.linkId("67890")
.build();
assertFalse(t.equals(t2));
assertFalse(t.hashCode() == t2.hashCode());
t.setLinkId(null);
assertFalse(t.equals(t2));
t.setLinkId("12345");
t2.setLinkId(null);
assertFalse(t.equals(t2));
t.setLinkId(null);
assertFalse(t.equals(t2));
}
@Test
public void testEqualityCommand() {
ResourceState begin = new ResourceState("entity", "collection", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "onetype", new ArrayList<Action>(), "{id}");
String label = "label1";
Transition t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(label)
.linkId("12345")
.build();
Transition t2 = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(label)
.linkId("12345")
.build();
assertTrue(t.equals(t2));
}
@Test
public void testInequalityLabel() {
ResourceState begin = new ResourceState("entity", "collection", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "onetype", new ArrayList<Action>(), "{id}");
String label = "label1";
Transition t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(null)
.linkId("12345")
.build();
Transition t2 = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(label)
.linkId("12345")
.build();
assertFalse(t.equals(t2));
assertFalse(t.hashCode() == t2.hashCode());
t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(label)
.linkId("12345")
.build();
t2 = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(null)
.linkId("12345")
.build();
assertFalse(t.equals(t2));
t = new Transition.Builder()
.source(begin)
.method("PUT")
.flags(Transition.FOR_EACH)
.target(exists)
.label(null)
.linkId("12345")
.build();
assertTrue(t.equals(t2));
}
@Test
public void testSourceField() {
Transition.Builder tba = new Transition.Builder();
tba.sourceField("A");
Transition ta = tba.build();
assertEquals("A", ta.getSourceField());
Transition.Builder tbb = new Transition.Builder();
tbb.sourceField("B");
Transition tb = tbb.build();
assertEquals("B", tb.getSourceField());
}
@Test
public void testEqualitySourceField() {
ResourceState begin = new ResourceState("entity", "collection", new ArrayList<Action>(), "/");
ResourceState exists = new ResourceState("entity", "onetype", new ArrayList<Action>(), "{id}");
Transition t = new Transition.Builder()
.source(begin)
.target(exists)
.sourceField("source")
.build();
Transition t2 = new Transition.Builder()
.source(begin)
.target(exists)
.sourceField("source")
.build();
assertTrue(t.equals(t2));
assertTrue(t.hashCode() == t2.hashCode());
t = new Transition.Builder()
.source(begin)
.target(exists)
.sourceField("source")
.build();
t2 = new Transition.Builder()
.source(begin)
.target(exists)
.sourceField(null)
.build();
assertFalse(t.equals(t2));
t = new Transition.Builder()
.source(begin)
.target(exists)
.sourceField("sourceF1")
.build();
t2 = new Transition.Builder()
.source(begin)
.target(exists)
.sourceField("sourceF2")
.build();
assertFalse(t.equals(t2));
}
}