package lkgateway import ( "io" "net/http" "strings" "testing" "time" ) // Кабинет для просмотра на порту ядра: включается настройкой, отдаёт страницу входа с куками без // Secure (просмотр по http), выключается той же настройкой. func TestLKPreviewListener(t *testing.T) { rc, err := NewRuntimeConfig(t.TempDir() + "/setup.json") if err != nil { t.Fatal(err) } mux := http.NewServeMux() registerLKAPI(mux, rc, nil) // задаёт globalLKCabinet cfg := rc.Snapshot().LK cfg.APIKey, cfg.PreviewOn, cfg.PreviewListen = "lk-preview-key", true, "127.0.0.1:18099" if err := rc.UpdateLK(cfg); err != nil { t.Fatal(err) } lkPreviewApply(rc) defer func() { cfg.PreviewOn = false _ = rc.UpdateLK(cfg) lkPreviewApply(rc) }() client := &http.Client{Timeout: 5 * time.Second} var resp *http.Response for i := 0; i < 20; i++ { resp, err = client.Get("http://127.0.0.1:18099/login") if err == nil { break } time.Sleep(50 * time.Millisecond) } if err != nil { t.Fatalf("кабинет для просмотра не отвечает: %v", err) } body, _ := io.ReadAll(resp.Body) resp.Body.Close() if resp.StatusCode != http.StatusOK || !strings.Contains(string(body), "Логин или номер договора") { t.Fatalf("страница входа: %d %.200s", resp.StatusCode, body) } for _, c := range resp.Cookies() { if c.Name == "bj_lk_csrf" && c.Secure { t.Error("для просмотра по http кука не должна быть Secure — вход не сработает") } } cfg.PreviewOn = false _ = rc.UpdateLK(cfg) lkPreviewApply(rc) time.Sleep(100 * time.Millisecond) if _, err := client.Get("http://127.0.0.1:18099/login"); err == nil { t.Fatal("после выключения порт всё ещё отвечает") } }