4f06149abc
- inframeta.go: static display-only map (name/description/Linked) + infraMeta template func; filebrowser is the ONLY Linked stack (files.<domain> Megnyitás on the dashboard row; the stacks card already links via Subdomains) - generic infra icon: embedded /static/infra-logo.svg (Lucide-style server, monochrome) wired through the app-row FallbackIcon slot + the stacks-card onerror chain - dashboard rows + app cards: infra name + description + existing Védett chip - guarded WRONG outcome: no customer link for cloudflared/traefik — render tests count exactly ONE https:// link; red-proven (Linked:true on cloudflared → test FAILS)
104 lines
3.9 KiB
Go
104 lines
3.9 KiB
Go
package web
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"gitea.dooplex.hu/admin/felhom-controller/internal/stacks"
|
|
"gitea.dooplex.hu/admin/felhom-controller/internal/system"
|
|
)
|
|
|
|
// v0.126.0 Part B — infra stacks carry curated identity (name + description + Védett chip),
|
|
// and the guarded-wrong outcome: NO customer link for cloudflared/traefik (filebrowser is
|
|
// the ONLY Linked infra stack).
|
|
// COMPANION red-proof (recorded in REPORT): set Linked:true on cloudflared → the
|
|
// single-Megnyitás assertions below FAIL.
|
|
|
|
func infraStacksTestSet() []stacks.Stack {
|
|
return []stacks.Stack{
|
|
{Name: "cloudflared", Protected: true, State: stacks.StateRunning,
|
|
Meta: stacks.Metadata{Slug: "cloudflared", DisplayName: "Cloudflared"}},
|
|
{Name: "traefik", Protected: true, State: stacks.StateRunning,
|
|
Meta: stacks.Metadata{Slug: "traefik", DisplayName: "Traefik"}},
|
|
{Name: "filebrowser", Protected: true, State: stacks.StateRunning,
|
|
Meta: stacks.Metadata{Slug: "filebrowser", DisplayName: "Filebrowser"}},
|
|
}
|
|
}
|
|
|
|
func infraPageData(page string) map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"Page": page, "Title": "t",
|
|
"Stacks": infraStacksTestSet(),
|
|
"MissingStorage": map[string]string{},
|
|
"NetworkWarnings": map[string]string{},
|
|
"NetworkStubs": map[string]string{},
|
|
"StorageLabels": map[string]string{},
|
|
"Subdomains": map[string]string{"filebrowser": "files"},
|
|
"RunningCount": 3, "StoppedCount": 0, "TotalCount": 3,
|
|
"SystemInfo": system.SystemInfo{},
|
|
"BackupEnabled": false,
|
|
"Domain": "demo-felhom.eu",
|
|
}
|
|
}
|
|
|
|
func assertInfraIdentity(t *testing.T, surface, html string) {
|
|
t.Helper()
|
|
for _, want := range []string{
|
|
"Cloudflare Tunnel",
|
|
"Biztonságos internetkapcsolat — a szerver portnyitás nélkül érhető el kívülről.",
|
|
"Traefik",
|
|
"Forgalomirányító (reverse proxy) — a kéréseket a megfelelő alkalmazáshoz irányítja.",
|
|
"FileBrowser",
|
|
"Fájlkezelő — a tárhely fájljainak böngészése a böngészőből.",
|
|
} {
|
|
if !strings.Contains(html, want) {
|
|
t.Errorf("%s: infra identity %q missing", surface, want)
|
|
}
|
|
}
|
|
if !strings.Contains(html, "Védett") {
|
|
t.Errorf("%s: the Védett chip is missing", surface)
|
|
}
|
|
if !strings.Contains(html, `https://files.demo-felhom.eu`) {
|
|
t.Errorf("%s: filebrowser must link files.<domain>", surface)
|
|
}
|
|
// The guarded WRONG outcome: exactly ONE customer link (filebrowser) — a second
|
|
// https:// link would mean cloudflared/traefik got one.
|
|
if n := strings.Count(html, `https://`); n != 1 {
|
|
t.Errorf("%s: expected exactly 1 customer link (filebrowser), found %d https:// occurrences", surface, n)
|
|
}
|
|
}
|
|
|
|
func TestInfraMeta_DashboardRows(t *testing.T) {
|
|
html := renderBackupPage(t, "dashboard", infraPageData("dashboard"))
|
|
assertInfraIdentity(t, "dashboard", html)
|
|
if n := strings.Count(html, "Megnyitás"); n != 1 {
|
|
t.Errorf("dashboard: expected exactly 1 Megnyitás (filebrowser), found %d", n)
|
|
}
|
|
if n := strings.Count(html, `data-fallback="/static/infra-logo.svg"`); n != 3 {
|
|
t.Errorf("dashboard: all 3 infra rows must carry the generic-icon fallback, found %d", n)
|
|
}
|
|
}
|
|
|
|
func TestInfraMeta_AppCards(t *testing.T) {
|
|
html := renderBackupPage(t, "stacks", infraPageData("stacks"))
|
|
assertInfraIdentity(t, "stacks", html)
|
|
if !strings.Contains(html, "Védett rendszerkomponens") {
|
|
t.Error("stacks: protected card chip missing")
|
|
}
|
|
if n := strings.Count(html, `data-fallback="/static/infra-logo.svg"`); n != 3 {
|
|
t.Errorf("stacks: all 3 infra cards must carry the generic-icon fallback, found %d", n)
|
|
}
|
|
}
|
|
|
|
func TestInfraMetaFor_RegularAppIsNil(t *testing.T) {
|
|
if infraMetaFor("radarr") != nil {
|
|
t.Error("regular apps must have no infra metadata")
|
|
}
|
|
if m := infraMetaFor("cloudflared"); m == nil || m.Linked {
|
|
t.Error("cloudflared must exist and must NOT be Linked (no customer UI)")
|
|
}
|
|
if m := infraMetaFor("filebrowser"); m == nil || !m.Linked {
|
|
t.Error("filebrowser must be the Linked infra stack")
|
|
}
|
|
}
|