gui/pkg/lifecycle/mode_test.go
Snider 6e62d4a20c
Some checks failed
Security Scan / security (push) Has been cancelled
Test / test (push) Has been cancelled
feat(lifecycle): add AppMode type + DetectMode()
New pkg/lifecycle/mode.go introduces AppMode (Manager | Worker) and
DetectMode() that returns:
- Manager by default (explicit or empty env)
- Worker when CORE_APP_MODE=worker, or when empty env + CI=true signals
  a headless/compute context

Prerequisite for the BugSETI compute worker pattern (core/gui RFC.md §9.1) —
manager GUI runs the full app UI, workers run headless compute with only an
RPC surface.

Tests follow the core/go {Good,Bad,Ugly} naming convention; go test
./pkg/lifecycle/... passes.

Co-authored-by: Codex <noreply@openai.com>

Closes tasks.lthn.sh/view.php?id=32
2026-04-23 13:12:12 +01:00

57 lines
1.1 KiB
Go

package lifecycle
import (
"os"
"testing"
)
func TestMode_DetectMode_Good(t *testing.T) {
unsetEnv(t, appModeEnv)
t.Setenv(ciEnv, "")
mode := DetectMode()
if mode != ModeManager {
t.Fatalf("expected manager mode, got %q", mode)
}
}
func TestMode_DetectMode_Bad(t *testing.T) {
t.Setenv(appModeEnv, "bogus")
t.Setenv(ciEnv, "")
mode := DetectMode()
if mode != ModeManager {
t.Fatalf("expected manager mode after invalid env value, got %q", mode)
}
}
func TestMode_DetectMode_Ugly(t *testing.T) {
t.Setenv(appModeEnv, "")
t.Setenv(ciEnv, "true")
mode := DetectMode()
if mode != ModeWorker {
t.Fatalf("expected worker mode in CI headless context, got %q", mode)
}
}
func unsetEnv(t *testing.T, key string) {
t.Helper()
value, ok := os.LookupEnv(key)
if err := os.Unsetenv(key); err != nil {
t.Fatalf("unset %s: %v", key, err)
}
t.Cleanup(func() {
if ok {
if err := os.Setenv(key, value); err != nil {
t.Fatalf("restore %s: %v", key, err)
}
return
}
if err := os.Unsetenv(key); err != nil {
t.Fatalf("restore unset %s: %v", key, err)
}
})
}