package configgen import ( "strings" "testing" "gitea.dooplex.hu/admin/felhom-hub/internal/store" ) // S4/S6 (R-558) — `customer.language` reaches controller.yaml, and it is the ONLY thing that moved. // // The controller reads it to decide what language a box STARTS in, before anyone has touched the // dashboard switch. It has to arrive, and nothing else may arrive with it: a config pull restarts // the box, so an unintended second change would ride out to the whole fleet on the same wire. func TestGenerate_CustomerLanguage(t *testing.T) { const tmpl = "customer:\n id: \"\"\n name: \"\"\nlogging:\n level: info\n" base := &store.CustomerConfig{CustomerID: "c1", CustomerName: "Acme", ConfigJSON: "{}"} withEN := &store.CustomerConfig{CustomerID: "c1", CustomerName: "Acme", ConfigJSON: "{}", Language: "en"} huYAML, err := Generate(tmpl, base, nil) if err != nil { t.Fatal(err) } enYAML, err := Generate(tmpl, withEN, nil) if err != nil { t.Fatal(err) } if !strings.Contains(enYAML, "language: en") { t.Fatalf("customer.language did not reach controller.yaml:\n%s", enYAML) } // THE DIFF IS EXACTLY ONE LINE. Compared line by line after dropping the fields that are // regenerated on every call — a session secret and a timestamp differ between any two renders, // so counting them would make this test pass no matter what else changed. huLines := stableLines(huYAML) enLines := stableLines(enYAML) var onlyInEN, onlyInHU []string for _, l := range enLines { if !contains(huLines, l) { onlyInEN = append(onlyInEN, l) } } for _, l := range huLines { if !contains(enLines, l) { onlyInHU = append(onlyInHU, l) } } if len(onlyInEN) != 1 || !strings.Contains(onlyInEN[0], "language: en") { t.Errorf("the English config differs from the Hungarian one by %d line(s), want exactly the "+ "language line: %v", len(onlyInEN), onlyInEN) } if len(onlyInHU) != 1 || !strings.Contains(onlyInHU[0], "language:") { t.Errorf("the Hungarian config has %d line(s) the English one lacks, want exactly the "+ "language line: %v", len(onlyInHU), onlyInHU) } } // An empty creation language still writes a line — the box is told "Hungarian" explicitly rather // than being left to guess from an absent key. func TestGenerate_EmptyLanguageStillWritesTheKey(t *testing.T) { const tmpl = "customer:\n id: \"\"\n" y, err := Generate(tmpl, &store.CustomerConfig{CustomerID: "c1", ConfigJSON: "{}"}, nil) if err != nil { t.Fatal(err) } if !strings.Contains(y, "language:") { t.Errorf("no language key at all — the box cannot tell a default from a missing field:\n%s", y) } } // stableLines drops the lines that are regenerated on every call, so two renders are comparable. func stableLines(y string) []string { var out []string for _, l := range strings.Split(y, "\n") { t := strings.TrimSpace(l) if t == "" || strings.HasPrefix(t, "session_secret:") || strings.HasPrefix(t, "generated_at:") { continue } out = append(out, l) } return out } func contains(ls []string, want string) bool { for _, l := range ls { if l == want { return true } } return false }