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("после выключения порт всё ещё отвечает") + } +}