package usage import ( "context" "net/http" "net/http/httptest" "testing" "github.com/wangjia/pangolin/server/internal/codes" ) // authedRequest builds a request whose context carries an authenticated user id, // mirroring what auth.RequireAuth installs upstream. func authedRequest(method, target string, userID int64) *http.Request { r := httptest.NewRequest(method, target, nil) if userID != 0 { r = r.WithContext(context.WithValue(r.Context(), codes.CtxKeyUserID, userID)) } return r } // The DeviceUsageHandler gates on auth, method and the days query param before // ever touching the service/DB — these branches are verified DB-free. func TestDeviceUsageHandler_Guards(t *testing.T) { h := NewDeviceUsageHandler(NewService(nil, nil, nil, 0)) cases := []struct { name string req *http.Request status int }{ {"no auth → 401", authedRequest(http.MethodGet, "/v1/usage/devices", 0), http.StatusUnauthorized}, {"wrong method → 405", authedRequest(http.MethodPost, "/v1/usage/devices", 7), http.StatusMethodNotAllowed}, {"days out of range → 400", authedRequest(http.MethodGet, "/v1/usage/devices?days=999", 7), http.StatusBadRequest}, {"days non-numeric → 400", authedRequest(http.MethodGet, "/v1/usage/devices?days=abc", 7), http.StatusBadRequest}, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { w := httptest.NewRecorder() h.ServeHTTP(w, c.req) if w.Code != c.status { t.Errorf("status=%d, want %d (body=%s)", w.Code, c.status, w.Body.String()) } }) } }