package main import ( "testing" ) func TestAddCommandExists(t *testing.T) { if addCmd == nil { t.Fatal("addCmd should not be nil") } if addCmd.Use != "add [name]" { t.Errorf("expected Use 'add [name]', got '%s'", addCmd.Use) } if addCmd.Short == "" { t.Error("Short description should not be empty") } } func TestAddCommandFlags(t *testing.T) { expectedFlags := []string{"host", "port", "user", "password", "key", "auth-type", "group", "tags", "notes"} for _, flagName := range expectedFlags { if addCmd.Flags().Lookup(flagName) == nil { t.Errorf("flag '%s' should be defined", flagName) } } } func TestAddCommandValidation(t *testing.T) { tests := []struct { name string args []string hostFlag string userFlag string passFlag string wantError bool errContains string }{ { name: "missing hostname", args: []string{"myserver"}, userFlag: "admin", passFlag: "pass", wantError: true, errContains: "hostname is required", }, { name: "missing username", args: []string{"myserver"}, hostFlag: "192.168.1.10", passFlag: "pass", wantError: true, errContains: "username is required", }, { name: "missing auth", args: []string{"myserver"}, hostFlag: "192.168.1.10", userFlag: "admin", wantError: true, errContains: "authentication is required", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Reset flags addHostname = tt.hostFlag addUser = tt.userFlag addPassword = tt.passFlag addPort = 0 addKeyPath = "" addAuthType = "" addGroup = "" addTags = nil addNotes = "" // Set HOME to temp dir to avoid polluting real config t.Setenv("HOME", "/tmp/hostkeeper-test-nonexistent") err := runAddHost(addCmd, tt.args) if tt.wantError && err == nil { t.Errorf("expected error but got none") } if !tt.wantError && err != nil { t.Errorf("unexpected error: %v", err) } if tt.errContains != "" && err != nil { if !contains(err.Error(), tt.errContains) { t.Errorf("error should contain '%s', got '%s'", tt.errContains, err.Error()) } } }) } } func contains(s, substr string) bool { for i := 0; i <= len(s)-len(substr); i++ { if s[i:i+len(substr)] == substr { return true } } return false }