package jwt import ( "testing" "time" "github.com/stretchr/testify/require" ) func TestAccessTokenExpires(t *testing.T) { token := &Token{ ExpiresIn: 3600, // 1小時 } expectedDuration := time.Hour actualDuration := token.AccessTokenExpires() require.Equal(t, expectedDuration, actualDuration, "Access token expiration duration should be 1 hour") } func TestRefreshTokenExpires(t *testing.T) { token := &Token{ RefreshExpiresIn: 7200, // 2小時 } expectedDuration := 2 * time.Hour actualDuration := token.RefreshTokenExpires() require.Equal(t, expectedDuration, actualDuration, "Refresh token expiration duration should be 2 hours") } func TestRefreshTokenExpiresUnix(t *testing.T) { token := &Token{ RefreshExpiresIn: 3600, // 1小時 } expectedUnix := time.Now().Add(1 * time.Hour).Unix() actualUnix := token.RefreshTokenExpiresUnix() // 設定允許範圍,確保結果在1秒的範圍內 require.InEpsilon(t, expectedUnix, actualUnix, 1, "Refresh token expires Unix time should match the expected time") } func TestIsExpires(t *testing.T) { // 測試過期情況 tokenExpired := &Token{ ExpiresIn: 3600, // 1小時 AccessCreateAt: time.Now().Add(-2 * time.Hour), // 2小時前生成的 token,應該過期 } require.True(t, tokenExpired.IsExpires(), "Token should be expired") // 測試未過期情況 tokenNotExpired := &Token{ ExpiresIn: 3600, // 1小時 AccessCreateAt: time.Now().Add(-30 * time.Minute), // 30分鐘前生成的 token,應該未過期 } require.False(t, tokenNotExpired.IsExpires(), "Token should not be expired") } func TestRedisExpiredSec(t *testing.T) { token := &Token{ ExpiresIn: int(time.Now().Add(1 * time.Hour).Unix()), // 1小時後過期 } expectedSec := int64(3600) // 1小時 actualSec := token.RedisExpiredSec() // 確保時間在合理範圍內 require.InDelta(t, expectedSec, actualSec, 1, "Redis expired seconds should be close to 3600 seconds") } func TestRedisRefreshExpiredSec(t *testing.T) { token := &Token{ RefreshExpiresIn: int(time.Now().Add(2 * time.Hour).Unix()), // 2小時後過期 } expectedSec := int64(7200) // 2小時 actualSec := token.RedisRefreshExpiredSec() // 確保時間在合理範圍內 require.InDelta(t, expectedSec, actualSec, 1, "Redis refresh expired seconds should be close to 7200 seconds") }