135 lines
3.4 KiB
Go
135 lines
3.4 KiB
Go
package workers
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"go.uber.org/zap"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func setupTestDB(t *testing.T) *gorm.DB {
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatalf("Failed to open test database: %v", err)
|
|
}
|
|
|
|
// Créer la table analytics_events
|
|
if err := db.Exec(`
|
|
CREATE TABLE analytics_events (
|
|
id TEXT PRIMARY KEY,
|
|
event_name TEXT NOT NULL,
|
|
user_id TEXT,
|
|
payload TEXT NOT NULL,
|
|
created_at DATETIME NOT NULL
|
|
)
|
|
`).Error; err != nil {
|
|
t.Fatalf("Failed to create test table: %v", err)
|
|
}
|
|
|
|
return db
|
|
}
|
|
|
|
func TestAnalyticsJob_Execute(t *testing.T) {
|
|
logger := zap.NewNop()
|
|
ctx := context.Background()
|
|
db := setupTestDB(t)
|
|
|
|
// Test 1: Enregistrement d'événement avec userID
|
|
t.Run("Record event with user ID", func(t *testing.T) {
|
|
userID := uuid.New()
|
|
payload := map[string]interface{}{
|
|
"action": "track_play",
|
|
"track_id": uuid.New().String(),
|
|
}
|
|
|
|
job := NewAnalyticsEventJob("track_play", &userID, payload)
|
|
|
|
err := job.Execute(ctx, db, logger)
|
|
if err != nil {
|
|
t.Fatalf("Expected no error, got: %v", err)
|
|
}
|
|
|
|
// Vérifier que l'événement a été enregistré
|
|
var event AnalyticsEvent
|
|
if err := db.First(&event, "event_name = ?", "track_play").Error; err != nil {
|
|
t.Fatalf("Failed to find recorded event: %v", err)
|
|
}
|
|
|
|
if event.EventName != "track_play" {
|
|
t.Errorf("Expected event_name 'track_play', got '%s'", event.EventName)
|
|
}
|
|
if event.UserID == nil || *event.UserID != userID {
|
|
t.Errorf("Expected user_id %s, got %v", userID, event.UserID)
|
|
}
|
|
})
|
|
|
|
// Test 2: Enregistrement d'événement anonyme (sans userID)
|
|
t.Run("Record anonymous event", func(t *testing.T) {
|
|
payload := map[string]interface{}{
|
|
"action": "page_view",
|
|
"path": "/tracks",
|
|
}
|
|
|
|
job := NewAnalyticsEventJob("page_view", nil, payload)
|
|
|
|
err := job.Execute(ctx, db, logger)
|
|
if err != nil {
|
|
t.Fatalf("Expected no error, got: %v", err)
|
|
}
|
|
|
|
// Vérifier que l'événement a été enregistré
|
|
var event AnalyticsEvent
|
|
if err := db.First(&event, "event_name = ?", "page_view").Error; err != nil {
|
|
t.Fatalf("Failed to find recorded event: %v", err)
|
|
}
|
|
|
|
if event.UserID != nil {
|
|
t.Errorf("Expected nil user_id for anonymous event, got %v", event.UserID)
|
|
}
|
|
})
|
|
|
|
// Test 3: Événement sans nom
|
|
t.Run("Fail when event name is empty", func(t *testing.T) {
|
|
job := NewAnalyticsEventJob("", nil, nil)
|
|
|
|
err := job.Execute(ctx, db, logger)
|
|
if err == nil {
|
|
t.Fatal("Expected error for empty event name, got nil")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestNewAnalyticsJob(t *testing.T) {
|
|
t.Run("Create job with all fields", func(t *testing.T) {
|
|
userID := uuid.New()
|
|
payload := map[string]interface{}{
|
|
"key": "value",
|
|
}
|
|
|
|
job := NewAnalyticsEventJob("test_event", &userID, payload)
|
|
|
|
if job.EventName != "test_event" {
|
|
t.Errorf("Expected EventName 'test_event', got '%s'", job.EventName)
|
|
}
|
|
if job.UserID == nil || *job.UserID != userID {
|
|
t.Errorf("Expected UserID %s, got %v", userID, job.UserID)
|
|
}
|
|
if job.Payload["key"] != "value" {
|
|
t.Errorf("Expected payload key 'value', got '%v'", job.Payload["key"])
|
|
}
|
|
})
|
|
|
|
t.Run("Create job with nil payload", func(t *testing.T) {
|
|
job := NewAnalyticsEventJob("test_event", nil, nil)
|
|
|
|
if job.Payload == nil {
|
|
t.Fatal("Expected non-nil payload map, got nil")
|
|
}
|
|
if len(job.Payload) != 0 {
|
|
t.Errorf("Expected empty payload map, got %d items", len(job.Payload))
|
|
}
|
|
})
|
|
}
|