fetch_ml/tests/unit/metrics/metrics_test.go
Jeremie Fraeys c980167041 test: implement comprehensive test suite with multiple test types
- Add end-to-end tests for complete workflow validation
- Include integration tests for API and database interactions
- Add unit tests for all major components and utilities
- Include performance tests for payload handling
- Add CLI API integration tests
- Include Podman container integration tests
- Add WebSocket and queue execution tests
- Include shell script tests for setup validation

Provides comprehensive test coverage ensuring platform reliability
and functionality across all components and interactions.
2025-12-04 16:55:13 -05:00

136 lines
3.3 KiB
Go

package tests
import (
"testing"
"time"
"github.com/jfraeys/fetch_ml/internal/metrics"
)
func TestMetrics_RecordTaskSuccess(t *testing.T) {
m := &metrics.Metrics{}
duration := 5 * time.Second
m.RecordTaskSuccess(duration)
if m.TasksProcessed.Load() != 1 {
t.Errorf("Expected 1 task processed, got %d", m.TasksProcessed.Load())
}
if m.TasksFailed.Load() != 0 {
t.Errorf("Expected 0 tasks failed, got %d", m.TasksFailed.Load())
}
}
func TestMetrics_RecordTaskFailure(t *testing.T) {
m := &metrics.Metrics{}
m.RecordTaskFailure()
if m.TasksProcessed.Load() != 0 {
t.Errorf("Expected 0 tasks processed, got %d", m.TasksProcessed.Load())
}
if m.TasksFailed.Load() != 1 {
t.Errorf("Expected 1 task failed, got %d", m.TasksFailed.Load())
}
}
func TestMetrics_RecordTaskStart(t *testing.T) {
m := &metrics.Metrics{}
m.RecordTaskStart()
if m.ActiveTasks.Load() != 1 {
t.Errorf("Expected 1 active task, got %d", m.ActiveTasks.Load())
}
}
func TestMetrics_RecordDataTransfer(t *testing.T) {
m := &metrics.Metrics{}
bytes := int64(1024 * 1024 * 1024) // 1GB
duration := 10 * time.Second
m.RecordDataTransfer(bytes, duration)
if m.DataTransferred.Load() != bytes {
t.Errorf("Expected %d bytes transferred, got %d", bytes, m.DataTransferred.Load())
}
if m.DataFetchTime.Load() != duration.Nanoseconds() {
t.Errorf("Expected %d nanoseconds fetch time, got %d",
duration.Nanoseconds(), m.DataFetchTime.Load())
}
}
func TestMetrics_SetQueuedTasks(t *testing.T) {
m := &metrics.Metrics{}
m.SetQueuedTasks(5)
if m.QueuedTasks.Load() != 5 {
t.Errorf("Expected 5 queued tasks, got %d", m.QueuedTasks.Load())
}
}
func TestMetrics_GetStats(t *testing.T) {
m := &metrics.Metrics{}
// Record some data
m.RecordTaskStart()
m.RecordTaskSuccess(5 * time.Second)
m.RecordTaskFailure()
m.RecordDataTransfer(1024*1024*1024, 10*time.Second)
m.SetQueuedTasks(3)
stats := m.GetStats()
// Check all expected fields exist
expectedFields := []string{
"tasks_processed", "tasks_failed", "active_tasks",
"queued_tasks", "success_rate", "avg_exec_time",
"data_transferred_gb", "avg_fetch_time",
}
for _, field := range expectedFields {
if _, exists := stats[field]; !exists {
t.Errorf("Expected field %s in stats", field)
}
}
// Check values
if stats["tasks_processed"] != int64(1) {
t.Errorf("Expected 1 task processed, got %v", stats["tasks_processed"])
}
if stats["tasks_failed"] != int64(1) {
t.Errorf("Expected 1 task failed, got %v", stats["tasks_failed"])
}
if stats["active_tasks"] != int64(1) {
t.Errorf("Expected 1 active task, got %v", stats["active_tasks"])
}
if stats["queued_tasks"] != int64(3) {
t.Errorf("Expected 3 queued tasks, got %v", stats["queued_tasks"])
}
successRate := stats["success_rate"].(float64)
if successRate != 0.0 { // (1 success - 1 failure) / 1 processed = 0.0
t.Errorf("Expected success rate 0.0, got %f", successRate)
}
}
func TestMetrics_GetStatsEmpty(t *testing.T) {
m := &metrics.Metrics{}
stats := m.GetStats()
// Should not panic and should return zero values
if stats["tasks_processed"] != int64(0) {
t.Errorf("Expected 0 tasks processed, got %v", stats["tasks_processed"])
}
if stats["success_rate"] != 0.0 {
t.Errorf("Expected success rate 0.0, got %v", stats["success_rate"])
}
}