| 1 | package serve |
| 2 | |
| 3 | import ( |
| 4 | "encoding/json" |
| 5 | "fmt" |
| 6 | "net/http" |
| 7 | "reasonix/internal/session" |
| 8 | "testing" |
| 9 | ) |
| 10 | |
| 11 | func TestHistoryOutlineHTTPIdentityAndFixedWindow(t *testing.T) { |
| 12 | server, _ := newWindowTestServer(t) |
| 13 | var window session.HistoryWindowPage |
| 14 | getWindow(t, server, "anchor=newest&limit=1", &window) |
| 15 | response, err := http.Get(server.URL + "/session-history/outline?sessionId=canonical&startTurn=1&limit=2") |
| 16 | if err != nil { |
| 17 | t.Fatal(err) |
| 18 | } |
| 19 | defer response.Body.Close() |
| 20 | var page session.HistoryOutlinePage |
| 21 | if err := json.NewDecoder(response.Body).Decode(&page); err != nil || response.StatusCode != http.StatusOK || page.Status != "ready" || page.TotalTurns != 8 || len(page.Entries) != 2 || page.Entries[0].MessageID != "m1" { |
| 22 | t.Fatalf("outline: %+v %v", page, err) |
| 23 | } |
| 24 | getWindow(t, server, fmt.Sprintf("anchor=message&messageId=m1&direction=newer&limit=1&generation=%s&snapshotSequence=%d", page.Generation, page.SnapshotSequence), &window) |
| 25 | if window.Status != "ready" || window.SnapshotSequence != page.SnapshotSequence || window.Messages[0].MessageID != "m1" { |
| 26 | t.Fatalf("window: %+v", window) |
| 27 | } |
| 28 | getWindow(t, server, "anchor=message&messageId=m1&generation=wrong", &window) |
| 29 | if window.Status != "stale_cursor" { |
| 30 | t.Fatalf("lost generation: %+v", window) |
| 31 | } |
| 32 | for _, query := range []string{"sessionId=other", "sessionId=canonical&limit=bad", "sessionId=canonical&snapshotSequence=-1"} { |
| 33 | response, err := http.Get(server.URL + "/session-history/outline?" + query) |
| 34 | if err != nil { |
| 35 | t.Fatal(err) |
| 36 | } |
| 37 | response.Body.Close() |
| 38 | if response.StatusCode == http.StatusOK { |
| 39 | t.Fatalf("accepted invalid request: %s", query) |
| 40 | } |
| 41 | } |
| 42 | } |
| 43 |