Files
pangolin/server/internal/notices/handler_test.go
T

65 lines
1.7 KiB
Go

package notices
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/wangjia/pangolin/server/internal/codes"
)
func TestListAndMarkRead(t *testing.T) {
db := openDB(t)
seedU(t, db, 1, "u1")
st := NewStore(db)
_, _ = st.InsertBroadcast(context.Background(), "news", "hello", "hello", "", "", "", time.Now().UTC(), nil)
h := NewHandler(st)
req := httptest.NewRequest(http.MethodGet, "/v1/notices", nil)
req = req.WithContext(context.WithValue(req.Context(), codes.CtxKeyUserID, int64(1)))
w := httptest.NewRecorder()
h.List(w, req)
if w.Code != 200 {
t.Fatalf("code=%d body=%s", w.Code, w.Body)
}
var got struct {
Notices []map[string]any `json:"notices"`
UnreadCount int `json:"unread_count"`
}
_ = json.Unmarshal(w.Body.Bytes(), &got)
if len(got.Notices) != 1 || got.UnreadCount != 1 {
t.Fatalf("got %+v", got)
}
if got.Notices[0]["type"] != "news" || got.Notices[0]["unread"] != true {
t.Fatalf("字段契约: %+v", got.Notices[0])
}
// read → 再查 unread 清零
req2 := httptest.NewRequest(http.MethodPost, "/v1/notices/read", nil)
req2 = req2.WithContext(context.WithValue(req2.Context(), codes.CtxKeyUserID, int64(1)))
w2 := httptest.NewRecorder()
h.MarkRead(w2, req2)
if w2.Code != 200 {
t.Fatalf("read code=%d", w2.Code)
}
w3 := httptest.NewRecorder()
h.List(w3, req)
_ = json.Unmarshal(w3.Body.Bytes(), &got)
if got.UnreadCount != 0 {
t.Fatalf("read 后 unread_count=%d", got.UnreadCount)
}
}
func TestListUnauthorized(t *testing.T) {
db := openDB(t)
h := NewHandler(NewStore(db))
w := httptest.NewRecorder()
h.List(w, httptest.NewRequest(http.MethodGet, "/v1/notices", nil))
if w.Code != http.StatusUnauthorized {
t.Fatalf("code=%d want 401", w.Code)
}
}