From ca1358b138dfb40902d9e11bbc45bbd3a443c165 Mon Sep 17 00:00:00 2001 From: zuevav Date: Fri, 18 Sep 2026 14:50:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D0=BA=D0=B0=D0=B1?= =?UTF-8?q?=D0=B8=D0=BD=D0=B5=D1=82=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=80=D1=82=D1=83=20=D1=8F=D0=B4=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL --- internal/lkgateway/lkpreview_test.go | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 internal/lkgateway/lkpreview_test.go diff --git a/internal/lkgateway/lkpreview_test.go b/internal/lkgateway/lkpreview_test.go new file mode 100644 index 0000000..ee85c89 --- /dev/null +++ b/internal/lkgateway/lkpreview_test.go @@ -0,0 +1,60 @@ +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("после выключения порт всё ещё отвечает") + } +}