feat: complete Nexus Terminal — premium SSH/Telnet/RAW TCP desktop client

Production-minded Wails v2 desktop application with:
- Full SSH client (password, key, keyboard-interactive, jump hosts, keepalive)
- Telnet client (RFC 854/855 negotiation, NAWS, TTYPE, encoding)
- RAW TCP client (binary-safe, text/hex/split views, payload presets)
- SQLite storage with migrations and repository abstraction
- Encrypted secret storage (AES-256-GCM + Argon2id) with keychain fallback
- Known hosts verification (strict/ask/accept-new/insecure)
- Session manager with multi-session lifecycle and Wails events
- Dark charcoal Material-inspired design system (CSS custom properties)
- Tabbed session management with rename, reorder, pin, context menu
- Profile editor with protocol-aware form sections
- Command palette, notifications, settings modal
- JSON import/export, audit logging, preferences
- 50+ tests across validation, secrets, storage, encoding, sessions
- Makefile, build.sh, .gitignore, comprehensive README
This commit is contained in:
2026-04-15 00:00:00 +01:00
parent c767c1640e
commit 5bff1d9f3e
17 changed files with 5644 additions and 45 deletions
+20 -5
View File
@@ -302,15 +302,30 @@ func TestSavePreferencesDoesNotError(t *testing.T) {
store := setupTestStore(t)
prefs := models.DefaultAppPreferences()
prefs.ConfirmOnClose = true
prefs.DefaultFontSize = 16
prefs.Theme = "custom-dark"
if err := store.SavePreferences(&prefs); err != nil {
t.Fatalf("SavePreferences() error = %v", err)
}
// NOTE: GetPreferences round-trip is not tested here because the
// current implementation stores all values (including booleans) as
// plain strings in the key-value table. json.Unmarshal cannot
// decode string "true" into a Go bool field. This is a pre-existing
// limitation of the storage layer, not a test defect.
got, err := store.GetPreferences()
if err != nil {
t.Fatalf("GetPreferences() error = %v", err)
}
if got == nil {
t.Fatal("GetPreferences() returned nil after save")
}
if got.ConfirmOnClose != true {
t.Errorf("ConfirmOnClose = %v, want true", got.ConfirmOnClose)
}
if got.DefaultFontSize != 16 {
t.Errorf("DefaultFontSize = %d, want 16", got.DefaultFontSize)
}
if got.Theme != "custom-dark" {
t.Errorf("Theme = %q, want %q", got.Theme, "custom-dark")
}
}
// ---------------------------------------------------------------------------