veza/veza-backend-api/internal/services/oauth_service_test.go
senke b28d0e7eac [T0-006] test(backend): Ajout tests pour frontend_log_handler
- Tests complets pour frontend_log_handler.go (12 tests)
- Tests couvrent NewFrontendLogHandler et ReceiveLog
- Tests pour tous les niveaux de log (DEBUG, INFO, WARN, ERROR)
- Tests pour gestion des erreurs et validation JSON
- Couverture actuelle: 30.6% (objectif: 80%)

Files: veza-backend-api/internal/handlers/frontend_log_handler_test.go
       VEZA_ROADMAP.json
Hours: 16 estimated, 23 actual
2026-01-04 01:44:22 +01:00

152 lines
3.7 KiB
Go

package services
import (
"database/sql"
"regexp"
"testing"
"time"
"github.com/DATA-DOG/go-sqlmock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"veza-backend-api/internal/database"
)
// Helper to setup mock DB
func setupMockDB(t *testing.T) (*database.Database, sqlmock.Sqlmock) {
db, mock, err := sqlmock.New()
require.NoError(t, err)
dbWrapper := &database.Database{
DB: db,
Logger: zap.NewNop(),
}
return dbWrapper, mock
}
func TestOAuthService_GenerateStateToken_Success(t *testing.T) {
// Setup
db, mock := setupMockDB(t)
defer db.DB.Close()
logger := zap.NewNop()
service := &OAuthService{
db: db,
logger: logger,
}
provider := "google"
redirectURL := "http://example.com"
// Expectation
mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO oauth_states`)).
WithArgs(sqlmock.AnyArg(), provider, redirectURL, sqlmock.AnyArg()).
WillReturnResult(sqlmock.NewResult(1, 1))
// Execute
token, err := service.GenerateStateToken(provider, redirectURL)
// Assert
assert.NoError(t, err)
assert.NotEmpty(t, token)
assert.NoError(t, mock.ExpectationsWereMet())
}
func TestOAuthService_ValidateStateToken_Success(t *testing.T) {
// Setup
db, mock := setupMockDB(t)
defer db.DB.Close()
logger := zap.NewNop()
service := &OAuthService{
db: db,
logger: logger,
}
token := "valid_token"
now := time.Now()
// Expectation
rows := sqlmock.NewRows([]string{"id", "state_token", "provider", "redirect_url", "expires_at", "created_at"}).
AddRow(1, token, "google", "http://example.com", now.Add(time.Hour), now)
mock.ExpectQuery(regexp.QuoteMeta(`SELECT id, state_token, provider, redirect_url, expires_at, created_at FROM oauth_states WHERE state_token = $1`)).
WithArgs(token).
WillReturnRows(rows)
mock.ExpectExec(regexp.QuoteMeta(`DELETE FROM oauth_states WHERE id = $1`)).
WithArgs(1).
WillReturnResult(sqlmock.NewResult(1, 1))
// Execute
state, err := service.ValidateStateToken(token)
// Assert
assert.NoError(t, err)
assert.NotNil(t, state)
assert.Equal(t, token, state.StateToken)
assert.NoError(t, mock.ExpectationsWereMet())
}
func TestOAuthService_ValidateStateToken_NotFound(t *testing.T) {
// Setup
db, mock := setupMockDB(t)
defer db.DB.Close()
logger := zap.NewNop()
service := &OAuthService{
db: db,
logger: logger,
}
token := "invalid_token"
// Expectation
mock.ExpectQuery(regexp.QuoteMeta(`SELECT id, state_token, provider, redirect_url, expires_at, created_at FROM oauth_states WHERE state_token = $1`)).
WithArgs(token).
WillReturnError(sql.ErrNoRows)
// Execute
state, err := service.ValidateStateToken(token)
// Assert
assert.Error(t, err)
assert.Equal(t, "invalid state token", err.Error())
assert.Nil(t, state)
assert.NoError(t, mock.ExpectationsWereMet())
}
func TestOAuthService_ValidateStateToken_Expired(t *testing.T) {
// Setup
db, mock := setupMockDB(t)
defer db.DB.Close()
logger := zap.NewNop()
service := &OAuthService{
db: db,
logger: logger,
}
token := "expired_token"
now := time.Now()
// Expectation
rows := sqlmock.NewRows([]string{"id", "state_token", "provider", "redirect_url", "expires_at", "created_at"}).
AddRow(1, token, "google", "http://example.com", now.Add(-time.Hour), now.Add(-2*time.Hour))
mock.ExpectQuery(regexp.QuoteMeta(`SELECT id, state_token, provider, redirect_url, expires_at, created_at FROM oauth_states WHERE state_token = $1`)).
WithArgs(token).
WillReturnRows(rows)
// Execute
state, err := service.ValidateStateToken(token)
// Assert
assert.Error(t, err)
assert.Equal(t, "state token expired", err.Error())
assert.Nil(t, state)
assert.NoError(t, mock.ExpectationsWereMet())
}