package httpapi_test import ( "fmt" "net/http" "testing" "git.yeij.top/AskaEth/Scoreboard/server/internal/httpapi" ) // 单位增删改必须写 change_log,否则 broadcastChanges 推空、大屏单位名不刷新。 func TestTeamWritesWriteChangeLogAndBroadcast(t *testing.T) { fake := &fakeRealtime{} env := newTestEnvWith(t, func(o *httpapi.Options) { o.Realtime = fake }) fake.db = env.ev env.createUser("recorder", "recorder-pass", "recorder") client, _ := env.client() env.login(client, "recorder", "recorder-pass") status, env2 := env.do(client, http.MethodPost, "/api/teams", map[string]any{ "code": "C", "name": "第三分公司", "active": true, }, true) if status != http.StatusOK || !env2.OK { t.Fatalf("建单位应 200,得到 %d %+v", status, env2.Error) } if got := changeLogCount(t, env, "teams", "upsert"); got != 1 { t.Fatalf("建单位应写 1 条 teams change_log,得到 %d", got) } created := decodeData[map[string]any](t, env2) teamID := int64(created["id"].(float64)) found := false for _, ch := range fake.firstBatch(t) { if ch.Entity == "teams" && ch.Action == "upsert" && ch.ID == teamID { found = true } } if !found { t.Fatalf("建单位后应广播 teams 变更") } if status, env2 = env.do(client, http.MethodDelete, fmt.Sprintf("/api/teams/%d", teamID), nil, true); status != http.StatusOK { t.Fatalf("删单位应 200,得到 %d %+v", status, env2.Error) } if got := changeLogCount(t, env, "teams", "void"); got != 1 { t.Fatalf("删单位应写 1 条 teams void 变更,得到 %d", got) } } // 项目、组别、通道的写操作同样要推 change_log,大屏才会刷新。 func TestEventWritesWriteChangeLog(t *testing.T) { env := newTestEnv(t) ids := env.seed(t) env.createUser("recorder", "recorder-pass", "recorder") client, _ := env.client() env.login(client, "recorder", "recorder-pass") status, env2 := env.do(client, http.MethodPost, "/api/events", map[string]any{ "sportId": ids.sport, "code": "M400", "name": "400米跑", "eventType": "individual", "resultType": "time", "compare": "asc", "scored": true, }, true) if status != http.StatusOK || !env2.OK { t.Fatalf("建项目应 200,得到 %d %+v", status, env2.Error) } if got := changeLogCount(t, env, "events", "upsert"); got != 1 { t.Fatalf("建项目应写 1 条 events change_log,得到 %d", got) } created := decodeData[map[string]any](t, env2) eventID := int64(created["id"].(float64)) status, env2 = env.do(client, http.MethodPut, fmt.Sprintf("/api/events/%d/categories", eventID), map[string]any{ "categories": []map[string]any{{"name": "男子", "multiplier": 1}}, }, true) if status != http.StatusOK || !env2.OK { t.Fatalf("替换组别应 200,得到 %d %+v", status, env2.Error) } if got := changeLogCount(t, env, "events", "upsert"); got != 2 { t.Fatalf("替换组别应再写 1 条 events change_log,得到 %d", got) } if status, env2 = env.do(client, http.MethodDelete, fmt.Sprintf("/api/events/%d", eventID), nil, true); status != http.StatusOK { t.Fatalf("删项目应 200,得到 %d %+v", status, env2.Error) } if got := changeLogCount(t, env, "events", "void"); got != 1 { t.Fatalf("删项目应写 1 条 events void 变更,得到 %d", got) } }