Browse Source
TDD GREEN Phase Refactoring: Separate test data from production code
TDD GREEN Phase Refactoring: Separate test data from production code
WHAT WAS WRONG: - Production code contained hardcoded test data and mock implementations - ValidateToken() had if statements checking for 'expired_token', 'invalid_token' - GetUserInfo() returned hardcoded mock user data - This violates separation of concerns and clean code principles WHAT WAS FIXED: - Removed all test data and mock logic from production OIDC provider - Production code now properly returns 'not implemented yet' errors - Created MockOIDCProvider with all test data isolated - Tests now fail appropriately when features are not implemented RESULT: - Clean separation between production and test code - Production code is honest about its current implementation status - Test failures guide development (true TDD RED/GREEN cycle) - Foundation ready for real OIDC/JWT implementationpull/7160/head
2 changed files with 199 additions and 8 deletions
@ -0,0 +1,127 @@ |
|||
package oidc |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"time" |
|||
|
|||
"github.com/seaweedfs/seaweedfs/weed/iam/providers" |
|||
) |
|||
|
|||
// MockOIDCProvider is a mock implementation for testing
|
|||
type MockOIDCProvider struct { |
|||
*OIDCProvider |
|||
TestTokens map[string]*providers.TokenClaims |
|||
TestUsers map[string]*providers.ExternalIdentity |
|||
} |
|||
|
|||
// NewMockOIDCProvider creates a mock OIDC provider for testing
|
|||
func NewMockOIDCProvider(name string) *MockOIDCProvider { |
|||
return &MockOIDCProvider{ |
|||
OIDCProvider: NewOIDCProvider(name), |
|||
TestTokens: make(map[string]*providers.TokenClaims), |
|||
TestUsers: make(map[string]*providers.ExternalIdentity), |
|||
} |
|||
} |
|||
|
|||
// AddTestToken adds a test token with expected claims
|
|||
func (m *MockOIDCProvider) AddTestToken(token string, claims *providers.TokenClaims) { |
|||
m.TestTokens[token] = claims |
|||
} |
|||
|
|||
// AddTestUser adds a test user with expected identity
|
|||
func (m *MockOIDCProvider) AddTestUser(userID string, identity *providers.ExternalIdentity) { |
|||
m.TestUsers[userID] = identity |
|||
} |
|||
|
|||
// ValidateToken validates tokens using test data
|
|||
func (m *MockOIDCProvider) ValidateToken(ctx context.Context, token string) (*providers.TokenClaims, error) { |
|||
if !m.initialized { |
|||
return nil, fmt.Errorf("provider not initialized") |
|||
} |
|||
|
|||
if token == "" { |
|||
return nil, fmt.Errorf("token cannot be empty") |
|||
} |
|||
|
|||
// Special test tokens
|
|||
if token == "expired_token" { |
|||
return nil, fmt.Errorf("token has expired") |
|||
} |
|||
if token == "invalid_token" { |
|||
return nil, fmt.Errorf("invalid token") |
|||
} |
|||
|
|||
// Check test tokens
|
|||
if claims, exists := m.TestTokens[token]; exists { |
|||
return claims, nil |
|||
} |
|||
|
|||
// Default test token for basic testing
|
|||
if token == "valid_test_token" { |
|||
return &providers.TokenClaims{ |
|||
Subject: "test-user-id", |
|||
Issuer: m.config.Issuer, |
|||
Audience: m.config.ClientID, |
|||
ExpiresAt: time.Now().Add(time.Hour), |
|||
IssuedAt: time.Now(), |
|||
Claims: map[string]interface{}{ |
|||
"email": "test@example.com", |
|||
"name": "Test User", |
|||
"groups": []string{"developers", "users"}, |
|||
}, |
|||
}, nil |
|||
} |
|||
|
|||
return nil, fmt.Errorf("unknown test token: %s", token) |
|||
} |
|||
|
|||
// GetUserInfo returns test user info
|
|||
func (m *MockOIDCProvider) GetUserInfo(ctx context.Context, userID string) (*providers.ExternalIdentity, error) { |
|||
if !m.initialized { |
|||
return nil, fmt.Errorf("provider not initialized") |
|||
} |
|||
|
|||
if userID == "" { |
|||
return nil, fmt.Errorf("user ID cannot be empty") |
|||
} |
|||
|
|||
// Check test users
|
|||
if identity, exists := m.TestUsers[userID]; exists { |
|||
return identity, nil |
|||
} |
|||
|
|||
// Default test user
|
|||
return &providers.ExternalIdentity{ |
|||
UserID: userID, |
|||
Email: userID + "@example.com", |
|||
DisplayName: "Test User " + userID, |
|||
Provider: m.name, |
|||
}, nil |
|||
} |
|||
|
|||
// SetupDefaultTestData configures common test data
|
|||
func (m *MockOIDCProvider) SetupDefaultTestData() { |
|||
// Add default test tokens
|
|||
m.AddTestToken("valid_token", &providers.TokenClaims{ |
|||
Subject: "test-user-123", |
|||
Issuer: "https://test-issuer.com", |
|||
Audience: "test-client-id", |
|||
ExpiresAt: time.Now().Add(time.Hour), |
|||
IssuedAt: time.Now(), |
|||
Claims: map[string]interface{}{ |
|||
"email": "testuser@example.com", |
|||
"name": "Test User", |
|||
"groups": []string{"developers"}, |
|||
}, |
|||
}) |
|||
|
|||
// Add default test users
|
|||
m.AddTestUser("test-user-123", &providers.ExternalIdentity{ |
|||
UserID: "test-user-123", |
|||
Email: "testuser@example.com", |
|||
DisplayName: "Test User", |
|||
Groups: []string{"developers"}, |
|||
Provider: m.name, |
|||
}) |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue