Files
cms-server/api/event/event_handler_test.go
Asai Neko 210b8b08ce
All checks were successful
Server Check Build (NixCN CMS) TeamCity build finished
Add test for all components
Signed-off-by: Asai Neko <sugar@sne.moe>
2026-03-26 18:19:26 +08:00

230 lines
6.6 KiB
Go

package event
import (
"bytes"
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/spf13/viper"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"nixcn-cms/data"
"nixcn-cms/internal/authtoken"
"nixcn-cms/service/service_event"
"nixcn-cms/testutil"
)
func init() { gin.SetMode(gin.TestMode) }
func issueToken(t *testing.T, userId uuid.UUID) string {
t.Helper()
tok := &authtoken.Token{Application: viper.GetString("server.application")}
access, _, err := tok.IssueTokens(context.Background(), testutil.TestClientID, userId)
require.NoError(t, err)
return access
}
func newEventRouter(t *testing.T) *gin.Engine {
t.Helper()
r := gin.New()
ApiHandler(r.Group("/event"))
return r
}
func postJSON(t *testing.T, r *gin.Engine, path string, body any) *httptest.ResponseRecorder {
t.Helper()
b, _ := json.Marshal(body)
req := httptest.NewRequest(http.MethodPost, path, bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func getRequest(t *testing.T, r *gin.Engine, path string) *httptest.ResponseRecorder {
t.Helper()
req := httptest.NewRequest(http.MethodGet, path, nil)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func patchJSON(t *testing.T, r *gin.Engine, path string, body any) *httptest.ResponseRecorder {
t.Helper()
b, _ := json.Marshal(body)
req := httptest.NewRequest(http.MethodPatch, path, bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func deleteReq(t *testing.T, r *gin.Engine, path string, body any) *httptest.ResponseRecorder {
t.Helper()
b, _ := json.Marshal(body)
req := httptest.NewRequest(http.MethodDelete, path, bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func postWithBearer(t *testing.T, r *gin.Engine, path, token string, body any) *httptest.ResponseRecorder {
t.Helper()
b, _ := json.Marshal(body)
req := httptest.NewRequest(http.MethodPost, path, bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func getWithBearer(t *testing.T, r *gin.Engine, path, token string) *httptest.ResponseRecorder {
t.Helper()
req := httptest.NewRequest(http.MethodGet, path, nil)
req.Header.Set("Authorization", "Bearer "+token)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func patchWithBearer(t *testing.T, r *gin.Engine, path, token string, body any) *httptest.ResponseRecorder {
t.Helper()
b, _ := json.Marshal(body)
req := httptest.NewRequest(http.MethodPatch, path, bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
func deleteWithBearer(t *testing.T, r *gin.Engine, path, token string, body any) *httptest.ResponseRecorder {
t.Helper()
b, _ := json.Marshal(body)
req := httptest.NewRequest(http.MethodDelete, path, bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
return w
}
// ---- Create ----
func TestEventCreateHandler(t *testing.T) {
testutil.SetupWithAuth(t)
user := testutil.SeedUser(t, testutil.RandomEmail(), 40)
token := issueToken(t, user.UserId)
r := newEventRouter(t)
w := postWithBearer(t, r, "/event/create", token, service_event.EventCreateData{
Type: "official",
Name: "Handler Test Event",
Subtitle: "sub",
StartTime: time.Now().Add(24 * time.Hour),
EndTime: time.Now().Add(48 * time.Hour),
Quota: 100,
Limit: 150,
})
assert.Equal(t, http.StatusOK, w.Code)
var resp map[string]any
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &resp))
data, ok := resp["data"].(map[string]any)
require.True(t, ok)
assert.NotEmpty(t, data["event_id"])
}
func TestEventCreateHandlerMissingAuth(t *testing.T) {
testutil.Setup(t)
r := newEventRouter(t)
w := postJSON(t, r, "/event/create", map[string]any{"type": "party"})
assert.Equal(t, http.StatusUnauthorized, w.Code)
}
func TestEventCreateHandlerInvalidJSON(t *testing.T) {
testutil.SetupWithAuth(t)
owner := testutil.SeedUser(t, testutil.RandomEmail(), 40)
token := issueToken(t, owner.UserId)
r := newEventRouter(t)
req := httptest.NewRequest(http.MethodPost, "/event/create", bytes.NewBufferString("{bad json"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusBadRequest, w.Code)
}
// ---- Info ----
func TestEventInfoHandlerNotFound(t *testing.T) {
testutil.SetupWithAuth(t)
user := testutil.SeedUser(t, testutil.RandomEmail(), 10)
token := issueToken(t, user.UserId)
r := newEventRouter(t)
w := getWithBearer(t, r, "/event/info?event_id=00000000-0000-0000-0000-000000000001", token)
assert.Equal(t, http.StatusNotFound, w.Code)
}
// ---- List ----
func TestEventListHandlerRequiresOffset(t *testing.T) {
testutil.SetupWithAuth(t)
user := testutil.SeedUser(t, testutil.RandomEmail(), 30)
token := issueToken(t, user.UserId)
r := newEventRouter(t)
w := getWithBearer(t, r, "/event/list", token)
assert.Equal(t, http.StatusBadRequest, w.Code)
}
func TestEventListHandlerWithOffset(t *testing.T) {
testutil.SetupWithAuth(t)
user := testutil.SeedUser(t, testutil.RandomEmail(), 30)
token := issueToken(t, user.UserId)
r := newEventRouter(t)
w := getWithBearer(t, r, "/event/list?offset=0&limit=10", token)
assert.Equal(t, http.StatusOK, w.Code)
}
// ---- Join ----
func TestEventJoinHandlerInvalidEventId(t *testing.T) {
testutil.SetupWithAuth(t)
user := testutil.SeedUser(t, testutil.RandomEmail(), 10)
require.NoError(t, new(data.User).PatchByUserId(t.Context(), user.UserId, data.WithNickname("Joiner")))
token := issueToken(t, user.UserId)
r := newEventRouter(t)
w := postWithBearer(t, r, "/event/join", token, map[string]any{"event_id": "not-a-uuid"})
assert.Equal(t, http.StatusBadRequest, w.Code)
}
// ---- Delete ----
func TestEventDeleteHandlerNotFound(t *testing.T) {
testutil.SetupWithAuth(t)
user := testutil.SeedUser(t, testutil.RandomEmail(), 40)
token := issueToken(t, user.UserId)
r := newEventRouter(t)
nonExistentId := uuid.New().String()
w := deleteWithBearer(t, r, "/event/delete", token, map[string]any{
"event_id": nonExistentId,
})
assert.Equal(t, http.StatusNotFound, w.Code)
}