mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-02-12 15:05:10 -05:00
## CHANGES - Move domain types from common to domain package - Move utility functions from common to util package - Update all import statements across codebase - Reorganize OAuth storage functionality into util package - Move file management functions to domain package - Update test files to use new package structure - Maintain backward compatibility for existing functionality
233 lines
6.0 KiB
Go
233 lines
6.0 KiB
Go
package util
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestOAuthToken_IsExpired(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
expiresAt int64
|
|
bufferMinutes int
|
|
expected bool
|
|
}{
|
|
{
|
|
name: "token not expired",
|
|
expiresAt: time.Now().Unix() + 3600, // 1 hour from now
|
|
bufferMinutes: 5,
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "token expired",
|
|
expiresAt: time.Now().Unix() - 3600, // 1 hour ago
|
|
bufferMinutes: 5,
|
|
expected: true,
|
|
},
|
|
{
|
|
name: "token expires within buffer",
|
|
expiresAt: time.Now().Unix() + 120, // 2 minutes from now
|
|
bufferMinutes: 5,
|
|
expected: true,
|
|
},
|
|
{
|
|
name: "zero expiry time",
|
|
expiresAt: 0,
|
|
bufferMinutes: 5,
|
|
expected: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
token := &OAuthToken{ExpiresAt: tt.expiresAt}
|
|
if got := token.IsExpired(tt.bufferMinutes); got != tt.expected {
|
|
t.Errorf("IsExpired() = %v, want %v", got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestOAuthStorage_SaveAndLoadToken(t *testing.T) {
|
|
// Create temporary directory for testing
|
|
tempDir, err := os.MkdirTemp("", "fabric_oauth_test")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create storage with custom config dir
|
|
storage := &OAuthStorage{configDir: tempDir}
|
|
|
|
// Test token
|
|
token := &OAuthToken{
|
|
AccessToken: "test_access_token",
|
|
RefreshToken: "test_refresh_token",
|
|
ExpiresAt: time.Now().Unix() + 3600,
|
|
TokenType: "Bearer",
|
|
Scope: "test_scope",
|
|
}
|
|
|
|
// Test saving token
|
|
err = storage.SaveToken("test_provider", token)
|
|
if err != nil {
|
|
t.Fatalf("Failed to save token: %v", err)
|
|
}
|
|
|
|
// Verify file exists and has correct permissions
|
|
tokenPath := storage.GetTokenPath("test_provider")
|
|
info, err := os.Stat(tokenPath)
|
|
if err != nil {
|
|
t.Fatalf("Token file not created: %v", err)
|
|
}
|
|
if info.Mode().Perm() != 0600 {
|
|
t.Errorf("Token file has wrong permissions: %v, want 0600", info.Mode().Perm())
|
|
}
|
|
|
|
// Test loading token
|
|
loadedToken, err := storage.LoadToken("test_provider")
|
|
if err != nil {
|
|
t.Fatalf("Failed to load token: %v", err)
|
|
}
|
|
if loadedToken == nil {
|
|
t.Fatal("Loaded token is nil")
|
|
}
|
|
|
|
// Verify token data
|
|
if loadedToken.AccessToken != token.AccessToken {
|
|
t.Errorf("AccessToken mismatch: got %v, want %v", loadedToken.AccessToken, token.AccessToken)
|
|
}
|
|
if loadedToken.RefreshToken != token.RefreshToken {
|
|
t.Errorf("RefreshToken mismatch: got %v, want %v", loadedToken.RefreshToken, token.RefreshToken)
|
|
}
|
|
if loadedToken.ExpiresAt != token.ExpiresAt {
|
|
t.Errorf("ExpiresAt mismatch: got %v, want %v", loadedToken.ExpiresAt, token.ExpiresAt)
|
|
}
|
|
}
|
|
|
|
func TestOAuthStorage_LoadNonExistentToken(t *testing.T) {
|
|
// Create temporary directory for testing
|
|
tempDir, err := os.MkdirTemp("", "fabric_oauth_test")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
storage := &OAuthStorage{configDir: tempDir}
|
|
|
|
// Try to load non-existent token
|
|
token, err := storage.LoadToken("nonexistent")
|
|
if err != nil {
|
|
t.Fatalf("Unexpected error loading non-existent token: %v", err)
|
|
}
|
|
if token != nil {
|
|
t.Error("Expected nil token for non-existent provider")
|
|
}
|
|
}
|
|
|
|
func TestOAuthStorage_DeleteToken(t *testing.T) {
|
|
// Create temporary directory for testing
|
|
tempDir, err := os.MkdirTemp("", "fabric_oauth_test")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
storage := &OAuthStorage{configDir: tempDir}
|
|
|
|
// Create and save a token
|
|
token := &OAuthToken{
|
|
AccessToken: "test_token",
|
|
RefreshToken: "test_refresh",
|
|
ExpiresAt: time.Now().Unix() + 3600,
|
|
}
|
|
err = storage.SaveToken("test_provider", token)
|
|
if err != nil {
|
|
t.Fatalf("Failed to save token: %v", err)
|
|
}
|
|
|
|
// Verify token exists
|
|
tokenPath := storage.GetTokenPath("test_provider")
|
|
if _, err := os.Stat(tokenPath); os.IsNotExist(err) {
|
|
t.Fatal("Token file should exist before deletion")
|
|
}
|
|
|
|
// Delete token
|
|
err = storage.DeleteToken("test_provider")
|
|
if err != nil {
|
|
t.Fatalf("Failed to delete token: %v", err)
|
|
}
|
|
|
|
// Verify token is deleted
|
|
if _, err := os.Stat(tokenPath); !os.IsNotExist(err) {
|
|
t.Error("Token file should not exist after deletion")
|
|
}
|
|
|
|
// Test deleting non-existent token (should not error)
|
|
err = storage.DeleteToken("nonexistent")
|
|
if err != nil {
|
|
t.Errorf("Deleting non-existent token should not error: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestOAuthStorage_HasValidToken(t *testing.T) {
|
|
// Create temporary directory for testing
|
|
tempDir, err := os.MkdirTemp("", "fabric_oauth_test")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
storage := &OAuthStorage{configDir: tempDir}
|
|
|
|
// Test with no token
|
|
if storage.HasValidToken("test_provider", 5) {
|
|
t.Error("Should return false when no token exists")
|
|
}
|
|
|
|
// Save valid token
|
|
validToken := &OAuthToken{
|
|
AccessToken: "valid_token",
|
|
RefreshToken: "refresh_token",
|
|
ExpiresAt: time.Now().Unix() + 3600, // 1 hour from now
|
|
}
|
|
err = storage.SaveToken("test_provider", validToken)
|
|
if err != nil {
|
|
t.Fatalf("Failed to save valid token: %v", err)
|
|
}
|
|
|
|
// Test with valid token
|
|
if !storage.HasValidToken("test_provider", 5) {
|
|
t.Error("Should return true for valid token")
|
|
}
|
|
|
|
// Save expired token
|
|
expiredToken := &OAuthToken{
|
|
AccessToken: "expired_token",
|
|
RefreshToken: "refresh_token",
|
|
ExpiresAt: time.Now().Unix() - 3600, // 1 hour ago
|
|
}
|
|
err = storage.SaveToken("expired_provider", expiredToken)
|
|
if err != nil {
|
|
t.Fatalf("Failed to save expired token: %v", err)
|
|
}
|
|
|
|
// Test with expired token
|
|
if storage.HasValidToken("expired_provider", 5) {
|
|
t.Error("Should return false for expired token")
|
|
}
|
|
}
|
|
|
|
func TestOAuthStorage_GetTokenPath(t *testing.T) {
|
|
storage := &OAuthStorage{configDir: "/test/config"}
|
|
|
|
expected := filepath.Join("/test/config", ".test_provider_oauth")
|
|
actual := storage.GetTokenPath("test_provider")
|
|
|
|
if actual != expected {
|
|
t.Errorf("GetTokenPath() = %v, want %v", actual, expected)
|
|
}
|
|
}
|