package api import ( "io" "log/slog" "net/http" "net/http/httptest" "strings" "testing" ) func TestUpdateNotificationEmail_Rejects(t *testing.T) { // No pool: every case is refused before the database is reached. h := &handlers{logger: slog.New(slog.NewTextHandler(io.Discard, nil))} for name, tc := range map[string]struct { body string code string mentions string }{ "an hour past 23": {body: `{"summary_hour":24,"batch_window_minutes":60}`, code: "invalid_setting", mentions: "summary_hour"}, "a window under 15m": {body: `{"summary_hour":9,"batch_window_minutes":5}`, code: "invalid_setting", mentions: "batch_window_minutes"}, "a body missing both": {body: `{}`, code: "invalid_setting", mentions: "batch_window_minutes"}, "malformed JSON": {body: `{"summary_hour":`, code: "invalid_body"}, } { rec := httptest.NewRecorder() h.handleUpdateNotificationEmail(rec, httptest.NewRequest( http.MethodPut, "/api/admin/notification-email", strings.NewReader(tc.body))) body := rec.Body.String() if rec.Code != http.StatusBadRequest || !strings.Contains(body, `"`+tc.code+`"`) || !strings.Contains(body, tc.mentions) { t.Errorf("%s: status %d body %s; want 400 %s mentioning %q", name, rec.Code, body, tc.code, tc.mentions) } } }