68 lines
2.7 KiB
Go
68 lines
2.7 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|