package store import ( "os" "path/filepath" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestTokenStoreSaveLoad(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "tokens.json") s := NewTokenStore(path) token := &TokenSet{ AccessToken: "access-abc", RefreshToken: "refresh-xyz", TokenType: "Bearer", Expiry: time.Now().Add(time.Hour).Truncate(time.Second), Scopes: []string{"https://www.googleapis.com/auth/calendar"}, Account: "test@example.com", } require.NoError(t, s.Save(token)) info, err := os.Stat(path) require.NoError(t, err) assert.Equal(t, os.FileMode(0600), info.Mode().Perm()) loaded, err := s.Load() require.NoError(t, err) require.NotNil(t, loaded) assert.Equal(t, token.AccessToken, loaded.AccessToken) assert.Equal(t, token.RefreshToken, loaded.RefreshToken) assert.Equal(t, token.Account, loaded.Account) } func TestTokenStoreLoadMissing(t *testing.T) { dir := t.TempDir() s := NewTokenStore(filepath.Join(dir, "noexist.json")) token, err := s.Load() assert.NoError(t, err) assert.Nil(t, token) } func TestTokenStoreDelete(t *testing.T) { dir := t.TempDir() s := NewTokenStore(filepath.Join(dir, "tokens.json")) token := &TokenSet{AccessToken: "abc"} require.NoError(t, s.Save(token)) assert.True(t, s.Exists()) require.NoError(t, s.Delete()) assert.False(t, s.Exists()) assert.NoError(t, s.Delete()) } func TestTokenIsExpired(t *testing.T) { tests := []struct { name string token TokenSet expired bool }{ {"no expiry", TokenSet{}, false}, {"future expiry", TokenSet{Expiry: time.Now().Add(time.Hour)}, false}, {"past expiry", TokenSet{Expiry: time.Now().Add(-time.Hour)}, true}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.expired, tc.token.IsExpired()) }) } }