package domain import ( "testing" "time" "calllinesystem/server/internal/model" ) func TestETAUsesIntervalForEveryPersonAhead(t *testing.T) { result, err := CalculateETA(ETAInput{ PeopleAhead: 9, IntervalPerPerson: 90 * time.Second, Running: true, }) if err != nil || !result.Available { t.Fatalf("got %#v, %v", result, err) } if result.EstimateMinutes != 15 || result.MinMinutes != 15 || result.MaxMinutes != 15 { t.Fatalf("unexpected result %#v", result) } } func TestETAExcludesCurrentParty(t *testing.T) { result, err := CalculateETA(ETAInput{PeopleAhead: 0, IntervalPerPerson: 90 * time.Second, Running: true}) if err != nil || !result.Available || result.EstimateMinutes != 0 { t.Fatalf("got %#v, %v", result, err) } } func TestSelectTicketsForCall(t *testing.T) { tickets := []model.QueueTicket{ {ID: "one", PartySize: 3}, {ID: "two", PartySize: 4}, {ID: "three", PartySize: 2}, } byTicket, people, err := SelectTicketsForCall(tickets, model.CallModeTicket, 2) if err != nil || len(byTicket) != 2 || people != 7 { t.Fatalf("ticket selection = %#v, %d, %v", byTicket, people, err) } byPeople, people, err := SelectTicketsForCall(tickets, model.CallModePeople, 5) if err != nil || len(byPeople) != 1 || people != 3 || byPeople[0].ID != "one" { t.Fatalf("people selection = %#v, %d, %v", byPeople, people, err) } if _, _, err := SelectTicketsForCall(tickets, model.CallModePeople, 2); err != ErrFirstTicketExceedsPeopleTarget { t.Fatalf("expected first-ticket overflow, got %v", err) } } func TestETAUnavailableWhenPaused(t *testing.T) { result, err := CalculateETA(ETAInput{Running: false}) if err != nil || result.Available || result.Reason != "queue_not_running" { t.Fatalf("got %#v, %v", result, err) } } func TestDisplayExperiencedPeopleUsesConfiguredStartUntilActualCountExceedsIt(t *testing.T) { tests := []struct { start int actual int64 want int64 }{ {start: 0, actual: 0, want: 0}, {start: 20, actual: 0, want: 20}, {start: 20, actual: 19, want: 20}, {start: 20, actual: 20, want: 20}, {start: 20, actual: 21, want: 21}, {start: -1, actual: -3, want: 0}, } for _, test := range tests { if got := DisplayExperiencedPeople(test.start, test.actual); got != test.want { t.Fatalf("DisplayExperiencedPeople(%d, %d) = %d, want %d", test.start, test.actual, got, test.want) } } } func TestTicketRules(t *testing.T) { if !CanTransitionTicket(model.TicketCalled, model.TicketArrived) || !CanTransitionTicket(model.TicketArrived, model.TicketCompleted) { t.Fatal("expected normal transitions") } if CanTransitionTicket(model.TicketMissed, model.TicketWaiting) || CanTransitionTicket(model.TicketArrived, model.TicketMissed) { t.Fatal("missed tickets must be reissued at the tail") } number, err := DisplayNumber("", 12) if err != nil || number != "00012" { t.Fatalf("got %q, %v", number, err) } }