gogcli/internal/cmd/account_test.go
2026-01-10 03:12:21 +01:00

120 lines
3.1 KiB
Go

package cmd
import (
"errors"
"testing"
"github.com/steipete/gogcli/internal/secrets"
)
type fakeSecretsStore struct {
defaultAccount string
tokens []secrets.Token
errDefault error
errListTokens error
}
func (s *fakeSecretsStore) Keys() ([]string, error) { return nil, errors.New("not implemented") }
func (s *fakeSecretsStore) SetToken(string, secrets.Token) error {
return errors.New("not implemented")
}
func (s *fakeSecretsStore) GetToken(string) (secrets.Token, error) {
return secrets.Token{}, errors.New("not implemented")
}
func (s *fakeSecretsStore) DeleteToken(string) error { return errors.New("not implemented") }
func (s *fakeSecretsStore) SetDefaultAccount(string) error { return errors.New("not implemented") }
func (s *fakeSecretsStore) GetDefaultAccount() (string, error) { return s.defaultAccount, s.errDefault }
func (s *fakeSecretsStore) ListTokens() ([]secrets.Token, error) { return s.tokens, s.errListTokens }
func TestRequireAccount_PrefersFlag(t *testing.T) {
t.Setenv("GOG_ACCOUNT", "env@example.com")
flags := &RootFlags{Account: "flag@example.com"}
got, err := requireAccount(flags)
if err != nil {
t.Fatalf("err: %v", err)
}
if got != "flag@example.com" {
t.Fatalf("got %q", got)
}
}
func TestRequireAccount_UsesEnv(t *testing.T) {
t.Setenv("GOG_ACCOUNT", "env@example.com")
flags := &RootFlags{}
got, err := requireAccount(flags)
if err != nil {
t.Fatalf("err: %v", err)
}
if got != "env@example.com" {
t.Fatalf("got %q", got)
}
}
func TestRequireAccount_Missing(t *testing.T) {
t.Setenv("GOG_ACCOUNT", "")
flags := &RootFlags{}
_, err := requireAccount(flags)
if err == nil {
t.Fatalf("expected error")
}
}
func TestRequireAccount_UsesKeyringDefaultAccount(t *testing.T) {
t.Setenv("GOG_ACCOUNT", "")
flags := &RootFlags{}
prev := openSecretsStoreForAccount
t.Cleanup(func() { openSecretsStoreForAccount = prev })
openSecretsStoreForAccount = func() (secrets.Store, error) {
return &fakeSecretsStore{defaultAccount: "default@example.com"}, nil
}
got, err := requireAccount(flags)
if err != nil {
t.Fatalf("err: %v", err)
}
if got != "default@example.com" {
t.Fatalf("got %q", got)
}
}
func TestRequireAccount_UsesSingleStoredToken(t *testing.T) {
t.Setenv("GOG_ACCOUNT", "")
flags := &RootFlags{}
prev := openSecretsStoreForAccount
t.Cleanup(func() { openSecretsStoreForAccount = prev })
openSecretsStoreForAccount = func() (secrets.Store, error) {
return &fakeSecretsStore{
tokens: []secrets.Token{{Email: "one@example.com"}},
}, nil
}
got, err := requireAccount(flags)
if err != nil {
t.Fatalf("err: %v", err)
}
if got != "one@example.com" {
t.Fatalf("got %q", got)
}
}
func TestRequireAccount_MissingWhenMultipleTokensAndNoDefault(t *testing.T) {
t.Setenv("GOG_ACCOUNT", "")
flags := &RootFlags{}
prev := openSecretsStoreForAccount
t.Cleanup(func() { openSecretsStoreForAccount = prev })
openSecretsStoreForAccount = func() (secrets.Store, error) {
return &fakeSecretsStore{
tokens: []secrets.Token{{Email: "a@example.com"}, {Email: "b@example.com"}},
}, nil
}
_, err := requireAccount(flags)
if err == nil {
t.Fatalf("expected error")
}
}