87 lines
2.8 KiB
Go
87 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|