package config import "testing" // CROSS-LANGUAGE CONTRACT. The daemon and the web app must derive byte-identical // tokens from the same THERMOGRAPH_AUTH_SECRET, or every callback 401s -- and it // would surface as an auth error, which reads like a bug rather than like the // configuration drift it actually is. The same vector is asserted on the Python // side in backend/tests/api/test_internal_routes.py::test_derived_token_matches_go. // If deriveLabel or the construction changes, BOTH must change together. const ( sharedVectorSecret = "test-auth-secret" sharedVectorToken = "4c3830b2158941ff52720d198b65f7924372a3a482b8da52540a4d9be38247ea" ) func TestDeriveInternalTokenMatchesPython(t *testing.T) { if got := deriveInternalToken(sharedVectorSecret); got != sharedVectorToken { t.Fatalf("deriveInternalToken(%q) = %q; want %q (must match internal_routes.py)", sharedVectorSecret, got, sharedVectorToken) } } // An empty secret must yield nothing rather than some fixed "empty HMAC" value: // the caller turns "" into a refusal to start, and inventing a token here would // let the daemon run against a web app that computed a different one. func TestDeriveInternalTokenEmptySecretYieldsNothing(t *testing.T) { if got := deriveInternalToken(""); got != "" { t.Fatalf("deriveInternalToken(%q) = %q; want empty so Load refuses to start", "", got) } } func TestLoadPrefersExplicitTokenOverDerived(t *testing.T) { env := map[string]string{ "THERMOGRAPH_INTERNAL_TOKEN": "explicit-wins", "THERMOGRAPH_AUTH_SECRET": sharedVectorSecret, "THERMOGRAPH_API_BASE_INTERNAL": "http://web:8137", } cfg, err := load(func(k string) string { return env[k] }) if err != nil { t.Fatalf("load: %v", err) } if cfg.InternalToken != "explicit-wins" { t.Fatalf("InternalToken = %q; an explicit env var must win over derivation", cfg.InternalToken) } } func TestLoadDerivesTokenWhenOnlyAuthSecretIsSet(t *testing.T) { env := map[string]string{ "THERMOGRAPH_AUTH_SECRET": sharedVectorSecret, "THERMOGRAPH_API_BASE_INTERNAL": "http://web:8137", } cfg, err := load(func(k string) string { return env[k] }) if err != nil { t.Fatalf("load: %v", err) } if cfg.InternalToken != sharedVectorToken { t.Fatalf("InternalToken = %q; want the derived %q", cfg.InternalToken, sharedVectorToken) } } func TestLoadRefusesWhenNeitherTokenNorAuthSecretIsSet(t *testing.T) { env := map[string]string{"THERMOGRAPH_API_BASE_INTERNAL": "http://web:8137"} if _, err := load(func(k string) string { return env[k] }); err == nil { t.Fatal("load succeeded with no token and no auth secret; it must refuse to start") } }