PageRenderTime 26ms CodeModel.GetById 34ms RepoModel.GetById 7ms app.codeStats 0ms

/src/test/java/net/java/cargotracker/application/BookingServiceTest.java

https://gitlab.com/sebastian.toepfer/cargotracker-ddd
Java | 285 lines | 238 code | 24 blank | 23 comment | 0 complexity | eb38e636910b8d7e87ccd0b36d9cf4e6 MD5 | raw file
  1. package net.java.cargotracker.application;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertTrue;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.GregorianCalendar;
  8. import java.util.List;
  9. import java.util.Random;
  10. import javax.inject.Inject;
  11. import javax.persistence.EntityManager;
  12. import javax.persistence.PersistenceContext;
  13. import net.java.cargotracker.application.internal.DefaultBookingService;
  14. import net.java.cargotracker.application.util.DateUtil;
  15. import net.java.cargotracker.application.util.JsonMoxyConfigurationContextResolver;
  16. import net.java.cargotracker.domain.model.cargo.Cargo;
  17. import net.java.cargotracker.domain.model.cargo.CargoRepository;
  18. import net.java.cargotracker.domain.model.cargo.Delivery;
  19. import net.java.cargotracker.domain.model.cargo.HandlingActivity;
  20. import net.java.cargotracker.domain.model.cargo.Itinerary;
  21. import net.java.cargotracker.domain.model.cargo.Leg;
  22. import net.java.cargotracker.domain.model.cargo.RouteSpecification;
  23. import net.java.cargotracker.domain.model.cargo.RoutingStatus;
  24. import net.java.cargotracker.domain.model.cargo.TrackingId;
  25. import net.java.cargotracker.domain.model.cargo.TransportStatus;
  26. import net.java.cargotracker.domain.model.handling.CannotCreateHandlingEventException;
  27. import net.java.cargotracker.domain.model.handling.HandlingEvent;
  28. import net.java.cargotracker.domain.model.handling.HandlingEventFactory;
  29. import net.java.cargotracker.domain.model.handling.HandlingEventRepository;
  30. import net.java.cargotracker.domain.model.handling.HandlingHistory;
  31. import net.java.cargotracker.domain.model.handling.UnknownCargoException;
  32. import net.java.cargotracker.domain.model.handling.UnknownLocationException;
  33. import net.java.cargotracker.domain.model.handling.UnknownVoyageException;
  34. import net.java.cargotracker.domain.model.location.Location;
  35. import net.java.cargotracker.domain.model.location.LocationRepository;
  36. import net.java.cargotracker.domain.model.location.SampleLocations;
  37. import net.java.cargotracker.domain.model.location.UnLocode;
  38. import net.java.cargotracker.domain.model.voyage.CarrierMovement;
  39. import net.java.cargotracker.domain.model.voyage.SampleVoyages;
  40. import net.java.cargotracker.domain.model.voyage.Schedule;
  41. import net.java.cargotracker.domain.model.voyage.Voyage;
  42. import net.java.cargotracker.domain.model.voyage.VoyageNumber;
  43. import net.java.cargotracker.domain.model.voyage.VoyageRepository;
  44. import net.java.cargotracker.domain.service.RoutingService;
  45. import net.java.cargotracker.domain.shared.AbstractSpecification;
  46. import net.java.cargotracker.domain.shared.AndSpecification;
  47. import net.java.cargotracker.domain.shared.DomainObjectUtils;
  48. import net.java.cargotracker.domain.shared.NotSpecification;
  49. import net.java.cargotracker.domain.shared.OrSpecification;
  50. import net.java.cargotracker.domain.shared.Specification;
  51. import net.java.cargotracker.infrastructure.persistence.jpa.JpaCargoRepository;
  52. import net.java.cargotracker.infrastructure.persistence.jpa.JpaHandlingEventRepository;
  53. import net.java.cargotracker.infrastructure.persistence.jpa.JpaLocationRepository;
  54. import net.java.cargotracker.infrastructure.persistence.jpa.JpaVoyageRepository;
  55. import net.java.cargotracker.infrastructure.routing.ExternalRoutingService;
  56. import net.java.pathfinder.api.GraphTraversalService;
  57. import net.java.pathfinder.api.TransitEdge;
  58. import net.java.pathfinder.api.TransitPath;
  59. import net.java.pathfinder.internal.GraphDao;
  60. import org.apache.commons.lang3.time.DateUtils;
  61. import org.jboss.arquillian.container.test.api.Deployment;
  62. import org.jboss.arquillian.junit.Arquillian;
  63. import org.jboss.arquillian.junit.InSequence;
  64. import org.jboss.shrinkwrap.api.ShrinkWrap;
  65. import org.jboss.shrinkwrap.api.spec.WebArchive;
  66. import org.jboss.shrinkwrap.resolver.api.maven.Maven;
  67. import org.junit.Test;
  68. import org.junit.runner.RunWith;
  69. /**
  70. * Application layer integration test covering a number of otherwise fairly
  71. * trivial components that largely do not warrant their own tests.
  72. *
  73. * @author Reza
  74. */
  75. @RunWith(Arquillian.class)
  76. public class BookingServiceTest {
  77. @Inject
  78. private BookingService bookingService;
  79. @PersistenceContext
  80. private EntityManager entityManager;
  81. private static TrackingId trackingId;
  82. private static List<Itinerary> candidates;
  83. private static Date deadline;
  84. private static Itinerary assigned;
  85. @Deployment
  86. public static WebArchive createDeployment() {
  87. return ShrinkWrap
  88. .create(WebArchive.class, "cargo-tracker-test.war")
  89. // Application layer component directly under test.
  90. .addClass(BookingService.class)
  91. // Domain layer components.
  92. .addClass(TrackingId.class)
  93. .addClass(UnLocode.class)
  94. .addClass(Itinerary.class)
  95. .addClass(Leg.class)
  96. .addClass(Voyage.class)
  97. .addClass(VoyageNumber.class)
  98. .addClass(Schedule.class)
  99. .addClass(CarrierMovement.class)
  100. .addClass(Location.class)
  101. .addClass(HandlingEvent.class)
  102. .addClass(Cargo.class)
  103. .addClass(RouteSpecification.class)
  104. .addClass(AbstractSpecification.class)
  105. .addClass(Specification.class)
  106. .addClass(AndSpecification.class)
  107. .addClass(OrSpecification.class)
  108. .addClass(NotSpecification.class)
  109. .addClass(Delivery.class)
  110. .addClass(TransportStatus.class)
  111. .addClass(HandlingActivity.class)
  112. .addClass(RoutingStatus.class)
  113. .addClass(HandlingHistory.class)
  114. .addClass(DomainObjectUtils.class)
  115. .addClass(CargoRepository.class)
  116. .addClass(LocationRepository.class)
  117. .addClass(VoyageRepository.class)
  118. .addClass(HandlingEventRepository.class)
  119. .addClass(HandlingEventFactory.class)
  120. .addClass(CannotCreateHandlingEventException.class)
  121. .addClass(UnknownCargoException.class)
  122. .addClass(UnknownVoyageException.class)
  123. .addClass(UnknownLocationException.class)
  124. .addClass(RoutingService.class)
  125. // Application layer components
  126. .addClass(DefaultBookingService.class)
  127. // Infrastructure layer components.
  128. .addClass(JpaCargoRepository.class)
  129. .addClass(JpaVoyageRepository.class)
  130. .addClass(JpaHandlingEventRepository.class)
  131. .addClass(JpaLocationRepository.class)
  132. .addClass(ExternalRoutingService.class)
  133. .addClass(JsonMoxyConfigurationContextResolver.class)
  134. // Interface components
  135. .addClass(TransitPath.class)
  136. .addClass(TransitEdge.class)
  137. // Third-party system simulator
  138. .addClass(GraphTraversalService.class)
  139. .addClass(GraphDao.class)
  140. // Sample data.
  141. .addClass(BookingServiceTestDataGenerator.class)
  142. .addClass(SampleLocations.class)
  143. .addClass(SampleVoyages.class)
  144. .addClass(DateUtil.class)
  145. .addClass(BookingServiceTestRestConfiguration.class)
  146. .addAsResource("META-INF/persistence.xml",
  147. "META-INF/persistence.xml")
  148. .addAsWebInfResource("test-web.xml", "web.xml")
  149. .addAsWebInfResource("test-ejb-jar.xml", "ejb-jar.xml")
  150. .addAsLibraries(
  151. Maven.resolver().loadPomFromFile("pom.xml")
  152. .resolve("org.apache.commons:commons-lang3")
  153. .withTransitivity().asFile());
  154. }
  155. @Test
  156. @InSequence(1)
  157. public void testRegisterNew() {
  158. // try {
  159. // GlassFish glassfish = GlassFishRuntime.bootstrap().newGlassFish();
  160. // glassfish.start();
  161. // File war = new File("c:\\temp\\cargo-tracker-test.war");
  162. // Deployer deployer = glassfish.getDeployer();
  163. // deployer.deploy(war);
  164. // } catch (GlassFishException ex) {
  165. // Logger.getLogger(BookingServiceTest.class.getName()).log(Level.SEVERE,
  166. // null, ex);
  167. // }
  168. UnLocode fromUnlocode = new UnLocode("USCHI");
  169. UnLocode toUnlocode = new UnLocode("SESTO");
  170. deadline = new Date();
  171. GregorianCalendar calendar = new GregorianCalendar();
  172. calendar.setTime(deadline);
  173. calendar.add(Calendar.MONTH, 6); // Six months ahead.
  174. deadline.setTime(calendar.getTime().getTime());
  175. trackingId = bookingService.bookNewCargo(fromUnlocode, toUnlocode,
  176. deadline);
  177. Cargo cargo = entityManager
  178. .createNamedQuery("Cargo.findByTrackingId", Cargo.class)
  179. .setParameter("trackingId", trackingId).getSingleResult();
  180. assertEquals(SampleLocations.CHICAGO, cargo.getOrigin());
  181. assertEquals(SampleLocations.STOCKHOLM, cargo.getRouteSpecification()
  182. .getDestination());
  183. assertTrue(DateUtils.isSameDay(deadline, cargo.getRouteSpecification()
  184. .getArrivalDeadline()));
  185. assertEquals(TransportStatus.NOT_RECEIVED, cargo.getDelivery()
  186. .getTransportStatus());
  187. assertEquals(Location.UNKNOWN, cargo.getDelivery()
  188. .getLastKnownLocation());
  189. assertEquals(Voyage.NONE, cargo.getDelivery().getCurrentVoyage());
  190. assertFalse(cargo.getDelivery().isMisdirected());
  191. assertEquals(Delivery.ETA_UNKOWN, cargo.getDelivery()
  192. .getEstimatedTimeOfArrival());
  193. assertEquals(Delivery.NO_ACTIVITY, cargo.getDelivery()
  194. .getNextExpectedActivity());
  195. assertFalse(cargo.getDelivery().isUnloadedAtDestination());
  196. assertEquals(RoutingStatus.NOT_ROUTED, cargo.getDelivery()
  197. .getRoutingStatus());
  198. assertEquals(Itinerary.EMPTY_ITINERARY, cargo.getItinerary());
  199. }
  200. @Test
  201. @InSequence(2)
  202. public void testRouteCandidates() {
  203. candidates = bookingService.requestPossibleRoutesForCargo(trackingId);
  204. assertFalse(candidates.isEmpty());
  205. }
  206. @Test
  207. @InSequence(3)
  208. public void testAssignRoute() {
  209. assigned = candidates.get(new Random().nextInt(candidates
  210. .size()));
  211. bookingService.assignCargoToRoute(assigned, trackingId);
  212. Cargo cargo = entityManager
  213. .createNamedQuery("Cargo.findByTrackingId", Cargo.class)
  214. .setParameter("trackingId", trackingId).getSingleResult();
  215. assertEquals(assigned, cargo.getItinerary());
  216. assertEquals(TransportStatus.NOT_RECEIVED, cargo.getDelivery()
  217. .getTransportStatus());
  218. assertEquals(Location.UNKNOWN, cargo.getDelivery()
  219. .getLastKnownLocation());
  220. assertEquals(Voyage.NONE, cargo.getDelivery().getCurrentVoyage());
  221. assertFalse(cargo.getDelivery().isMisdirected());
  222. assertTrue(cargo.getDelivery().getEstimatedTimeOfArrival()
  223. .before(deadline));
  224. assertEquals(HandlingEvent.Type.RECEIVE, cargo.getDelivery()
  225. .getNextExpectedActivity().getType());
  226. assertEquals(SampleLocations.CHICAGO, cargo.getDelivery()
  227. .getNextExpectedActivity().getLocation());
  228. assertEquals(null, cargo.getDelivery().getNextExpectedActivity()
  229. .getVoyage());
  230. assertFalse(cargo.getDelivery().isUnloadedAtDestination());
  231. assertEquals(RoutingStatus.ROUTED, cargo.getDelivery()
  232. .getRoutingStatus());
  233. }
  234. @Test
  235. @InSequence(4)
  236. public void testChangeDestination() {
  237. bookingService.changeDestination(trackingId, new UnLocode("FIHEL"));
  238. Cargo cargo = entityManager
  239. .createNamedQuery("Cargo.findByTrackingId", Cargo.class)
  240. .setParameter("trackingId", trackingId).getSingleResult();
  241. assertEquals(SampleLocations.CHICAGO, cargo.getOrigin());
  242. assertEquals(SampleLocations.HELSINKI, cargo.getRouteSpecification()
  243. .getDestination());
  244. assertTrue(DateUtils.isSameDay(deadline, cargo.getRouteSpecification()
  245. .getArrivalDeadline()));
  246. assertEquals(assigned, cargo.getItinerary());
  247. assertEquals(TransportStatus.NOT_RECEIVED, cargo.getDelivery()
  248. .getTransportStatus());
  249. assertEquals(Location.UNKNOWN, cargo.getDelivery()
  250. .getLastKnownLocation());
  251. assertEquals(Voyage.NONE, cargo.getDelivery().getCurrentVoyage());
  252. assertFalse(cargo.getDelivery().isMisdirected());
  253. assertEquals(Delivery.ETA_UNKOWN, cargo.getDelivery()
  254. .getEstimatedTimeOfArrival());
  255. assertEquals(Delivery.NO_ACTIVITY, cargo.getDelivery()
  256. .getNextExpectedActivity());
  257. assertFalse(cargo.getDelivery().isUnloadedAtDestination());
  258. assertEquals(RoutingStatus.MISROUTED, cargo.getDelivery()
  259. .getRoutingStatus());
  260. }
  261. }