package com.temenos.interaction.media.odata.xml.atom; /* * #%L * interaction-media-odata-xml * %% * Copyright (C) 2012 - 2014 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.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import javax.ws.rs.HttpMethod; import org.junit.Test; import org.odata4j.format.xml.XmlFormatWriter; import com.temenos.interaction.core.hypermedia.Action; import com.temenos.interaction.core.hypermedia.CollectionResourceState; import com.temenos.interaction.core.hypermedia.Link; import com.temenos.interaction.core.hypermedia.ResourceState; import com.temenos.interaction.core.hypermedia.Transition; import com.temenos.interaction.core.resource.RESTResource; public class TestODataLinkInterceptor { private AtomXMLProvider createMockProviderFundsTransfers() { AtomXMLProvider mockProviderHelper = mock(AtomXMLProvider.class); when(mockProviderHelper.getEntitySet(any(ResourceState.class))).thenReturn("FundsTransfers"); return mockProviderHelper; } private AtomXMLProvider createMockProviderCustomers() { AtomXMLProvider mockProviderHelper = mock(AtomXMLProvider.class); when(mockProviderHelper.getEntitySet(any(ResourceState.class))).thenReturn("Customers"); return mockProviderHelper; } @Test public void testNullLinkToAddAddLinkArg() { ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource resource = mock(RESTResource.class); List<Link> links = new ArrayList<Link>(); links.add(mock(Link.class)); when(resource.getLinks()).thenReturn(links); Link result = linkInterceptor.addingLink(resource, null); assertNull(result); } @Test public void testNullResourceAddLinkArg() { ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), createMockResourceState("customer", "Customer", false)); linkInterceptor.addingLink(null, new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); } @Test public void testResourceWithNullLinkAddLinkArg() { ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource resource = mock(RESTResource.class); List<Link> links = new ArrayList<Link>(); links.add(mock(Link.class)); links.add(null); links.add(mock(Link.class)); when(resource.getLinks()).thenReturn(links); Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), createMockResourceState("customer", "Customer", false)); Link link = new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET); Link result = linkInterceptor.addingLink(resource, link); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/Customer", result.getRel()); } @Test public void testNullLinkToAddAndResourceWithNullLinkAddLinkArgs() { ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource resource = mock(RESTResource.class); Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), createMockResourceState("customer", "Customer", false)); List<Link> links = new ArrayList<Link>(); Link link = new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET); links.add(link); links.add(null); links.add(mock(Link.class)); when(resource.getLinks()).thenReturn(links); Link result = linkInterceptor.addingLink(resource, null); assertNull(result); } @Test public void testLinkRelationCollectionToItem() { Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), createMockResourceState("customer", "Customer", false)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/Customer", result.getRel()); } @Test public void testLinkRelationCollectionToItemSameEntity() { Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), createMockResourceState("fundsTransfer", "FundsTransfer", false)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("self", result.getRel()); } @Test public void testLinkRelationItemToCollection() { Transition t = createMockTransition( createMockResourceState("account", "Account", false), createMockResourceState("FundsTransfers", "FundsTransfer", true)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/FundsTransfers", result.getRel()); } @Test public void testLinkRelationItemToItem() { Transition t = createMockTransition( createMockResourceState("account", "Account", false), createMockResourceState("FundsTransfers_new", "FundsTransfer", false)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/FundsTransfer", result.getRel()); } @Test public void testLinkFixedRelation() { CollectionResourceState targetState = mock(CollectionResourceState.class); when(targetState.getName()).thenReturn("FundsTransfers_new"); when(targetState.getEntityName()).thenReturn("FundsTransfer"); when(targetState.getRel()).thenReturn("http://www.temenos.com/rels/new"); Transition t = createMockTransition( createMockResourceState("account", "Account", false), targetState); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("http://www.temenos.com/rels/new", result.getRel()); } @Test /* * 'self' link rel should be added */ public void testLinkFixedRelationSelf() { ResourceState targetState = mock(ResourceState.class); when(targetState.getName()).thenReturn("FundsTransfer"); when(targetState.getEntityName()).thenReturn("FundsTransfer"); when(targetState.getRel()).thenReturn("self"); Transition t = createMockTransition( createMockResourceState("account", "Account", false), targetState); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("self", result.getRel()); } @Test /* * 'self' link rel should be added */ public void testLinkFixedRelationSelfCollection() { ResourceState targetState = mock(ResourceState.class); when(targetState.getName()).thenReturn("FundsTransfer"); when(targetState.getEntityName()).thenReturn("FundsTransfer"); when(targetState.getRel()).thenReturn("self"); Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), targetState); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("self", result.getRel()); } @Test /* * 'edit' link rel should be added */ public void testLinkFixedRelationEditCollection() { ResourceState sourceState = createMockResourceState("FundsTransfers", "FundsTransfer", true); // edit ResourceState targetStateEdit = mock(ResourceState.class); when(targetStateEdit.getName()).thenReturn("FundsTransfers_new"); when(targetStateEdit.getEntityName()).thenReturn("FundsTransfer"); when(targetStateEdit.getRel()).thenReturn("edit"); Transition editTransition = createMockTransition( sourceState, targetStateEdit); Link editLink = new Link(editTransition, editTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(editLink); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link result = linkInterceptor.addingLink(mockResource, editLink); assertEquals("edit", result.getRel()); } @Test /* * 'edit' link rel is a special case that should be treated like 'self' */ public void testLinkFixedRelationEdit() { ResourceState targetState = mock(ResourceState.class); when(targetState.getName()).thenReturn("FundsTransfers_new"); when(targetState.getEntityName()).thenReturn("FundsTransfer"); when(targetState.getRel()).thenReturn("edit"); Transition t = createMockTransition( createMockResourceState("account", "Account", false), targetState); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("edit", result.getRel()); } @Test /* * 'edit' link rel is a special case that should be treated like 'self' * Prefer 'edit' and drop the unwanted 'self' link. */ public void testLinkFixedRelationEditSelf() { ResourceState sourceState = createMockResourceState("account", "Account", false); // edit ResourceState targetStateEdit = mock(ResourceState.class); when(targetStateEdit.getName()).thenReturn("FundsTransfers_new"); when(targetStateEdit.getEntityName()).thenReturn("FundsTransfer"); when(targetStateEdit.getRel()).thenReturn("edit"); Transition editTransition = createMockTransition( sourceState, targetStateEdit); Link editLink = new Link(editTransition, editTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); // self ResourceState targetStateSelf = mock(ResourceState.class); when(targetStateSelf.getName()).thenReturn("FundsTransfer"); when(targetStateSelf.getEntityName()).thenReturn("FundsTransfer"); when(targetStateSelf.getRel()).thenReturn("self"); Transition selfTransition = createMockTransition( sourceState, targetStateSelf); Link selfLink = new Link(selfTransition, selfTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(selfLink); mockLinks.add(editLink); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultEdit = linkInterceptor.addingLink(mockResource, editLink); assertEquals("edit", resultEdit.getRel()); Link resultSelf = linkInterceptor.addingLink(mockResource, selfLink); assertNull(resultSelf); } @Test /* * 'edit' link rel is a special case that should be treated like 'self' * Prefer 'edit' and drop the unwanted 'self' link. */ public void testLinkFixedRelationEditSelfCollection() { ResourceState sourceState = createMockResourceState("FundsTransfers", "FundsTransfer", true); // edit ResourceState targetStateEdit = mock(ResourceState.class); when(targetStateEdit.getName()).thenReturn("FundsTransfers_new"); when(targetStateEdit.getEntityName()).thenReturn("FundsTransfer"); when(targetStateEdit.getRel()).thenReturn("edit"); Transition editTransition = createMockTransition( sourceState, targetStateEdit); Link editLink = new Link(editTransition, editTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); // self ResourceState targetStateSelf = mock(ResourceState.class); when(targetStateSelf.getName()).thenReturn("FundsTransfer"); when(targetStateSelf.getEntityName()).thenReturn("FundsTransfer"); when(targetStateSelf.getRel()).thenReturn("self"); Transition selfTransition = createMockTransition( sourceState, targetStateSelf); Link selfLink = new Link(selfTransition, selfTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(selfLink); mockLinks.add(editLink); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultEdit = linkInterceptor.addingLink(mockResource, editLink); assertEquals("edit", resultEdit.getRel()); Link resultSelf = linkInterceptor.addingLink(mockResource, selfLink); assertNull(resultSelf); } @Test /* * 'edit' link rel is a special case that should be treated like 'self' * Prefer 'edit' and drop the unwanted 'self' link. */ public void testLinkFixedRelationSelfEditCollection() { ResourceState sourceState = createMockResourceState("FundsTransfers", "FundsTransfer", true); // edit ResourceState targetStateEdit = mock(ResourceState.class); when(targetStateEdit.getName()).thenReturn("FundsTransfers_new"); when(targetStateEdit.getEntityName()).thenReturn("FundsTransfer"); when(targetStateEdit.getRel()).thenReturn("edit"); Transition editTransition = createMockTransition( sourceState, targetStateEdit); Link editLink = new Link(editTransition, editTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); // self ResourceState targetStateSelf = mock(ResourceState.class); when(targetStateSelf.getName()).thenReturn("FundsTransfer"); when(targetStateSelf.getEntityName()).thenReturn("FundsTransfer"); when(targetStateSelf.getRel()).thenReturn("self"); Transition selfTransition = createMockTransition( sourceState, targetStateSelf); Link selfLink = new Link(selfTransition, selfTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.GET); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(editLink); mockLinks.add(selfLink); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultEdit = linkInterceptor.addingLink(mockResource, editLink); assertEquals("edit", resultEdit.getRel()); Link resultSelf = linkInterceptor.addingLink(mockResource, selfLink); assertNull(resultSelf); } @Test /* * When two links have the same rel, id and href we should remove all but the first link */ public void testLinkRemoveDuplicates() { ResourceState sourceState = createMockResourceState("account", "Account", false); // edit ResourceState targetStateUpdate = mock(ResourceState.class); when(targetStateUpdate.getName()).thenReturn("FundsTransfers_new"); when(targetStateUpdate.getEntityName()).thenReturn("FundsTransfer"); when(targetStateUpdate.getRel()).thenReturn("edit"); when(targetStateUpdate.getId()).thenReturn("id"); Transition editTransition = createMockTransition( sourceState, targetStateUpdate); Link editLink = new Link(editTransition, editTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.POST); // edit2 ResourceState targetStateDelete = mock(ResourceState.class); when(targetStateDelete.getName()).thenReturn("FundsTransfers_delete"); when(targetStateDelete.getEntityName()).thenReturn("FundsTransfer"); when(targetStateDelete.getRel()).thenReturn("edit"); when(targetStateDelete.getId()).thenReturn("id"); Transition edit2Transition = createMockTransition( sourceState, targetStateDelete); Link edit2Link = new Link(edit2Transition, edit2Transition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.DELETE); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(editLink); mockLinks.add(edit2Link); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultEdit = linkInterceptor.addingLink(mockResource, editLink); assertEquals("edit", resultEdit.getRel()); // Because it has same rel, id and href second link should not be present. Link resultEdit2 = linkInterceptor.addingLink(mockResource, edit2Link); assertNull(resultEdit2); } @Test /* * When two links have the same rel and href but different id we should NOT remove all but the first link */ public void testLinkNoRemoveNonDuplicates() { ResourceState sourceState = createMockResourceState("account", "Account", false); // edit ResourceState targetStateUpdate = mock(ResourceState.class); when(targetStateUpdate.getName()).thenReturn("FundsTransfers_new"); when(targetStateUpdate.getEntityName()).thenReturn("FundsTransfer"); when(targetStateUpdate.getRel()).thenReturn("aRelation"); when(targetStateUpdate.getId()).thenReturn("id"); Transition editTransition = createMockTransition( sourceState, targetStateUpdate); Link editLink = new Link(editTransition, editTransition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.POST); // edit2 ResourceState targetStateDelete = mock(ResourceState.class); when(targetStateDelete.getName()).thenReturn("FundsTransfers_delete"); when(targetStateDelete.getEntityName()).thenReturn("FundsTransfer"); when(targetStateDelete.getRel()).thenReturn("aRelation"); when(targetStateDelete.getId()).thenReturn("anotherId"); Transition edit2Transition = createMockTransition( sourceState, targetStateDelete); Link edit2Link = new Link(edit2Transition, edit2Transition.getTarget().getRel(), "/FundsTransfers('123')", HttpMethod.DELETE); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(editLink); mockLinks.add(edit2Link); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultEdit = linkInterceptor.addingLink(mockResource, editLink); assertEquals("aRelation", resultEdit.getRel()); // Because it has a different id second link should be present. Link resultEdit2 = linkInterceptor.addingLink(mockResource, edit2Link); assertEquals("aRelation", resultEdit2.getRel()); } @Test /* * When two links a link with a relation, that has the same href as 'self' we don't * want to keep both */ public void testLinkSelfSharingHref() { ResourceState sourceState = createMockResourceState("customer", "Customer", true); // see ResourceState targetStateUpdate = mock(ResourceState.class); when(targetStateUpdate.getName()).thenReturn("customer_see"); when(targetStateUpdate.getEntityName()).thenReturn("Customer"); when(targetStateUpdate.getRel()).thenReturn("self"); Transition seeTransition = createMockTransition( sourceState, targetStateUpdate); Link seeLink = new Link(seeTransition, seeTransition.getTarget().getRel(), "/Customers('123')", HttpMethod.GET); // input ResourceState targetStateInput = mock(ResourceState.class); when(targetStateInput.getName()).thenReturn("customer_input"); when(targetStateInput.getEntityName()).thenReturn("Customer"); when(targetStateInput.getRel()).thenReturn("input"); Transition inputTransition = createMockTransition( sourceState, targetStateInput); Link inputLink = new Link(inputTransition, inputTransition.getTarget().getRel(), "/Customers('123')", HttpMethod.PUT); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(seeLink); mockLinks.add(inputLink); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderCustomers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultSee = linkInterceptor.addingLink(mockResource, seeLink); assertEquals("self", resultSee.getRel()); Link resultInput = linkInterceptor.addingLink(mockResource, inputLink); assertEquals("input", resultInput.getRel()); } @Test /* * In some of the OData4j tests we expect to only receive the 'self' link in this case */ public void testLinkSelfWithInitialCollectionToCollectionSameEntity() { ResourceState sourceState = createMockResourceState("customer", "Customer", true); // see ResourceState targetStateUpdate = mock(ResourceState.class); when(targetStateUpdate.getName()).thenReturn("customer_see"); when(targetStateUpdate.getEntityName()).thenReturn("Customer"); when(targetStateUpdate.getRel()).thenReturn("self"); Transition seeTransition = createMockTransition( sourceState, targetStateUpdate); Link seeLink = new Link(seeTransition, seeTransition.getTarget().getRel(), "/Customers('123')", HttpMethod.GET); // create ResourceState targetStateCreate = createMockResourceState("customer_create", "Customer", true); Transition createTransition = createMockTransition( sourceState, targetStateCreate); Link inputLink = new Link(createTransition, createTransition.getTarget().getRel(), "/Customers('123')", HttpMethod.POST); List<Link> mockLinks = new ArrayList<Link>(); mockLinks.add(seeLink); mockLinks.add(inputLink); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderCustomers()); RESTResource mockResource = mock(RESTResource.class); when(mockResource.getLinks()).thenReturn(mockLinks); Link resultSee = linkInterceptor.addingLink(mockResource, seeLink); assertEquals("self", resultSee.getRel()); Link resultInput = linkInterceptor.addingLink(mockResource, inputLink); assertNull(resultInput); // assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/Customers", resultInput.getRel()); } @Test public void testLinkRelationInitialCollectionToCollectionSameEntity() { Transition t = createMockTransition( createMockResourceState("FundsTransfers", "FundsTransfer", true), createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/FundsTransfers", result.getRel()); } @Test public void testLinkRelationCollectionToCollectionSameEntity() { Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockResourceState("FundsTransfersIHold", "FundsTransfer", true)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/FundsTransfers", result.getRel()); } @Test public void testLinkWithFieldLabelPresent() { Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockResourceState("FundsTransfersIHold", "FundsTransfer", true)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, "Account")); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/Account/FundsTransfers", result.getRel()); } @Test public void testLinkWithNullFieldLabel() { Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockResourceState("FundsTransfersIHold", "FundsTransfer", true)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, null)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/FundsTransfers", result.getRel()); } @Test public void testLinkRelCreationWithRelNotProvided() { Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockCollectionResourceStateWithRel("FundsTransfersIHold", "FundsTransfer", null)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, null)); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/FundsTransfers", result.getRel()); } @Test public void testLinkRelCreationWithRelPartiallyProvided() { String targetRel = "http://temenostech.com/ado/2007/08/TARGET"; String[] rels = new String[]{targetRel}; Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockCollectionResourceStateWithRel("FundsTransfersIHold", "FundsTransfer", rels)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, null)); assertEquals(targetRel, result.getRel()); } @Test public void testLinkRelCreationWithRelFullyProvided() { String descriptionRel = XmlFormatWriter.related + "DESCRIPTION"; String targetRel = "http://temenostech.com/ado/2007/08/TARGET"; String[] rels = new String[]{descriptionRel, targetRel}; Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockCollectionResourceStateWithRel("FundsTransfersIHold", "FundsTransfer", rels)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, null)); assertEquals(descriptionRel + " " + targetRel, result.getRel()); } @Test public void testLinkRelCreationWithRelProvidedForMultivalue() { String descriptionRel = XmlFormatWriter.related + "/DESCRIPTION"; String targetRel = "http://temenostech.com/ado/2007/08/TARGET"; String[] rels = new String[]{descriptionRel, targetRel}; Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockCollectionResourceStateWithRel("FundsTransfersIHold", "FundsTransfer", rels)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, "Account")); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/Account/FundsTransfers " + targetRel, result.getRel()); } @Test public void testLinkRelCreationWithRelNotProvidedForMultivalue() { Transition t = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockCollectionResourceStateWithRel("FundsTransfersIHold", "FundsTransfer", null)); ODataLinkInterceptor linkInterceptor = new ODataLinkInterceptor(createMockProviderFundsTransfers()); Link result = linkInterceptor.addingLink(mock(RESTResource.class), new Link(t, t.getTarget().getRel(), "/FundsTransfers()?$filter=DebitAcctNo eq '123'", HttpMethod.GET, "Account")); assertEquals("http://schemas.microsoft.com/ado/2007/08/dataservices/related/Account/FundsTransfers", result.getRel()); } @Test public void testGetODataLinkRelation() { checkODataLinkRelationRetrieval(new Link(null,null,"something",null,null,null,null,null), "test", "something"); String descriptionRel = XmlFormatWriter.related + "/DESCRIPTION"; String targetRel = "http://temenostech.com/ado/2007/08/TARGET"; //From ResourceState to CollectionResourceState - No field label Transition transitionMock = createMockTransition( createMockResourceState("FundsTransfersIAuth", "SourceFundsTransfer", true), createMockCollectionResourceStateWithRel("FundsTransfersIHold", "TargetFundsTransfer", null)); checkODataLinkRelationRetrieval(transitionMock, null, targetRel, "test", targetRel); checkODataLinkRelationRetrieval(transitionMock, null, descriptionRel, "test", descriptionRel); checkODataLinkRelationRetrieval(transitionMock, null, targetRel + " " + descriptionRel, "test", targetRel + " " + descriptionRel); checkODataLinkRelationRetrieval(transitionMock, null, "item", "test", XmlFormatWriter.related + "test"); checkODataLinkRelationRetrieval(transitionMock, null, "collection", "test", XmlFormatWriter.related + "test"); checkODataLinkRelationRetrieval(transitionMock, null, "self", "test", "self"); checkODataLinkRelationRetrieval(transitionMock, null, "", "", XmlFormatWriter.related); //From ResourceState to CollectionResourceState - field label provided checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", targetRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/test " + targetRel); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", descriptionRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/test"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", targetRel + " " + descriptionRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/test " + targetRel); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "item", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/test"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "collection", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/test"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "self", "test", "self"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "", "", XmlFormatWriter.related + "SourceFundsTransfer_sev/"); //From ResourceState to ResourceState - No field label and source same as target transitionMock = createMockTransition( createMockResourceState("FundsTransfersIAuth", "FundsTransfer", true), createMockResourceState("FundsTransfersIHold", "FundsTransfer", false)); checkODataLinkRelationRetrieval(transitionMock, null, targetRel, "test", targetRel); checkODataLinkRelationRetrieval(transitionMock, null, descriptionRel, "test", descriptionRel); checkODataLinkRelationRetrieval(transitionMock, null, targetRel + " " + descriptionRel, "test", targetRel + " " + descriptionRel); checkODataLinkRelationRetrieval(transitionMock, null, "item", "test", "self"); checkODataLinkRelationRetrieval(transitionMock, null, "collection", "test", "self"); checkODataLinkRelationRetrieval(transitionMock, null, "self", "test", "self"); //From ResourceState to ResourceState - No field label and source different from target transitionMock = createMockTransition( createMockResourceState("FundsTransfersIAuth", "SourceFundsTransfer", false), createMockResourceState("FundsTransfersIHold", "TargetFundsTransfer", false)); checkODataLinkRelationRetrieval(transitionMock, null, targetRel, "test", targetRel); checkODataLinkRelationRetrieval(transitionMock, null, descriptionRel, "test", descriptionRel); checkODataLinkRelationRetrieval(transitionMock, null, targetRel + " " + descriptionRel, "test", targetRel + " " + descriptionRel); checkODataLinkRelationRetrieval(transitionMock, null, "item", "test", XmlFormatWriter.related + "TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, null, "collection", "test", XmlFormatWriter.related + "TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, null, "self", "test", "self"); //From ResourceState to ResourceState - field label provided and source different from target transitionMock = createMockTransition( createMockResourceState("FundsTransfersIAuth", "SourceFundsTransfer", false), createMockResourceState("FundsTransfersIHold", "TargetFundsTransfer", false)); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", targetRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer " + targetRel); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", descriptionRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", targetRel + " " + descriptionRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer " + targetRel); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "item", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "collection", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "self", "test", "self"); //From ResourceState to ResourceState - field label provided using oldTemenosRel transitionMock = createMockTransition( createMockResourceState("FundsTransfersIAuth", "SourceFundsTransfer", false), createMockResourceState("FundsTransfersIHold", "TargetFundsTransfer", false)); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "http://www.temenos.com/rels/leafVal", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/leafVal http://www.temenos.com/rels/leafVal"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "http://www.temenos.com/rels/leafVal", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/leafVal http://www.temenos.com/rels/leafVal"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "http://www.temenos.com/rels/leafVal" + " " + descriptionRel, "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/leafVal http://www.temenos.com/rels/leafVal"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "item", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "collection", "test", XmlFormatWriter.related + "SourceFundsTransfer_sev/TargetFundsTransfer"); checkODataLinkRelationRetrieval(transitionMock, "SourceFundsTransfer_sev", "self", "test", "self"); } private void checkODataLinkRelationRetrieval(Transition transition, String fieldLabel, String rel, String entitySetName, String expected) { checkODataLinkRelationRetrieval(new Link(transition, rel, null, null, fieldLabel), entitySetName, expected); } private void checkODataLinkRelationRetrieval(Link link, String entitySetName, String expected) { ODataLinkInterceptor oDataLinkInterceptor = new ODataLinkInterceptor(null); String result = oDataLinkInterceptor.getODataLinkRelation(link, entitySetName); assertEquals(expected, result); } private ResourceState createMockResourceState(String name, String entityName, boolean isCollection) { ResourceState state = null; if (isCollection) { state = new CollectionResourceState(entityName, name, new ArrayList<Action>(), "/"+name); } else { state = new ResourceState(entityName, name, new ArrayList<Action>(), "/"+name); } return state; } private ResourceState createMockCollectionResourceStateWithRel(String name, String entityName, String[] rels) { ResourceState state = new CollectionResourceState(entityName, name, new ArrayList<Action>(), "/"+name, rels , null); return state; } private Transition createMockTransition(ResourceState source, ResourceState target) { Transition.Builder builder = new Transition.Builder(); builder.source(source); builder.target(target); builder.method("GET"); return builder.build(); } }