R-574: handler_debug.go literals classified; the 38 page-copy ones move to the bundle

39 Hungarian literals: 38 are debug-page copy (every writeDebugJSON message/error, rendered
into the result line by debug.html, plus the pre-0.83 agent notice rendered in the log
viewer) -> 30 debug.api.* keys (hu byte-equal, parity gate green; en added). One is PAYLOAD:
the 'Teszt esemény' text sent to the hub as the test event's message stays a literal. The
diagnostic dump carries no Hungarian. TestR574_DebugPageCopyFollowsTheLanguage pins hu bytes
and en rendering.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-05 22:07:23 +02:00
parent 074ddda352
commit 391967bcf1
5 changed files with 200 additions and 38 deletions
@@ -0,0 +1,69 @@
package web
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"gitea.dooplex.hu/admin/felhom-controller/internal/agentapi"
)
// R-574 — handler_debug.go's literals, classified once: 38 are PAGE COPY (every writeDebugJSON
// message/error, which debug.html prints into the result line, plus the pre-0.83 agent `notice`,
// which it prints into the log viewer) and were moved to the bundle (debug.api.*); ONE is PAYLOAD —
// the `Teszt esemény: %s (%s)` text handed to PushTestEventSync, which travels to the hub as the
// test event's own message — and stays a literal on purpose. The diagnostic dump carries no
// Hungarian.
//
// The consequence pinned here: the Hungarian page is byte-for-byte what it was (the parity gate
// proves the bundle text; this proves the handler reads it), and an English page is English.
// RED-PROOF (REPORT): put either producer back to its literal and the English rows fail.
func TestR574_DebugPageCopyFollowsTheLanguage(t *testing.T) {
type debugResp struct {
OK bool `json:"ok"`
Error string `json:"error"`
Data struct {
Notice string `json:"notice"`
} `json:"data"`
}
run := func(t *testing.T, lang string, call func(s *Server, w http.ResponseWriter, r *http.Request)) debugResp {
t.Helper()
s := testServer(t)
if s.settings == nil {
t.Fatal("testServer has no settings — the language cannot be set")
}
s.settings.SetConfigLanguage(lang)
w := httptest.NewRecorder()
call(s, w, httptest.NewRequest(http.MethodPost, "/api/debug/x", nil))
var resp debugResp
if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil {
t.Fatalf("decode: %v (%s)", err, w.Body.String())
}
return resp
}
dbDump := func(s *Server, w http.ResponseWriter, r *http.Request) {
s.backupMgr = nil
s.debugTriggerDBDump(w, r)
}
notice := func(s *Server, w http.ResponseWriter, r *http.Request) {
s.agentLogsFn = func(context.Context) (agentapi.AgentLogsResponse, error) {
return agentapi.AgentLogsResponse{}, &agentapi.StatusError{Path: "/debug/logs", Code: http.StatusNotFound}
}
s.debugAgentLogs(w, r)
}
if got := run(t, "hu", dbDump).Error; got != "Backup manager nincs konfigurálva" {
t.Errorf("hu error = %q — the Hungarian bytes moved", got)
}
if got := run(t, "en", dbDump).Error; got != "Backup manager is not configured" {
t.Errorf("en error = %q — the handler does not read the bundle", got)
}
if got := run(t, "hu", notice).Data.Notice; got != "Az ügynök naplónézete az ügynök következő frissítése után érhető el." {
t.Errorf("hu notice = %q — the Hungarian bytes moved", got)
}
if got := run(t, "en", notice).Data.Notice; got != "The agent’s log view becomes available after the agent’s next update." {
t.Errorf("en notice = %q — the handler does not read the bundle", got)
}
}