150 lines
4.4 KiB
Go
150 lines
4.4 KiB
Go
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`)
|
|
}
|
|
}
|