CI / ci (push) Successful in 8m4s
Co-authored-by: orchestrator-agent <20+orchestrator-agent@code.cubecraftcreations.com>
70 lines
2.0 KiB
Go
70 lines
2.0 KiB
Go
package server
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"code.cubecraftlabs.com/Maniacs_Mansion/Meal-Quest/internal/household"
|
|
)
|
|
|
|
// GET /home answers the Home screen in its JSON shape; newTestHome's
|
|
// household (America/New_York) has no plan, no suggestions, no Supply run
|
|
// and no notifications.
|
|
func TestGetHome(t *testing.T) {
|
|
t.Parallel()
|
|
h := newTestRouter(t, "dev")
|
|
loc, err := time.LoadLocation("America/New_York")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// want is the answer at instant now; the request is read between two
|
|
// instants, so it matches the answer at one of them.
|
|
want := func(now time.Time) string {
|
|
week := household.WeekStart(household.Today(now, loc))
|
|
label, err := household.WeekLabel(week)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body, err := json.Marshal(map[string]any{
|
|
"dateLabel": now.In(loc).Format("Monday, Jan 2"),
|
|
"tonight": nil,
|
|
"sideQuestCount": 0,
|
|
"shoppingList": map[string]any{"weekStart": week.String(), "label": label, "ready": false, "sentToChatAt": nil},
|
|
"recentUpdates": map[string]any{"unread": false},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return string(body)
|
|
}
|
|
before := time.Now()
|
|
rec, _ := serve(t, h, signedIn(http.MethodGet, "/api/v1/home", nil))
|
|
after := time.Now()
|
|
if rec.Code != http.StatusOK {
|
|
t.Fatalf("GET /api/v1/home = %d: %s", rec.Code, rec.Body)
|
|
}
|
|
var got any
|
|
if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
canonical, err := json.Marshal(got)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(canonical) != want(before) && string(canonical) != want(after) {
|
|
t.Errorf("GET /api/v1/home = %s, want %s", canonical, want(after))
|
|
}
|
|
}
|
|
|
|
func TestGetHomeNeedsSession(t *testing.T) {
|
|
t.Parallel()
|
|
rec := httptest.NewRecorder()
|
|
newTestRouter(t, "dev").ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/api/v1/home", nil))
|
|
if rec.Code != http.StatusUnauthorized {
|
|
t.Errorf("GET /api/v1/home without a session = %d, want 401", rec.Code)
|
|
}
|
|
}
|