func TestTrackTrackCargo(t *testing.T) { var ( cargos = repository.NewInMemcargo() handlingEvents = repository.NewInMemHandlingEvent() service = NewService(cargos, handlingEvents) ) c := cargo.New("TEST", cargo.RouteSpecification{ Origin: "SESTO", Destination: "FIHEL", ArrivalDeadline: time.Date(2005, 12, 4, 0, 0, 0, 0, time.UTC), }) cargos.Store(c) ctx := context.Background() logger := log.NewLogfmtLogger(ioutil.Discard) h := MakeHandler(ctx, service, logger) req, _ := http.NewRequest("GET", "http://example.com/tracking/v1/cargos/TEST", nil) rec := httptest.NewRecorder() h.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Errorf("rec.Code = %d; want = %d", rec.Code, http.StatusOK) } if content := rec.Header().Get("Content-Type"); content != "application/json; charset=utf-8" { t.Errorf("Content-Type = %q; want = %q", content, "application/json; charset=utf-8") } var response trackCargoResponse if err := json.NewDecoder(rec.Body).Decode(&response); err != nil { t.Error(err) } if response.Err != nil { t.Errorf("response.Err = %q", response.Err) } var eta time.Time want := Cargo{ TrackingID: "TEST", Origin: "SESTO", Destination: "FIHEL", ArrivalDeadline: time.Date(2005, 12, 4, 0, 0, 0, 0, time.UTC), ETA: eta.In(time.UTC), StatusText: "Not received", NextExpectedActivity: "There are currently no expected activities for this cargo.", Events: nil, } if !reflect.DeepEqual(want, *response.Cargo) { t.Errorf("response.Cargo = %#v; want = %#v", response.Cargo, want) } }
func storeTestData(r cargo.Repository) { test1 := cargo.New("FTL456", cargo.RouteSpecification{ Origin: location.AUMEL, Destination: location.SESTO, ArrivalDeadline: time.Now().AddDate(0, 0, 7), }) if err := r.Store(test1); err != nil { panic(err) } test2 := cargo.New("ABC123", cargo.RouteSpecification{ Origin: location.SESTO, Destination: location.CNHKG, ArrivalDeadline: time.Now().AddDate(0, 0, 14), }) if err := r.Store(test2); err != nil { panic(err) } }
func (s *service) BookNewCargo(origin, destination location.UNLocode, arrivalDeadline time.Time) (cargo.TrackingID, error) { if origin == "" || destination == "" || arrivalDeadline.IsZero() { return "", ErrInvalidArgument } id := cargo.NextTrackingID() rs := cargo.RouteSpecification{ Origin: origin, Destination: destination, ArrivalDeadline: arrivalDeadline, } c := cargo.New(id, rs) if err := s.cargos.Store(c); err != nil { return "", err } return c.TrackingID, nil }
func (s *S) TestInspectUnloadedCargo(c *C) { var ( cargoRepository = repository.NewInMemcargo() handlingEventRepository = repository.NewInMemHandlingEvent() cargoEventHandler = &stubEventHandler{make([]interface{}, 0)} inspectionService = &service{ cargoRepository: cargoRepository, handlingEventRepository: handlingEventRepository, cargoEventHandler: cargoEventHandler, } ) trackingID := cargo.TrackingID("ABC123") unloadedCargo := cargo.New(trackingID, cargo.RouteSpecification{ Origin: location.SESTO, Destination: location.CNHKG, }) var voyageNumber voyage.Number = "001A" unloadedCargo.AssignToRoute(cargo.Itinerary{Legs: []cargo.Leg{ {VoyageNumber: voyageNumber, LoadLocation: location.SESTO, UnloadLocation: location.AUMEL}, {VoyageNumber: voyageNumber, LoadLocation: location.AUMEL, UnloadLocation: location.CNHKG}, }}) cargoRepository.Store(unloadedCargo) storeEvent(handlingEventRepository, trackingID, voyageNumber, cargo.Receive, location.SESTO) storeEvent(handlingEventRepository, trackingID, voyageNumber, cargo.Load, location.SESTO) storeEvent(handlingEventRepository, trackingID, voyageNumber, cargo.Unload, location.AUMEL) storeEvent(handlingEventRepository, trackingID, voyageNumber, cargo.Load, location.AUMEL) storeEvent(handlingEventRepository, trackingID, voyageNumber, cargo.Unload, location.CNHKG) c.Check(len(cargoEventHandler.handledEvents), Equals, 0) inspectionService.InspectCargo(trackingID) c.Check(len(cargoEventHandler.handledEvents), Equals, 1) }