Files
felhom-controller/controller/internal/web/storage_network_template_test.go
T
admin 2487681396 style: gofmt normalization — no logic changes
gofmt -w across the controller tree (46 files) so gofmt -l is empty — disarms the
formatting landmine where a targeted edit + accidental gofmt -w swept ~46 unrelated
files. Pure formatting: whitespace + gofmt's optional-semicolon removal in reflowed
inline closures. One doc comment reworded ('' -> 'the empty string') to avoid gofmt's
Go-1.19 doc-comment typographic substitition ('' -> curly quote) muddying its meaning.
No build/vet/test behavior change.
2026-07-25 07:37:02 +02:00

107 lines
4.3 KiB
Go

package web
import (
"bytes"
"strings"
"testing"
)
// C8 — template smoke for the redesigned NAS page: it renders through the PRODUCTION template tree
// and uses the canonical form classes; the nonexistent classes (`form-row`/`form-input`) and the
// summary-styled-as-button hack — the root causes of the unstyled look this task fixed — must never
// come back. Companion red-proof: reintroduce `class="form-input"` on an input → FAIL.
func TestStorageNetworkTemplate_CanonicalClasses(t *testing.T) {
s := testServer(t)
s.loadTemplates()
data := map[string]interface{}{
"Page": "storage-network", "Title": "Hálózati tárhely",
"NetAddSupport": "yes",
"NetworkStoragePaths": []networkStorageItem{
{Name: "media", Label: "NAS media", Protocol: "nfs", Server: "10.0.0.5", Export: "/srv/media", Path: "/mnt/felhom-drives/media", Health: "ok"},
{Name: "ghost", Label: "Árva megosztás: ghost", Protocol: "nfs", Server: "10.0.0.5", Export: "/srv/ghost", Path: "/mnt/felhom-drives/ghost", Health: "idle", Orphan: true},
},
}
var buf bytes.Buffer
if err := s.tmpl.ExecuteTemplate(&buf, "storage_network", data); err != nil {
t.Fatalf("render storage_network: %v", err)
}
html := buf.String()
for _, want := range []string{
`class="form-control"`, // the canonical input class
`class="form-group"`, // the canonical field wrapper
"SMB (Synology, QNAP", // protocol-honest ordering: SMB listed first
"NFS (TrueNAS, Linux szerver)", // no bare "ajánlott" claim
"Árva", // the orphan badge renders
"minden felhasználó leképezése", // the Route-A guidance block
"ns-hostid", // the live computed host-id span
"/api/storage/netstorage/add/status", // the poll-driven progress wiring
} {
if !strings.Contains(html, want) {
t.Errorf("rendered page missing %q", want)
}
}
for _, banned := range []string{
"form-row", // nonexistent class — the old unstyled-look root cause
"form-input", // nonexistent class
`<summary class="btn`, // the summary-styled-as-button hack
} {
if strings.Contains(html, banned) {
t.Errorf("rendered page still contains the banned pattern %q", banned)
}
}
// The orphan row renders with ONLY the remove action (no attach/migrate verbs anywhere near it).
if !strings.Contains(html, "Eltávolítás") {
t.Error("remove action missing")
}
}
// --- T5 (Scenario D): capability banner replaces the add form on an old agent -------------------
// Companion red-proof: drop the {{if eq .NetAddSupport "no"}} wrapper (always render the form) →
// the banner-present + form-absent assertions on "no" fail.
func TestStorageNetworkTemplate_AgentOutdatedBanner(t *testing.T) {
s := testServer(t)
s.loadTemplates()
render := func(support string) string {
t.Helper()
var buf bytes.Buffer
err := s.tmpl.ExecuteTemplate(&buf, "storage_network", map[string]interface{}{
"Page": "storage-network", "Title": "Hálózati tárhely",
"NetAddSupport": support,
"NetworkStoragePaths": []networkStorageItem{
{Name: "media", Label: "NAS media", Protocol: "nfs", Server: "10.0.0.5", Export: "/srv/media", Path: "/mnt/felhom-drives/media", Health: "ok"},
},
})
if err != nil {
t.Fatalf("render (support=%s): %v", support, err)
}
return buf.String()
}
const banner = "A rendszer háttérszolgáltatása (ügynök) régebbi verziójú"
t.Run("no → banner instead of form; list + remove intact", func(t *testing.T) {
html := render("no")
if !strings.Contains(html, banner) {
t.Error("the §Part-3 banner is missing on an old agent")
}
if strings.Contains(html, `id="ns-add-form"`) {
t.Error("the add form must NOT render on an old agent")
}
// The share list + remove action stay fully usable in every state.
if !strings.Contains(html, "NAS media") || !strings.Contains(html, "Eltávolítás") {
t.Error("share list/remove must still render under the banner")
}
})
for _, support := range []string{"yes", "unknown"} {
t.Run(support+" → form as today", func(t *testing.T) {
html := render(support)
if !strings.Contains(html, `id="ns-add-form"`) {
t.Errorf("the add form must render on support=%s", support)
}
if strings.Contains(html, banner) {
t.Errorf("the banner must NOT render on support=%s", support)
}
})
}
}