package controllers import ( "os" "testing" "doormile/constants" "doormile/models" ) func intPtr(v int) *int { return &v } func TestNextActionForConsignment(t *testing.T) { cases := []struct { name string status string want string }{ { // The whole point of request 27: a hub-routed parcel sits on Created // while it is being carried to a base, and the app must be able to // rebuild that leg from server state after a restart. name: "collected and routed to a base means carry it there", status: constants.ConsignmentCreated, want: constants.NextActionInwardAtHub, }, { name: "collected hyperlocal parcel waits for start-delivery", status: constants.ConsignmentCollectedByMiler, want: constants.NextActionStartDelivery, }, { name: "out for delivery means deliver", status: constants.ConsignmentOutForDelivery, want: constants.NextActionDeliver, }, { name: "already handed in at a base leaves the rider nothing to do", status: constants.ConsignmentInwardedAtHub, want: constants.NextActionHandedToHub, }, { name: "delivered is past this rider's leg", status: constants.ConsignmentDelivered, want: constants.NextActionNone, }, { name: "in transit between bases is not a rider action", status: constants.ConsignmentInTransit, want: constants.NextActionNone, }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { if got := nextActionForConsignment(tc.status); got != tc.want { t.Errorf("nextActionForConsignment(%q) = %q, want %q", tc.status, got, tc.want) } }) } } func TestDerivePickupSourceType(t *testing.T) { cases := []struct { name string booking models.PickupBooking want string }{ { name: "a stored type always wins", booking: models.PickupBooking{Pickupsourcetype: constants.PickupSourceStore, Tenantlocationid: intPtr(7)}, want: constants.PickupSourceStore, }, { name: "a booking naming a base is a base pickup", booking: models.PickupBooking{Pickuphubid: intPtr(1)}, want: constants.PickupSourceHub, }, { name: "a booking naming a client site is a merchant pickup", booking: models.PickupBooking{Tenantlocationid: intPtr(7)}, want: constants.PickupSourceMerchant, }, { // The case the whole column exists for: a front-door pickup has no // location id, and "customer" must be a value rather than a blank. name: "a booking naming no location at all is a customer door", booking: models.PickupBooking{Pickupaddress: "12 Race Course Road"}, want: constants.PickupSourceCustomer, }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { if got := derivePickupSourceType(&tc.booking); got != tc.want { t.Errorf("derivePickupSourceType() = %q, want %q", got, tc.want) } }) } } func TestRenderBaseCarriesAllSixFields(t *testing.T) { // Five of six leaves a rider unable to get there: the id keys the handover, // the name is the heading, address and pincode are read at the gate, and the // coordinates are the only thing that can drive Navigate. hub := models.Hub{ Hubid: 1, Hubname: "Coimbatore Hub", Address: "14 Avinashi Road, Peelamedu, Coimbatore", Pincode: "641004", Latitude: 11.0272, Longitude: 76.9905, } got := renderBase(&hub) for _, field := range []string{"id", "name", "address", "pincode", "latitude", "longitude"} { if _, ok := got[field]; !ok { t.Errorf("renderBase() is missing %q", field) } } if len(got) != 6 { t.Errorf("renderBase() returned %d fields, want exactly 6: %v", len(got), got) } if renderBase(nil) != nil { t.Error("renderBase(nil) should be nil, so an unresolved base is absent rather than empty") } } func TestHubHandoverEnabled(t *testing.T) { // Default OFF matters operationally: turning it on before a rider-app build // that can hand a parcel over would strand every intercity parcel on Created // with no button to advance it. t.Setenv("MILER_HUB_HANDOVER_ENABLED", "") os.Unsetenv("MILER_HUB_HANDOVER_ENABLED") if hubHandoverEnabled() { t.Error("hub handover must default to off when the env var is unset") } t.Setenv("MILER_HUB_HANDOVER_ENABLED", "TRUE") if !hubHandoverEnabled() { t.Error("hub handover should be on for TRUE, matching the case-insensitive read used elsewhere") } t.Setenv("MILER_HUB_HANDOVER_ENABLED", "1") if hubHandoverEnabled() { t.Error(`only "true" turns the flow on — "1" must not`) } }