Skip to content

Commit c6c6249

Browse files
test(secrets): add coverage for keyring backend validation
- Add table-driven tests for allowedBackendsFromEnv() - Add errInvalidKeyringBackend sentinel for testable error checking - Fix formatting alignment in auth.go and store.go 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 3864ac2 commit c6c6249

3 files changed

Lines changed: 55 additions & 10 deletions

File tree

internal/cmd/auth.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ import (
1919
)
2020

2121
var (
22-
openSecretsStore = secrets.OpenDefault
23-
authorizeGoogle = googleauth.Authorize
24-
startManageServer = googleauth.StartManageServer
25-
checkRefreshToken = googleauth.CheckRefreshToken
22+
openSecretsStore = secrets.OpenDefault
23+
authorizeGoogle = googleauth.Authorize
24+
startManageServer = googleauth.StartManageServer
25+
checkRefreshToken = googleauth.CheckRefreshToken
2626
ensureKeychainAccess = defaultEnsureKeychainAccess
2727
)
2828

internal/secrets/store.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,16 @@ type Token struct {
3737
RefreshToken string `json:"-"`
3838
}
3939

40-
const keyringPasswordEnv = "GOG_KEYRING_PASSWORD" //nolint:gosec // env var name, not a credential
41-
const keyringBackendEnv = "GOG_KEYRING_BACKEND" //nolint:gosec // env var name, not a credential
40+
const (
41+
keyringPasswordEnv = "GOG_KEYRING_PASSWORD" //nolint:gosec // env var name, not a credential
42+
keyringBackendEnv = "GOG_KEYRING_BACKEND" //nolint:gosec // env var name, not a credential
43+
)
4244

4345
var (
44-
errMissingEmail = errors.New("missing email")
45-
errMissingRefreshToken = errors.New("missing refresh token")
46-
errNoTTY = errors.New("no TTY available for keyring file backend password prompt")
46+
errMissingEmail = errors.New("missing email")
47+
errMissingRefreshToken = errors.New("missing refresh token")
48+
errNoTTY = errors.New("no TTY available for keyring file backend password prompt")
49+
errInvalidKeyringBackend = errors.New("invalid keyring backend")
4750
)
4851

4952
func allowedBackendsFromEnv() ([]keyring.BackendType, error) {
@@ -55,7 +58,7 @@ func allowedBackendsFromEnv() ([]keyring.BackendType, error) {
5558
case "file":
5659
return []keyring.BackendType{keyring.FileBackend}, nil
5760
default:
58-
return nil, fmt.Errorf("invalid %s (expected auto, keychain, or file)", keyringBackendEnv)
61+
return nil, fmt.Errorf("%w: %s (expected auto, keychain, or file)", errInvalidKeyringBackend, keyringBackendEnv)
5962
}
6063
}
6164

internal/secrets/store_more_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package secrets
22

33
import (
4+
"errors"
45
"testing"
56

67
"github.com/99designs/keyring"
@@ -86,3 +87,44 @@ func TestFileKeyringPasswordFunc(t *testing.T) {
8687
t.Fatalf("expected secret, got %q err=%v", res.got, res.err)
8788
}
8889
}
90+
91+
func TestAllowedBackendsFromEnv(t *testing.T) {
92+
tests := []struct {
93+
name string
94+
envVal string
95+
wantLen int
96+
wantErr bool
97+
}{
98+
{"empty defaults to nil", "", 0, false},
99+
{"auto defaults to nil", "auto", 0, false},
100+
{"keychain returns one backend", "keychain", 1, false},
101+
{"file returns one backend", "file", 1, false},
102+
{"invalid returns error", "invalid", 0, true},
103+
{"whitespace trimmed", " keychain ", 1, false},
104+
{"case insensitive", "KEYCHAIN", 1, false},
105+
}
106+
107+
for _, tt := range tests {
108+
t.Run(tt.name, func(t *testing.T) {
109+
t.Setenv(keyringBackendEnv, tt.envVal)
110+
backends, err := allowedBackendsFromEnv()
111+
112+
if tt.wantErr {
113+
if err == nil {
114+
t.Fatal("expected error")
115+
}
116+
if !errors.Is(err, errInvalidKeyringBackend) {
117+
t.Errorf("expected errInvalidKeyringBackend, got %v", err)
118+
}
119+
return
120+
}
121+
122+
if err != nil {
123+
t.Fatalf("unexpected error: %v", err)
124+
}
125+
if len(backends) != tt.wantLen {
126+
t.Errorf("expected %d backends, got %d", tt.wantLen, len(backends))
127+
}
128+
})
129+
}
130+
}

0 commit comments

Comments
 (0)