package se.citerus.dddsample.infrastructure.routing; import static org.assertj.core.api.Assertions.assertThat; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static se.citerus.dddsample.domain.model.location.SampleLocations.GOTHENBURG; import static se.citerus.dddsample.domain.model.location.SampleLocations.HELSINKI; import static se.citerus.dddsample.domain.model.location.SampleLocations.HONGKONG; import static se.citerus.dddsample.domain.model.location.SampleLocations.STOCKHOLM; import static se.citerus.dddsample.domain.model.location.SampleLocations.TOKYO; import java.util.Arrays; import java.util.Date; import java.util.List; import org.junit.Before; import org.junit.Test; import com.pathfinder.api.GraphTraversalService; import com.pathfinder.internal.GraphDAOStub; import com.pathfinder.internal.GraphTraversalServiceImpl; import se.citerus.dddsample.domain.model.cargo.Cargo; import se.citerus.dddsample.domain.model.cargo.Itinerary; import se.citerus.dddsample.domain.model.cargo.Leg; import se.citerus.dddsample.domain.model.cargo.RouteSpecification; import se.citerus.dddsample.domain.model.cargo.TrackingId; import se.citerus.dddsample.domain.model.location.Location; import se.citerus.dddsample.domain.model.location.LocationRepository; import se.citerus.dddsample.domain.model.voyage.SampleVoyages; import se.citerus.dddsample.domain.model.voyage.VoyageNumber; import se.citerus.dddsample.domain.model.voyage.VoyageRepository; import se.citerus.dddsample.infrastructure.persistence.inmemory.LocationRepositoryInMem; public class ExternalRoutingServiceTest { private ExternalRoutingService externalRoutingService; private VoyageRepository voyageRepository; @Before public void setUp() { externalRoutingService = new ExternalRoutingService(); LocationRepository locationRepository = new LocationRepositoryInMem(); externalRoutingService.setLocationRepository(locationRepository); voyageRepository = createMock(VoyageRepository.class); externalRoutingService.setVoyageRepository(voyageRepository); GraphTraversalService graphTraversalService = new GraphTraversalServiceImpl(new GraphDAOStub() { public List listLocations() { return Arrays.asList(TOKYO.unLocode().idString(), STOCKHOLM.unLocode().idString(), GOTHENBURG.unLocode().idString()); } public void storeCarrierMovementId(String cmId, String from, String to) { } }); externalRoutingService.setGraphTraversalService(graphTraversalService); } // TODO this test belongs in com.pathfinder @Test public void testCalculatePossibleRoutes() { TrackingId trackingId = new TrackingId("ABC"); RouteSpecification routeSpecification = new RouteSpecification(HONGKONG, HELSINKI, new Date()); Cargo cargo = new Cargo(trackingId, routeSpecification); expect(voyageRepository.find(isA(VoyageNumber.class))).andStubReturn(SampleVoyages.CM002); replay(voyageRepository); List candidates = externalRoutingService.fetchRoutesForSpecification(routeSpecification); assertThat(candidates).isNotNull(); for (Itinerary itinerary : candidates) { List legs = itinerary.legs(); assertThat(legs).isNotNull(); assertThat(legs.isEmpty()).isFalse(); // Cargo origin and start of first leg should match assertThat(legs.get(0).loadLocation()).isEqualTo(cargo.origin()); // Cargo final destination and last leg stop should match Location lastLegStop = legs.get(legs.size() - 1).unloadLocation(); assertThat(lastLegStop).isEqualTo(cargo.routeSpecification().destination()); for (int i = 0; i < legs.size() - 1; i++) { // Assert that all legs are connected assertThat(legs.get(i + 1).loadLocation()).isEqualTo(legs.get(i).unloadLocation()); } } verify(voyageRepository); } }