diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-07 16:32:10 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-07 16:32:10 +0200 |
| commit | 3fd46f3977fb650974e5e936cba362c787c00637 (patch) | |
| tree | b49111ddd0b7af4a007bca6a304dba10efcd88ff /internal/metrics/sample_test.go | |
reimport this PoC
Diffstat (limited to 'internal/metrics/sample_test.go')
| -rw-r--r-- | internal/metrics/sample_test.go | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/internal/metrics/sample_test.go b/internal/metrics/sample_test.go new file mode 100644 index 0000000..2ffd78b --- /dev/null +++ b/internal/metrics/sample_test.go @@ -0,0 +1,160 @@ +package metrics + +import ( + "testing" + "time" +) + +func TestNewSample(t *testing.T) { + tests := []struct { + name string + metric string + labels map[string]string + value float64 + timestamp time.Time + wantNil bool + }{ + { + name: "with labels", + metric: "test_metric", + labels: map[string]string{"env": "prod", "host": "server1"}, + value: 42.5, + timestamp: time.Now(), + wantNil: false, + }, + { + name: "nil labels initialized", + metric: "test_metric", + labels: nil, + value: 100, + timestamp: time.Now(), + wantNil: false, + }, + { + name: "empty labels", + metric: "test_metric", + labels: map[string]string{}, + value: 0, + timestamp: time.Now(), + wantNil: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sample := NewSample(tt.metric, tt.labels, tt.value, tt.timestamp) + + if sample.MetricName != tt.metric { + t.Errorf("MetricName = %v, want %v", sample.MetricName, tt.metric) + } + if sample.Value != tt.value { + t.Errorf("Value = %v, want %v", sample.Value, tt.value) + } + if sample.Labels == nil { + t.Error("Labels should never be nil") + } + if !sample.Timestamp.Equal(tt.timestamp) { + t.Errorf("Timestamp = %v, want %v", sample.Timestamp, tt.timestamp) + } + }) + } +} + +func TestSample_Age(t *testing.T) { + tests := []struct { + name string + sample Sample + wantNear time.Duration + }{ + { + name: "recent sample", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-5 * time.Minute), + }, + wantNear: 5 * time.Minute, + }, + { + name: "old sample", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-1 * time.Hour), + }, + wantNear: 1 * time.Hour, + }, + { + name: "very recent", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-10 * time.Second), + }, + wantNear: 10 * time.Second, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + age := tt.sample.Age() + // Allow 1 second tolerance for test execution time + if age < tt.wantNear-time.Second || age > tt.wantNear+time.Second { + t.Errorf("Age() = %v, want near %v", age, tt.wantNear) + } + }) + } +} + +func TestSample_IsRecent(t *testing.T) { + threshold := 5 * time.Minute + + tests := []struct { + name string + sample Sample + threshold time.Duration + want bool + }{ + { + name: "within threshold", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-2 * time.Minute), + }, + threshold: threshold, + want: true, + }, + { + name: "beyond threshold", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-10 * time.Minute), + }, + threshold: threshold, + want: false, + }, + { + name: "exactly at threshold", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-5 * time.Minute), + }, + threshold: threshold, + want: false, + }, + { + name: "very recent", + sample: Sample{ + MetricName: "test", + Timestamp: time.Now().Add(-10 * time.Second), + }, + threshold: threshold, + want: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.sample.IsRecent(tt.threshold); got != tt.want { + t.Errorf("IsRecent() = %v, want %v (age: %v)", got, tt.want, tt.sample.Age()) + } + }) + } +} |
