package analytics_test import ( "context" "encoding/json" "testing" "tercul/internal/app/analytics" "time" "github.com/hibiken/asynq" "github.com/stretchr/testify/assert" ) type mockAsynqClient struct { asynq.Client enqueuedTasks []*asynq.Task } func (m *mockAsynqClient) EnqueueContext(ctx context.Context, task *asynq.Task, opts ...asynq.Option) (*asynq.TaskInfo, error) { m.enqueuedTasks = append(m.enqueuedTasks, task) return &asynq.TaskInfo{}, nil } func (m *mockAsynqClient) Close() error { return nil } func TestAsynqEventPublisher_Publish(t *testing.T) { mockClient := &mockAsynqClient{} publisher := analytics.NewEventPublisher(mockClient) workID := uint(123) userID := uint(456) event := analytics.AnalyticsEvent{ EventType: analytics.EventTypeWorkLiked, WorkID: &workID, UserID: &userID, Timestamp: time.Now(), } err := publisher.Publish(context.Background(), event) assert.NoError(t, err) assert.Len(t, mockClient.enqueuedTasks, 1) task := mockClient.enqueuedTasks[0] assert.Equal(t, string(analytics.EventTypeWorkLiked), task.Type()) var publishedEvent analytics.AnalyticsEvent err = json.Unmarshal(task.Payload(), &publishedEvent) assert.NoError(t, err) assert.Equal(t, event.EventType, publishedEvent.EventType) assert.Equal(t, *event.WorkID, *publishedEvent.WorkID) assert.Equal(t, *event.UserID, *publishedEvent.UserID) }