package clipboard import ( "errors" "testing" "git.julianfamily.org/keepassgo/vault" ) func TestServiceCopiesUsernamePasswordAndURL(t *testing.T) { t.Parallel() model := vault.Model{ Entries: []vault.Entry{ { ID: "vault-console", Title: "Vault Console", Username: "dannyocean", Password: "token-1", URL: "https://vault.crew.example.invalid", }, }, } tests := []struct { name string target Target want string }{ {name: "username", target: TargetUsername, want: "dannyocean"}, {name: "password", target: TargetPassword, want: "token-1"}, {name: "url", target: TargetURL, want: "https://vault.crew.example.invalid"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var writer memoryWriter service := Service{Writer: &writer} if err := service.Copy(model, "vault-console", tt.target); err != nil { t.Fatalf("Copy() error = %v", err) } if writer.content != tt.want { t.Fatalf("clipboard content = %q, want %q", writer.content, tt.want) } }) } } func TestServiceRejectsUnknownEntryAndUnsupportedTarget(t *testing.T) { t.Parallel() var writer memoryWriter service := Service{Writer: &writer} err := service.Copy(vault.Model{}, "missing", TargetPassword) if !errors.Is(err, vault.ErrEntryNotFound) { t.Fatalf("Copy() missing entry error = %v, want ErrEntryNotFound", err) } model := vault.Model{ Entries: []vault.Entry{{ID: "vault-console", Username: "dannyocean"}}, } err = service.Copy(model, "vault-console", Target("unsupported")) if !errors.Is(err, ErrUnsupportedTarget) { t.Fatalf("Copy() unsupported target error = %v, want ErrUnsupportedTarget", err) } } func TestServiceSanitizesClipboardWriteErrors(t *testing.T) { t.Parallel() service := Service{Writer: failingWriter{err: errors.New("backend refused token-1")}} model := vault.Model{ Entries: []vault.Entry{ {ID: "vault-console", Password: "token-1"}, }, } err := service.Copy(model, "vault-console", TargetPassword) if !errors.Is(err, ErrWriteFailed) { t.Fatalf("Copy() write error = %v, want ErrWriteFailed", err) } if err.Error() != ErrWriteFailed.Error() { t.Fatalf("Copy() write error string = %q, want %q", err.Error(), ErrWriteFailed.Error()) } } type memoryWriter struct { content string } func (w *memoryWriter) WriteText(text string) error { w.content = text return nil } type failingWriter struct { err error } func (w failingWriter) WriteText(string) error { return w.err }