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.*;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MultivaluedMap;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.odata4j.core.OCollection;
import org.odata4j.core.OCollections;
import org.odata4j.core.OComplexObject;
import org.odata4j.core.OComplexObjects;
import org.odata4j.core.OEntities;
import org.odata4j.core.OEntity;
import org.odata4j.core.OProperties;
import org.odata4j.core.OProperty;
import org.odata4j.edm.EdmComplexType;
import org.odata4j.edm.EdmEntitySet;
import com.temenos.interaction.core.MultivaluedMapImpl;
import com.temenos.interaction.core.command.InteractionContext;
import com.temenos.interaction.core.web.RequestContext;
/**
* Created by ikarady on 06/04/2016.
*/
public class TestLinkGeneratorImpl {
@Before
public void setup() {
// initialise the thread local request context with requestUri and baseUri
RequestContext ctx = new RequestContext("/baseuri", "/requesturi", null);
RequestContext.setRequestContext(ctx);
}
@Test
public void testCreateLinkHrefSimple() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class));
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).build();
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, null);
assertFalse(links.isEmpty());
assertEquals("/baseuri/test", links.iterator().next().getHref());
}
@Test
public void testCreateLinkHrefReplaceUsingEntity() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test/{noteId}")).build();
Object entity = new TestNote("123");
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
assertFalse(links.isEmpty());
assertEquals("/baseuri/test/123", links.iterator().next().getHref());
}
@Test
public void testCreateLinkHrefUriParameterTokensReplaceUsingEntity() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{noteId}");
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
Object entity = new TestNote("123");
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
assertFalse(links.isEmpty());
assertEquals("/baseuri/test?test=123", links.iterator().next().getHref());
}
@Test
public void testCreateLinkHrefUriParameterTokensReplaceQueryParameters() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{noteId}");
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
queryParameters.add("noteId", "123");
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, queryParameters, null);
assertFalse(links.isEmpty());
assertEquals("/baseuri/test?test=123", links.iterator().next().getHref());
}
@Test
public void testCreateLinkHrefUriParameterTokensReplaceQueryParametersSpecial() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("filter", "{$filter}");
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
queryParameters.add("$filter", "123");
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, queryParameters, null);
assertFalse(links.isEmpty());
assertEquals("/baseuri/test?filter=123", links.iterator().next().getHref());
}
@Test
public void testCreateLinkHrefUriParameterTransitionPropertiesReplaceQueryParameters() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("param1", "delta");
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
InteractionContext ctx = mock(InteractionContext.class);
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
queryParameters.add("param1", "alpha");
queryParameters.add("param2", "beta");
queryParameters.add("param3", "gamma");
when(ctx.getOutQueryParameters()).thenReturn(queryParameters);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, ctx);
Collection<Link> links = linkGenerator.createLink(null, null, null);
assertFalse(links.isEmpty());
String actualHref = links.iterator().next().getHref();
assertTrue(actualHref.contains("/baseuri/test?"));
assertTrue(actualHref.contains("param1=delta"));
assertTrue(actualHref.contains("param2=beta"));
assertTrue(actualHref.contains("param3=gamma"));
}
@Test
public void testCreateLinkHrefUriParametersQueryParametersAndNoTransitionProperties() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
InteractionContext ctx = mock(InteractionContext.class);
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
queryParameters.add("param1", "alpha");
queryParameters.add("param2", "beta");
queryParameters.add("param3", "gamma");
when(ctx.getOutQueryParameters()).thenReturn(queryParameters);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, ctx);
Collection<Link> links = linkGenerator.createLink(null, null, null);
assertFalse(links.isEmpty());
String actualHref = links.iterator().next().getHref();
assertTrue(actualHref.contains("/baseuri/test?"));
assertTrue(actualHref.contains("param1=alpha"));
assertTrue(actualHref.contains("param2=beta"));
assertTrue(actualHref.contains("param3=gamma"));
}
@Test
public void testCreateLinkHrefUriParametersTransitionPropertiesAndNoQueryParameters() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("param1", "alpha");
uriParameters.put("param2", "beta");
uriParameters.put("param3", "gamma");
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
InteractionContext ctx = mock(InteractionContext.class);
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
when(ctx.getOutQueryParameters()).thenReturn(queryParameters);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, ctx);
Collection<Link> links = linkGenerator.createLink(null, null, null);
assertFalse(links.isEmpty());
String actualHref = links.iterator().next().getHref();
assertTrue(actualHref.contains("/baseuri/test?"));
assertTrue(actualHref.contains("param1=alpha"));
assertTrue(actualHref.contains("param2=beta"));
assertTrue(actualHref.contains("param3=gamma"));
}
@Test
public void testCreateLinkHrefUriParametersQueryParametersNonAsciiCharacters() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Map<String, String> uriParameters = new HashMap<String, String>();
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).uriParameters(uriParameters).build();
InteractionContext ctx = mock(InteractionContext.class);
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
queryParameters.add("param1", "a@1");
queryParameters.add("param2", "b@2");
queryParameters.add("param3", "c@3");
when(ctx.getOutQueryParameters()).thenReturn(queryParameters);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, ctx);
Collection<Link> links = linkGenerator.createLink(null, null, null);
assertFalse(links.isEmpty());
String actualHref = links.iterator().next().getHref();
assertTrue(actualHref.contains("/baseuri/test?"));
assertTrue(actualHref.contains("param1=a%401"));
assertTrue(actualHref.contains("param2=b%402"));
assertTrue(actualHref.contains("param3=c%403"));
}
@Test
public void testCreateLinkHrefAllQueryParameters() {
ResourceStateMachine engine = new ResourceStateMachine(mock(ResourceState.class), new BeanTransformer());
Transition t = new Transition.Builder().source(mock(ResourceState.class)).target(mockTarget("/test")).build();
MultivaluedMap<String, String> queryParameters = new MultivaluedMapImpl<String>();
queryParameters.add("$filter", "123");
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null).setAllQueryParameters(true);
Collection<Link> links = linkGenerator.createLink(new MultivaluedMapImpl<String>(), queryParameters, null);
assertFalse(links.isEmpty());
assertEquals("/baseuri/test?$filter=123", links.iterator().next().getHref());
}
@Test
public void testCreateLinkForCollectionEntity() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Email}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
customerState.addTransition(new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("AField").build());
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email", "smithEmailAddr", "Tel", "66778")).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(contactColl));
OProperty<?> contactProp = OProperties.collection("source_Contact", null, contactColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(2, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=johnEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
result = iterator.next();
assertEquals("/baseuri/contact()?test=smithEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
}
@Test
public void testCreateLinkForCollectionEntityTwoLevel() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Address.PostCode}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
customerState.addTransition(new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("AField").build());
// Inner collection
OCollection<?> postCodeColl = OCollections.newBuilder(null).add(createComplexObject("PostCode", "ABCD")).add(createComplexObject("PostCode", "EFGH")).build();
// Outer Collection
OProperty<?> addressCollProperty = OProperties.collection("Address", null, postCodeColl);
List<OProperty<?>> addressPropList = new ArrayList<OProperty<?>>();
addressPropList.add(addressCollProperty);
OComplexObject addressDetails = OComplexObjects.create(EdmComplexType.newBuilder().build(), addressPropList);
OCollection<?> addressColl = OCollections.newBuilder(null).add(addressDetails).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(addressColl));
OProperty<?> contactProp = OProperties.collection("source_Contact", null, addressColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(2, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=ABCD", result.getHref());
assertEquals("collection", result.getRel());
result = iterator.next();
assertEquals("/baseuri/contact()?test=EFGH", result.getHref());
assertEquals("collection", result.getRel());
}
@Test
public void testCreateLinkForCollectionEntityMultiParams() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{personName} email {Contact.Email}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
customerState.addTransition(new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("AField").build());
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email", "smithEmailAddr", "Tel", "66778")).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(contactColl));
OProperty<?> contactProp = OProperties.collection("source_Contact", null, contactColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
MultivaluedMap<String, String> pathParameters = new MultivaluedMapImpl<String>();
pathParameters.add("personName", "John");
Collection<Link> links = linkGenerator.createLink(pathParameters, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(2, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=John+email+johnEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
result = iterator.next();
assertEquals("/baseuri/contact()?test=John+email+smithEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
}
@Test
public void testCreateLinkForCollectionEntityWithFieldContainingNumber() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Email8}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
customerState.addTransition(new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("AField").build());
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email8", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email8", "smithEmailAddr", "Tel", "66778")).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(contactColl));
OProperty<?> contactProp = OProperties.collection("source_Contact", null, contactColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(2, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=johnEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
result = iterator.next();
assertEquals("/baseuri/contact()?test=smithEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
}
@Test
public void testTransitionFieldLabelInParams() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Email}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
Transition transition = new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("Contact.Email").build();
customerState.addTransition(transition);
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email", "smithEmailAddr", "Tel", "66778")).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(contactColl));
OProperty<?> contactProp = OProperties.collection("customer_Contact", null, contactColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(2, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=johnEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
assertEquals("customer_Contact(0).Email", result.getSourceField());
result = iterator.next();
assertEquals("/baseuri/contact()?test=smithEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
assertEquals("customer_Contact(1).Email", result.getSourceField());
}
@Test
public void testTransitionFieldLabelParentInParams() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Email}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
Transition transition = new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("Contact.Tel").build();
customerState.addTransition(transition);
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email", "smithEmailAddr", "Tel", "66778")).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(contactColl));
OProperty<?> contactProp = OProperties.collection("customer_Contact", null, contactColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(2, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=johnEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
assertEquals("customer_Contact(0).Tel", result.getSourceField());
result = iterator.next();
assertEquals("/baseuri/contact()?test=smithEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
assertEquals("customer_Contact(1).Tel", result.getSourceField());
}
@Test
public void testTransitionFieldLabelParentInParamsMissingOneFieldLabel() {
Link result = null;
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Email}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
Transition transition = new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("Contact.Tel").build();
customerState.addTransition(transition);
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email", "smithEmailAddr")).build();
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(contactColl));
OProperty<?> contactProp = OProperties.collection("customer_Contact", null, contactColl);
List<OProperty<?>> contactPropList = new ArrayList<OProperty<?>>();
contactPropList.add(contactProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), contactPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
Iterator<Link> iterator = links.iterator();
assertEquals(1, links.size());
result = iterator.next();
assertEquals("/baseuri/contact()?test=johnEmailAddr", result.getHref());
assertEquals("collection", result.getRel());
assertEquals("customer_Contact(0).Tel", result.getSourceField());
}
@Test
public void testTransitionFieldLabelNotInParams() {
Map<String, String> uriParameters = new HashMap<String, String>();
uriParameters.put("test", "{Contact.Email}");
CollectionResourceState customerState = new CollectionResourceState("customer", "customer", new ArrayList<Action>(), "/customer()", null, null);
CollectionResourceState contactState = new CollectionResourceState("contact", "contact", new ArrayList<Action>(), "/contact()", null, null);
Transition transition = new Transition.Builder().method("GET").target(contactState).uriParameters(uriParameters).flags(Transition.FOR_EACH).sourceField("Customer.Name").build();
customerState.addTransition(transition);
OCollection<?> contactColl = OCollections.newBuilder(null).add(createComplexObject("Email", "johnEmailAddr", "Tel", "12345")).add(createComplexObject("Email", "smithEmailAddr", "Tel", "66778")).add(createComplexObject("Email", "peterEmailAddr", "Tel", "24680")).build();
OCollection<?> customerColl = OCollections.newBuilder(null).add(createComplexObject("Name", "Paul")).add(createComplexObject("Name", "Andrew")).add(createComplexObject("Name", "Jon")).build();
Map<String, OCollection<?>> collectionMap = new HashMap<String, OCollection<?>>();
collectionMap.put("source_Contact", contactColl);
collectionMap.put("source_Customer", customerColl);
ResourceStateMachine engine = new ResourceStateMachine(customerState, getOEntityTransformer(collectionMap));
OProperty<?> contactProp = OProperties.collection("customer_Contact", null, contactColl);
OProperty<?> customerProp = OProperties.collection("customer_Customer", null, contactColl);
List<OProperty<?>> entityPropList = new ArrayList<OProperty<?>>();
entityPropList.add(contactProp);
entityPropList.add(customerProp);
OEntity entity = OEntities.createRequest(EdmEntitySet.newBuilder().build(), entityPropList, null);
Transition t = customerState.getTransitions().get(0);
LinkGenerator linkGenerator = new LinkGeneratorImpl(engine, t, null);
Collection<Link> links = linkGenerator.createLink(null, null, entity);
assertEquals(3, links.size());
ArrayList<Link> genertedLinks = (ArrayList<Link>) links;
assertEquals("/baseuri/contact()?test=johnEmailAddr", genertedLinks.get(0).getHref());
assertEquals("collection", genertedLinks.get(0).getRel());
assertEquals("customer_Customer(0).Name", genertedLinks.get(0).getSourceField());
assertEquals("/baseuri/contact()?test=smithEmailAddr", genertedLinks.get(1).getHref());
assertEquals("collection", genertedLinks.get(1).getRel());
assertEquals("customer_Customer(1).Name", genertedLinks.get(1).getSourceField());
assertEquals("/baseuri/contact()?test=peterEmailAddr", genertedLinks.get(2).getHref());
assertEquals("collection", genertedLinks.get(2).getRel());
assertEquals("customer_Customer(2).Name", genertedLinks.get(2).getSourceField());
}
private OComplexObject createComplexObject(String... values) {
List<OProperty<?>> propertyList = new ArrayList<OProperty<?>>();
for (int i = 0; i < values.length; i += 2) {
OProperty<String> property = OProperties.string(values[i], values[i + 1]);
propertyList.add(property);
}
OComplexObject complexObj = OComplexObjects.create(EdmComplexType.newBuilder().build(), propertyList);
return complexObj;
}
private Transformer getOEntityTransformer(OCollection<?> collection) {
Map<String, Object> entityProperties = new HashMap<String, Object>();
entityProperties.put("source_Contact", collection);
Transformer transformerMock = mock(Transformer.class);
when(transformerMock.transform(anyObject())).thenReturn(entityProperties);
return transformerMock;
}
private Transformer getOEntityTransformer(Map<String, OCollection<?>> collectionMap) {
Map<String, Object> entityProperties = new HashMap<String, Object>();
for (Map.Entry<String, OCollection<?>> entry : collectionMap.entrySet()) {
entityProperties.put(entry.getKey(), entry.getValue());
}
Transformer transformerMock = mock(Transformer.class);
when(transformerMock.transform(anyObject())).thenReturn(entityProperties);
return transformerMock;
}
private ResourceState mockTarget(String path) {
ResourceState target = mock(ResourceState.class);
when(target.getPath()).thenReturn(path);
when(target.getRel()).thenReturn("collection");
return target;
}
private DynamicResourceState mockDynamicTarget(String path) {
DynamicResourceState target = mock(DynamicResourceState.class);
when(target.getPath()).thenReturn(path);
return target;
}
public static class TestNote {
String noteId;
public TestNote(String noteId) {
this.noteId = noteId;
}
public String getNoteId() {
return noteId;
}
}
private ResourceState mockTarget(String path, String entityName, String name, String rel) {
ResourceState target = mockTarget(path);
when(target.getEntityName()).thenReturn(entityName);
when(target.getName()).thenReturn(name);
when(target.getRel()).thenReturn(rel);
return target;
}
private void sortLinkCollection(List<Link> links) {
Collections.sort(links, new Comparator<Link>() {
@Override
public int compare(Link link1, Link link2) {
int val = link1.getHref().compareTo(link2.getHref());
return val == 0 ? link1.getSourceField().compareTo(link2.getSourceField()) : val;
}
});
}
}