package com.temenos.interaction.media.odata.xml.edmx; /* * #%L * interaction-media-odata-xml * %% * 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.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.MediaType; import org.custommonkey.xmlunit.XMLAssert; import org.junit.Test; import org.odata4j.core.ImmutableList; import org.odata4j.edm.EdmAssociation; import org.odata4j.edm.EdmAssociationEnd; import org.odata4j.edm.EdmAssociationSet; import org.odata4j.edm.EdmAssociationSetEnd; import org.odata4j.edm.EdmDataServices; import org.odata4j.edm.EdmEntityContainer; import org.odata4j.edm.EdmEntitySet; import org.odata4j.edm.EdmEntityType; import org.odata4j.edm.EdmMultiplicity; import org.odata4j.edm.EdmNavigationProperty; import org.odata4j.edm.EdmProperty; import org.odata4j.edm.EdmSchema; import org.odata4j.edm.EdmSimpleType; import com.temenos.interaction.core.resource.MetaDataResource; public class TestEdmxMetaDataWriter { public final static String NAMESPACE = "MyNamespace"; public final static String EXPECTED_FLIGHT_EDMX = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"http://schemas.microsoft.com/ado/2007/06/edmx\" xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">" + "<edmx:DataServices m:DataServiceVersion=\"1.0\">" + "<Schema xmlns=\"http://schemas.microsoft.com/ado/2006/04/edm\" Namespace=\"MyNamespace\">" + "<EntityType Name=\"Flight\">" + "<Key><PropertyRef Name=\"MyId\"></PropertyRef></Key>" + "<Property Name=\"MyId\" Type=\"Edm.String\" Nullable=\"false\"></Property>" + "</EntityType>" + "<EntityContainer Name=\"MyEntityContainer\" m:IsDefaultEntityContainer=\"true\">" + "<EntitySet Name=\"Flights\" EntityType=\"MyNamespace.Flight\"></EntitySet>" + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; @SuppressWarnings("unchecked") @Test public void testWriteMetadataResource() throws Exception { MetaDataResource<EdmDataServices> mr = mock(MetaDataResource.class); EdmDataServices mockEDS = createMockFlightEdmDataServices(); //Mock MetadataResource when(mr.getMetadata()).thenReturn(mockEDS); //Serialize metadata resource EdmxMetaDataProvider p = new EdmxMetaDataProvider(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); p.writeTo(mr, MetaDataResource.class, EdmDataServices.class, null, MediaType.APPLICATION_XML_TYPE, null, bos); String responseString = new String(bos.toByteArray(), "UTF-8"); XMLAssert.assertXMLEqual(EXPECTED_FLIGHT_EDMX, responseString); } @SuppressWarnings("unchecked") @Test public void testWriteMetadataResourceGenericEntity() throws Exception { MetaDataResource<EdmDataServices> mr = mock(MetaDataResource.class); EdmDataServices mockEDS = createMockFlightEdmDataServices(); //Mock MetadataResource when(mr.getMetadata()).thenReturn(mockEDS); //Wrap entity resource into a JAX-RS GenericEntity instance GenericEntity<MetaDataResource<EdmDataServices>> ge = new GenericEntity<MetaDataResource<EdmDataServices>>(mr) {}; //Serialize metadata resource EdmxMetaDataProvider p = new EdmxMetaDataProvider(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); p.writeTo(ge.getEntity(), ge.getRawType(), ge.getType(), null, MediaType.APPLICATION_XML_TYPE, null, bos); String responseString = new String(bos.toByteArray(), "UTF-8"); XMLAssert.assertXMLEqual(EXPECTED_FLIGHT_EDMX, responseString); } @SuppressWarnings("unchecked") @Test public void testManyToManyNavProperty() throws Exception { MetaDataResource<EdmDataServices> mr = mock(MetaDataResource.class); EdmDataServices mockEDS = createMockAirportFlightsEdmDataServices(); //Mock MetadataResource when(mr.getMetadata()).thenReturn(mockEDS); //Serialize metadata resource EdmxMetaDataProvider p = new EdmxMetaDataProvider(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); p.writeTo(mr, MetaDataResource.class, EdmDataServices.class, null, MediaType.APPLICATION_XML_TYPE, null, bos); String expectedXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"http://schemas.microsoft.com/ado/2007/06/edmx\" xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">" + "<edmx:DataServices m:DataServiceVersion=\"1.0\">" + "<Schema xmlns=\"http://schemas.microsoft.com/ado/2006/04/edm\" Namespace=\"MyNamespace\">" + "<EntityType Name=\"Airport\">" + "<Key><PropertyRef Name=\"MyId\"></PropertyRef></Key><Property Name=\"MyId\" Type=\"Edm.String\" Nullable=\"false\"></Property>" + "<NavigationProperty Name=\"Flights\" Relationship=\"MyNamespace.Airport_Flights\" FromRole=\"Airport_Flights_Source\" ToRole=\"Airport_Flights_Target\"></NavigationProperty>" + "</EntityType>" + "<EntityType Name=\"Flight\"><Key><PropertyRef Name=\"MyId\"></PropertyRef></Key><Property Name=\"MyId\" Type=\"Edm.String\" Nullable=\"false\"></Property></EntityType>" + "<Association Name=\"Airport_Flights\"><End Role=\"Airport_Flights_Source\" Type=\"MyNamespace.Airport\" Multiplicity=\"*\"></End><End Role=\"Airport_Flights_Target\" Type=\"MyNamespace.Flight\" Multiplicity=\"*\"></End></Association>" + "<EntityContainer Name=\"MyEntityContainer\" m:IsDefaultEntityContainer=\"true\">" + "<EntitySet Name=\"Airports\" EntityType=\"MyNamespace.Airport\"></EntitySet>" + "<EntitySet Name=\"Flights\" EntityType=\"MyNamespace.Flight\"></EntitySet>" + "<AssociationSet Name=\"Airport_Flights\" Association=\"MyNamespace.Airport_Flights\">" + "<End Role=\"Airport_Flights_Source\" EntitySet=\"Airports\"></End>" + "<End Role=\"Airport_Flights_Target\" EntitySet=\"Flights\"></End>" + "</AssociationSet>"+ "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; String responseString = new String(bos.toByteArray(), "UTF-8"); XMLAssert.assertXMLEqual(expectedXML, responseString); } private EdmDataServices createMockFlightEdmDataServices() { EdmDataServices mockEDS = mock(EdmDataServices.class); //Mock EdmDataServices List<String> keys = new ArrayList<String>(); keys.add("MyId"); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); EdmProperty.Builder ep = EdmProperty.newBuilder("MyId").setType(EdmSimpleType.STRING).setNullable(false); properties.add(ep); EdmEntityType.Builder flightEntityType = EdmEntityType.newBuilder().setNamespace(NAMESPACE).setAlias("MyAlias").setName("Flight").addKeys(keys).addProperties(properties); List<EdmEntityType.Builder> entityTypeList = new ArrayList<EdmEntityType.Builder>(); entityTypeList.add(flightEntityType); // Entity Sets EdmEntitySet.Builder eesFlights = EdmEntitySet.newBuilder().setName("Flights").setEntityType(flightEntityType); List<EdmEntitySet.Builder> mockEntitySets = new ArrayList<EdmEntitySet.Builder>(); mockEntitySets.add(eesFlights); // Container EdmEntityContainer.Builder eec = EdmEntityContainer.newBuilder().setName("MyEntityContainer").setIsDefault(true) .addEntitySets(mockEntitySets); List<EdmEntityContainer.Builder> mockEntityContainers = new ArrayList<EdmEntityContainer.Builder>(); mockEntityContainers.add(eec); // Schema EdmSchema.Builder es = EdmSchema.newBuilder().setNamespace("MyNamespace").setAlias("MyAlias").addEntityTypes(entityTypeList).addEntityContainers(mockEntityContainers); List<EdmSchema> mockSchemas = new ArrayList<EdmSchema>(); mockSchemas.add(es.build()); when(mockEDS.getSchemas()).thenReturn(ImmutableList.copyOf(mockSchemas)); return mockEDS; } private EdmDataServices createMockAirportFlightsEdmDataServices() { EdmDataServices mockEDS = mock(EdmDataServices.class); //Mock EdmDataServices // Entity Types List<String> keys = new ArrayList<String>(); keys.add("MyId"); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); EdmProperty.Builder ep = EdmProperty.newBuilder("MyId").setType(EdmSimpleType.STRING).setNullable(false); properties.add(ep); EdmEntityType.Builder airportEntityType = EdmEntityType.newBuilder() .setNamespace(NAMESPACE) .setAlias("MyAlias") .setName("Airport") .addKeys(keys) .addProperties(properties); EdmEntityType.Builder flightEntityType = EdmEntityType.newBuilder().setNamespace(NAMESPACE).setAlias("MyAlias").setName("Flight").addKeys(keys).addProperties(properties); List<EdmEntityType.Builder> entityTypeList = new ArrayList<EdmEntityType.Builder>(); entityTypeList.add(airportEntityType); entityTypeList.add(flightEntityType); // Associations EdmAssociationEnd.Builder aEnd = EdmAssociationEnd.newBuilder() .setRole("Airport_Flights_Source") .setType(airportEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociationEnd.Builder fend = EdmAssociationEnd.newBuilder() .setRole("Airport_Flights_Target") .setType(flightEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder afAssociation = EdmAssociation.newBuilder() .setNamespace(NAMESPACE) .setName("Airport_Flights") .setEnds(aEnd, fend); List<EdmAssociation.Builder> mockAssociations = new ArrayList<EdmAssociation.Builder>(); mockAssociations.add(afAssociation); // Navigation Properties airportEntityType.addNavigationProperties(EdmNavigationProperty .newBuilder("Flights") .setRelationship(afAssociation) .setFromTo(aEnd, fend)); // Entity Sets EdmEntitySet.Builder eesAirports = EdmEntitySet.newBuilder().setName("Airports").setEntityType(airportEntityType); EdmEntitySet.Builder eesAirportFlights = EdmEntitySet.newBuilder().setName("Flights").setEntityType(flightEntityType); List<EdmEntitySet.Builder> mockEntitySets = new ArrayList<EdmEntitySet.Builder>(); mockEntitySets.add(eesAirports); mockEntitySets.add(eesAirportFlights); // AssociationSet EdmAssociationSetEnd.Builder asEnd = EdmAssociationSetEnd.newBuilder().setRole(aEnd).setEntitySet(eesAirports); EdmAssociationSetEnd.Builder fsEnd = EdmAssociationSetEnd.newBuilder().setRole(fend).setEntitySet(eesAirportFlights); EdmAssociationSet.Builder afAssociationSet = EdmAssociationSet.newBuilder() .setName("Airport_Flights") .setAssociation(afAssociation) .setEnds(asEnd, fsEnd); List<EdmAssociationSet.Builder> mockAssociationSets = new ArrayList<EdmAssociationSet.Builder>(); mockAssociationSets.add(afAssociationSet); // Container EdmEntityContainer.Builder eec = EdmEntityContainer.newBuilder().setName("MyEntityContainer").setIsDefault(true) .addEntitySets(mockEntitySets) .addAssociationSets(mockAssociationSets); List<EdmEntityContainer.Builder> mockEntityContainers = new ArrayList<EdmEntityContainer.Builder>(); mockEntityContainers.add(eec); // Schema EdmSchema.Builder es = EdmSchema.newBuilder().setNamespace(NAMESPACE).setAlias("MyAlias") .addEntityTypes(entityTypeList) .addAssociations(mockAssociations) .addEntityContainers(mockEntityContainers); List<EdmSchema> mockSchemas = new ArrayList<EdmSchema>(); mockSchemas.add(es.build()); when(mockEDS.getSchemas()).thenReturn(ImmutableList.copyOf(mockSchemas)); return mockEDS; } }