@@ -2,87 +2,155 @@ package main
22
33import (
44 "testing"
5+ "context"
6+ "crypto/rsa"
7+ "crypto/rand"
8+ "time"
59 "github.com/golang-jwt/jwt/v5"
610 "github.com/google/uuid"
711 "google.golang.org/grpc/codes"
812 "google.golang.org/grpc/status"
13+ "helixflow/auth"
14+ "helixflow/database"
915)
1016
11- var testKey = []byte ("test-secret" )
17+ var testPrivateKey * rsa.PrivateKey
18+ var testPublicKey * rsa.PublicKey
19+ var testServer * AuthServiceServer
20+
21+ // MockDatabaseManager implements DatabaseManager for testing
22+ type MockDatabaseManager struct {}
23+
24+ func (m * MockDatabaseManager ) Initialize () error { return nil }
25+ func (m * MockDatabaseManager ) Close () error { return nil }
26+ func (m * MockDatabaseManager ) CreateUser (username , email , password , firstName , lastName , organization string ) (string , error ) { return "user123" , nil }
27+ func (m * MockDatabaseManager ) GetUserByUsername (username string ) (* database.User , error ) {
28+ return & database.User {ID : "user123" , Username : username , Active : true }, nil
29+ }
30+ func (m * MockDatabaseManager ) GetUserByEmail (email string ) (* database.User , error ) {
31+ return & database.User {ID : "user123" , Email : email , Active : true }, nil
32+ }
33+ func (m * MockDatabaseManager ) GetUserByID (userID string ) (* database.User , error ) {
34+ return & database.User {ID : userID , Username : "testuser" , Active : true }, nil
35+ }
36+ func (m * MockDatabaseManager ) ValidatePassword (user * database.User , password string ) bool { return true }
37+ func (m * MockDatabaseManager ) UpdateLastLogin (userID string ) error { return nil }
38+ func (m * MockDatabaseManager ) UpdateUserProfile (userID , firstName , lastName , organization string ) error { return nil }
39+ func (m * MockDatabaseManager ) UpdatePassword (userID , passwordHash string ) error { return nil }
40+ func (m * MockDatabaseManager ) CreateAPIKey (userID , name , keyHash , keyPrefix string , permissions []string ) (string , error ) { return "key123" , nil }
41+ func (m * MockDatabaseManager ) GetUserPermissions (userID string ) ([]string , error ) { return []string {"read" , "write" }, nil }
42+ func (m * MockDatabaseManager ) GetAPIKeyByHash (keyHash string ) (* database.APIKey , error ) { return nil , nil }
43+ func (m * MockDatabaseManager ) UpdateAPIKeyUsage (keyID string ) error { return nil }
44+ func (m * MockDatabaseManager ) ListAPIKeys (userID string ) ([]* database.APIKey , error ) { return nil , nil }
45+ func (m * MockDatabaseManager ) RevokeAPIKey (keyID string ) error { return nil }
46+ func (m * MockDatabaseManager ) LogInferenceRequest (userID , modelID string , requestData , responseData map [string ]interface {}, status string , errorMessage * string , tokensUsed , processingTimeMs int , cost float64 ) error { return nil }
47+
48+ func init () {
49+ // Generate test RSA key pair
50+ privateKey , err := rsa .GenerateKey (rand .Reader , 2048 )
51+ if err != nil {
52+ panic ("Failed to generate test RSA key pair" )
53+ }
54+ testPrivateKey = privateKey
55+ testPublicKey = & privateKey .PublicKey
56+
57+ // Create test database manager
58+ dbManager := & MockDatabaseManager {}
59+
60+ // Create test server
61+ testServer = & AuthServiceServer {
62+ dbManager : dbManager ,
63+ privateKey : testPrivateKey ,
64+ publicKey : testPublicKey ,
65+ blacklist : make (map [string ]time.Time ),
66+ }
67+ }
1268
1369func generateTestToken (claims jwt.MapClaims ) (string , error ) {
14- token := jwt .NewWithClaims (jwt .SigningMethodHS256 , claims )
15- return token .SignedString (testKey )
70+ token := jwt .NewWithClaims (jwt .SigningMethodRS256 , claims )
71+ return token .SignedString (testPrivateKey )
1672}
1773
1874func TestValidateTokenWithValidUUIDv4 (t * testing.T ) {
1975 validUUID := uuid .New ().String ()
20- claims := jwt.MapClaims {"jti" : validUUID , "sub" : "user123" }
76+ claims := jwt.MapClaims {"jti" : validUUID , "sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
2177 tokenString , _ := generateTestToken (claims )
2278
23- _ , err := ValidateToken (tokenString )
79+ req := & auth.ValidateTokenRequest {Token : tokenString }
80+ resp , err := testServer .ValidateToken (context .Background (), req )
2481 if err != nil {
2582 t .Fatalf ("Expected no error, got %v" , err )
2683 }
84+ if ! resp .Valid {
85+ t .Fatalf ("Expected valid token, got invalid" )
86+ }
2787}
2888
2989func TestValidateTokenWithInvalidUUIDFormat (t * testing.T ) {
3090 invalidUUID := "not-a-uuid"
31- claims := jwt.MapClaims {"jti" : invalidUUID , "sub" : "user123" }
91+ claims := jwt.MapClaims {"jti" : invalidUUID , "sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
3292 tokenString , _ := generateTestToken (claims )
3393
34- _ , err := ValidateToken (tokenString )
94+ req := & auth.ValidateTokenRequest {Token : tokenString }
95+ _ , err := testServer .ValidateToken (context .Background (), req )
3596 if err == nil {
3697 t .Fatal ("Expected error, got none" )
3798 }
38- expectedErr := status .Error (codes .Unauthenticated , "invalid JTI format" )
99+ expectedErr := status .Error (codes .InvalidArgument , "invalid JTI format" )
39100 if err .Error () != expectedErr .Error () {
40101 t .Fatalf ("Expected error %v, got %v" , expectedErr , err )
41102 }
42103}
43104
44105func TestValidateTokenWithMissingJTI (t * testing.T ) {
45- claims := jwt.MapClaims {"sub" : "user123" }
106+ claims := jwt.MapClaims {"sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
46107 tokenString , _ := generateTestToken (claims )
47108
48- _ , err := ValidateToken (tokenString )
109+ req := & auth.ValidateTokenRequest {Token : tokenString }
110+ resp , err := testServer .ValidateToken (context .Background (), req )
49111 if err != nil {
50112 t .Fatalf ("Expected no error, got %v" , err )
51113 }
114+ if ! resp .Valid {
115+ t .Fatalf ("Expected valid token, got invalid. Message: %s" , resp .Message )
116+ }
52117}
53118
54119func TestValidateTokenWithNonV4UUID (t * testing.T ) {
55120 nonV4UUID := "123e4567-e89b-11d3-a75a-426614174000" // UUID v1
56- claims := jwt.MapClaims {"jti" : nonV4UUID , "sub" : "user123" }
121+ claims := jwt.MapClaims {"jti" : nonV4UUID , "sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
57122 tokenString , _ := generateTestToken (claims )
58123
59- _ , err := ValidateToken (tokenString )
124+ req := & auth.ValidateTokenRequest {Token : tokenString }
125+ _ , err := testServer .ValidateToken (context .Background (), req )
60126 if err == nil {
61127 t .Fatal ("Expected error, got none" )
62128 }
63- expectedErr := status .Error (codes .Unauthenticated , "invalid JTI format" )
129+ expectedErr := status .Error (codes .InvalidArgument , "invalid JTI format" )
64130 if err .Error () != expectedErr .Error () {
65131 t .Fatalf ("Expected error %v, got %v" , expectedErr , err )
66132 }
67133}
68134
69135func TestRefreshTokenWithValidUUIDv4 (t * testing.T ) {
70136 validUUID := uuid .New ().String ()
71- claims := jwt.MapClaims {"jti" : validUUID , "sub" : "user123" }
137+ claims := jwt.MapClaims {"jti" : validUUID , "sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
72138 tokenString , _ := generateTestToken (claims )
73139
74- _ , err := RefreshToken (tokenString )
140+ req := & auth.RefreshTokenRequest {RefreshToken : tokenString }
141+ _ , err := testServer .RefreshToken (context .Background (), req )
75142 if err != nil {
76143 t .Fatalf ("Expected no error, got %v" , err )
77144 }
78145}
79146
80147func TestRefreshTokenWithInvalidUUIDFormat (t * testing.T ) {
81148 invalidUUID := "not-a-uuid"
82- claims := jwt.MapClaims {"jti" : invalidUUID , "sub" : "user123" }
149+ claims := jwt.MapClaims {"jti" : invalidUUID , "sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
83150 tokenString , _ := generateTestToken (claims )
84151
85- _ , err := RefreshToken (tokenString )
152+ req := & auth.RefreshTokenRequest {RefreshToken : tokenString }
153+ _ , err := testServer .RefreshToken (context .Background (), req )
86154 if err == nil {
87155 t .Fatal ("Expected error, got none" )
88156 }
@@ -94,10 +162,11 @@ func TestRefreshTokenWithInvalidUUIDFormat(t *testing.T) {
94162
95163func TestRefreshTokenWithNonV4UUID (t * testing.T ) {
96164 nonV4UUID := "123e4567-e89b-11d3-a75a-426614174000" // UUID v1
97- claims := jwt.MapClaims {"jti" : nonV4UUID , "sub" : "user123" }
165+ claims := jwt.MapClaims {"jti" : nonV4UUID , "sub" : "user123" , "username" : "testuser" , "exp" : float64 ( time . Now (). Add ( time . Hour ). Unix ()) }
98166 tokenString , _ := generateTestToken (claims )
99167
100- _ , err := RefreshToken (tokenString )
168+ req := & auth.RefreshTokenRequest {RefreshToken : tokenString }
169+ _ , err := testServer .RefreshToken (context .Background (), req )
101170 if err == nil {
102171 t .Fatal ("Expected error, got none" )
103172 }
0 commit comments