package httpapi_test import ( "encoding/json" "net" "net/http" "strings" "testing" "git.yeij.top/AskaEth/Scoreboard/server/internal/config" "git.yeij.top/AskaEth/Scoreboard/server/internal/httpapi" ) // GET /api/system/network 是给大屏控制页拼「平板能直接打开的链接」用的: // recorder 起可读,guest 与未登录一律 403(与 /api/system/about 同档——机器级信息不给匿名访客)。 func TestSystemNetworkPermission(t *testing.T) { env := newTestEnvWith(t, func(o *httpapi.Options) { o.Port = 18080 }) guest, _ := env.client() if status, env2 := env.do(guest, http.MethodGet, "/api/system/network", nil, false); status != http.StatusForbidden || env2.Error == nil || env2.Error.Code != "FORBIDDEN" { t.Fatalf("guest 读 network 应 403 FORBIDDEN,得到 %d %+v", status, env2.Error) } env.createUser("recorder", "recorder-pass", "recorder") client, _ := env.client() env.login(client, "recorder", "recorder-pass") status, env2 := env.do(client, http.MethodGet, "/api/system/network", nil, false) if status != http.StatusOK || !env2.OK { t.Fatalf("recorder 读 network 应 200,得到 %d %+v", status, env2.Error) } } // 响应形状是对前端契约:字段一个不多一个不少,port 必须是实际监听端口(测试注入 18080), // 路径字段则要与服务端真的托管着的页面一致——前端是照它拼链接的,写错了就是死链。 func TestSystemNetworkShape(t *testing.T) { env := newTestEnvWith(t, func(o *httpapi.Options) { o.Port = 18080 }) env.createUser("recorder", "recorder-pass", "recorder") client, _ := env.client() env.login(client, "recorder", "recorder-pass") status, env2 := env.do(client, http.MethodGet, "/api/system/network", nil, false) if status != http.StatusOK { t.Fatalf("读 network 应 200,得到 %d", status) } var body map[string]any if err := json.Unmarshal(env2.Data, &body); err != nil { t.Fatalf("解析 network: %v (%s)", err, env2.Data) } assertKeys(t, "network", body, []string{"port", "displayPath", "adminPath", "addresses"}) if got, ok := body["port"].(float64); !ok || int(got) != 18080 { t.Fatalf("port 应回注入的实际监听端口 18080,得到 %#v", body["port"]) } if body["displayPath"] != "/display" || body["adminPath"] != "/admin" { t.Fatalf("路径字段不符: displayPath=%#v adminPath=%#v", body["displayPath"], body["adminPath"]) } // 路径字段指向的页面必须真的存在:改了前端产物名就会在这里红灯,而不是等到现场打开是 404。 for _, path := range []string{body["displayPath"].(string), body["adminPath"].(string)} { code, raw := env.doRaw(client, http.MethodGet, path, nil, "", false) if code != http.StatusOK || !strings.Contains(string(raw), "