package workers import ( "context" "testing" "time" "veza-backend-api/internal/email" "veza-backend-api/internal/services" "go.uber.org/zap" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func setupTestJobWorker(t *testing.T) (*JobWorker, *gorm.DB) { // Base de données de test en mémoire db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatalf("Failed to open test database: %v", err) } logger, _ := zap.NewDevelopment() jobService := services.NewJobService(logger) // Config SMTP de test (mock) smtpConfig := email.SMTPConfig{ Host: "localhost", Port: "1025", Username: "test", Password: "test", From: "test@example.com", } emailSender := email.NewSMTPEmailSender(smtpConfig, logger) worker := NewJobWorker( db, jobService, logger, 10, // queueSize 1, // workers 3, // maxRetries emailSender, ) return worker, db } func TestJobWorker_Enqueue(t *testing.T) { worker, _ := setupTestJobWorker(t) job := Job{ Type: "email", Priority: 2, Payload: map[string]interface{}{ "to": "test@example.com", "subject": "Test", "body": "Test body", }, } worker.Enqueue(job) stats := worker.GetStats() queueSize := stats["queue_size"].(int) if queueSize != 1 { t.Errorf("Expected queue size to be 1, got %d", queueSize) } } func TestJobWorker_EnqueueEmailJob(t *testing.T) { worker, _ := setupTestJobWorker(t) worker.EnqueueEmailJob("test@example.com", "Test Subject", "Test Body") stats := worker.GetStats() queueSize := stats["queue_size"].(int) if queueSize != 1 { t.Errorf("Expected queue size to be 1, got %d", queueSize) } } func TestJobWorker_EnqueueEmailJobWithTemplate(t *testing.T) { worker, _ := setupTestJobWorker(t) templateData := map[string]interface{}{ "Username": "testuser", "ResetURL": "http://localhost/reset?token=abc123", } worker.EnqueueEmailJobWithTemplate( "test@example.com", "Reset Password", "password_reset", templateData, ) stats := worker.GetStats() queueSize := stats["queue_size"].(int) if queueSize != 1 { t.Errorf("Expected queue size to be 1, got %d", queueSize) } } func TestJobWorker_Start(t *testing.T) { worker, _ := setupTestJobWorker(t) ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Démarrer le worker worker.Start(ctx) // Enqueue un job worker.EnqueueEmailJob("test@example.com", "Test", "Body") // Attendre un peu pour que le worker traite le job time.Sleep(100 * time.Millisecond) // Le job devrait être traité (queue vide ou en cours) stats := worker.GetStats() _ = stats // Vérifier que les stats sont disponibles }