oficina / calendar Public

Clone
git clone https://amadan.net/oficina/calendar

Plain git — no account needed to clone.

Download

Download this file

1package calendar
2
3import (
4 "bytes"
5 "encoding/json"
6 "net/http/httptest"
7 "testing"
8)
9
10func TestNativePreservesStatusAndGapWallTime(t *testing.T) {
11 f := newHomeRouterFixture(t)
12 f.local(t)
13 p, err := f.app.store.EnsurePersonSetup(t.Context(), "alice@example.test")
14 if err != nil {
15 t.Fatal(err)
16 }
17 cal, err := f.app.store.DefaultCalendarID(t.Context(), p.ID)
18 if err != nil {
19 t.Fatal(err)
20 }
21 for _, status := range []string{StatusCancelled, StatusTentative} {
22 _, err = f.app.store.CreateEvent(t.Context(), p.ID, EventInput{CalendarID: cal, Title: "Gap meeting", TZ: "Europe/Dublin", StartLocal: "2026-03-29T01:30", EndLocal: "2026-03-29T03:30", Kind: KindMeeting, Status: status})
23 if err != nil {
24 t.Fatal(err)
25 }
26 }
27 w := f.do("GET", "/api/native/events?from=2026-03-29&to=2026-03-30", "")
28 var got struct{ Events []nativeEvent }
29 if w.Code != 200 || json.Unmarshal(w.Body.Bytes(), &got) != nil || len(got.Events) != 2 {
30 t.Fatal("missing status events")
31 }
32 statuses := map[string]bool{}
33 for _, ev := range got.Events {
34 statuses[ev.Status] = true
35 if ev.StartLocal != "2026-03-29T01:30" || ev.EndLocal != "2026-03-29T03:30" {
36 t.Fatal("gap wall time changed")
37 }
38 }
39 if !statuses[StatusCancelled] || !statuses[StatusTentative] {
40 t.Fatal("native API dropped cancellation or tentative state")
41 }
42}
43
44func TestNativeSavedEventSurvivesReminderFailure(t *testing.T) {
45 f := newHomeRouterFixture(t)
46 f.local(t)
47 p, err := f.app.store.EnsurePersonSetup(t.Context(), "alice@example.test")
48 if err != nil {
49 t.Fatal(err)
50 }
51 cal, err := f.app.store.DefaultCalendarID(t.Context(), p.ID)
52 if err != nil {
53 t.Fatal(err)
54 }
55 if _, err = f.app.db.Writer().Exec("CREATE TRIGGER native_reminder_failure BEFORE INSERT ON reminders BEGIN SELECT RAISE(FAIL, 'fixture failure'); END"); err != nil {
56 t.Fatal(err)
57 }
58 body, _ := json.Marshal(nativeEvent{CalendarID: cal, Title: "Saved event", TZ: "Europe/Dublin", StartLocal: "2026-10-24T09:00", EndLocal: "2026-10-24T10:00"})
59 r := httptest.NewRequest("POST", homeTestOrigin+"/api/native/events", bytes.NewReader(body))
60 r.Header.Set("Origin", homeTestOrigin)
61 r.Header.Set("Content-Type", "application/json")
62 for _, c := range f.cookies {
63 r.AddCookie(c)
64 }
65 w := httptest.NewRecorder()
66 f.app.mux.ServeHTTP(w, r)
67 var got struct {
68 ID int64
69 Warning string
70 }
71 if w.Code != 200 || json.Unmarshal(w.Body.Bytes(), &got) != nil || got.ID == 0 || got.Warning == "" {
72 t.Fatal("saved event was not confirmed separately from failed reminder", w.Code)
73 }
74 ev, err := f.app.store.Event(t.Context(), p.ID, got.ID)
75 if err != nil || ev.Title != "Saved event" {
76 t.Fatal("confirmed event was not stored")
77 }
78}
79