package server import ( "net/http" "testing" "time" "g.fc.run/misc/byre/internal/api" ) func TestCheckResponse(t *testing.T) { question := api.InboxItem{ Id: "q1", Kind: api.Question, State: api.Open, Payload: map[string]any{"options": []any{"red", "blue"}}, } report := api.InboxItem{Id: "r1", Kind: api.Report, State: api.Open, Payload: map[string]any{}} failure := api.InboxItem{Id: "e1", Kind: api.SessionError, State: api.Open, Payload: map[string]any{}} closed := question closed.State = api.Answered str := func(s string) *string { return &s } future := time.Now().Add(time.Hour) past := time.Now().Add(-time.Hour) cases := []struct { name string item api.InboxItem create api.InboxResponseCreate state api.InboxState status int }{ {"option", question, api.InboxResponseCreate{Type: api.Option, Option: str("blue")}, api.Answered, 0}, {"option with text", question, api.InboxResponseCreate{Type: api.Option, Option: str("red"), Text: str("but darker")}, "", http.StatusBadRequest}, {"unknown option", question, api.InboxResponseCreate{Type: api.Option, Option: str("green")}, "", http.StatusBadRequest}, {"missing option", question, api.InboxResponseCreate{Type: api.Option}, "", http.StatusBadRequest}, {"other", question, api.InboxResponseCreate{Type: api.Other, Text: str("green")}, api.Answered, 0}, {"empty other", question, api.InboxResponseCreate{Type: api.Other, Text: str(" ")}, "", http.StatusBadRequest}, {"other on error", failure, api.InboxResponseCreate{Type: api.Other, Text: str("retry")}, api.Answered, 0}, {"other on report", report, api.InboxResponseCreate{Type: api.Other, Text: str("stop")}, "", http.StatusBadRequest}, {"snooze", question, api.InboxResponseCreate{Type: api.Snooze, SnoozeUntil: &future}, api.Open, 0}, {"snooze into past", question, api.InboxResponseCreate{Type: api.Snooze, SnoozeUntil: &past}, "", http.StatusBadRequest}, {"dismiss report", report, api.InboxResponseCreate{Type: api.Dismiss}, api.Dismissed, 0}, {"dismiss question", question, api.InboxResponseCreate{Type: api.Dismiss}, "", http.StatusBadRequest}, {"option on report", report, api.InboxResponseCreate{Type: api.Option, Option: str("red")}, "", http.StatusBadRequest}, {"already answered", closed, api.InboxResponseCreate{Type: api.Option, Option: str("red")}, "", http.StatusConflict}, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { state, herr := checkResponse(c.item, c.create) if c.status != 0 { if herr == nil || herr.status != c.status { t.Fatalf("want status %d, got %+v", c.status, herr) } return } if herr != nil { t.Fatalf("unexpected error %v", herr.err) } if state != c.state { t.Fatalf("want state %s, got %s", c.state, state) } }) } }