35f5084005
git-subtree-dir: backend git-subtree-mainline:dc11190527git-subtree-split:acae976622
94 lines
2.9 KiB
Go
94 lines
2.9 KiB
Go
package monitoring
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestStore_RecordAndSummary(t *testing.T) {
|
|
s := NewStore()
|
|
|
|
s.Record(RequestRecord{Time: time.Now(), Method: "GET", Path: "/x", StatusCode: 200, DurationMs: 10})
|
|
s.Record(RequestRecord{Time: time.Now(), Method: "GET", Path: "/x", StatusCode: 500, DurationMs: 20})
|
|
|
|
sum := s.Summary()
|
|
if sum.TotalRequests != 2 {
|
|
t.Fatalf("expected 2 total requests, got %d", sum.TotalRequests)
|
|
}
|
|
if sum.TotalErrors != 1 {
|
|
t.Fatalf("expected 1 error (status>=400), got %d", sum.TotalErrors)
|
|
}
|
|
if sum.ErrorRatePct != 50 {
|
|
t.Fatalf("expected 50%% error rate, got %v", sum.ErrorRatePct)
|
|
}
|
|
if sum.AvgLatencyMs != 15 {
|
|
t.Fatalf("expected avg latency 15ms, got %v", sum.AvgLatencyMs)
|
|
}
|
|
}
|
|
|
|
func TestStore_RecentOrder(t *testing.T) {
|
|
s := NewStore()
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/1", StatusCode: 200})
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/2", StatusCode: 200})
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/3", StatusCode: 200})
|
|
|
|
recent := s.Recent(10)
|
|
if len(recent) != 3 {
|
|
t.Fatalf("expected 3 records, got %d", len(recent))
|
|
}
|
|
// جدیدترین باید اول باشه
|
|
if recent[0].Path != "/3" || recent[1].Path != "/2" || recent[2].Path != "/1" {
|
|
t.Fatalf("expected newest-first order, got %+v", recent)
|
|
}
|
|
}
|
|
|
|
func TestStore_RecentLimit(t *testing.T) {
|
|
s := NewStore()
|
|
for i := 0; i < 5; i++ {
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/x", StatusCode: 200})
|
|
}
|
|
if got := len(s.Recent(2)); got != 2 {
|
|
t.Fatalf("expected limit of 2, got %d", got)
|
|
}
|
|
if got := len(s.Recent(100)); got != 5 {
|
|
t.Fatalf("expected all 5 when limit exceeds count, got %d", got)
|
|
}
|
|
}
|
|
|
|
func TestStore_RingBufferWraparound(t *testing.T) {
|
|
s := NewStore()
|
|
// بیشتر از ظرفیت بافر ثبت میکنیم تا رفتار wraparound رو تست کنیم
|
|
for i := 0; i < bufferSize+50; i++ {
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/x", StatusCode: 200, DurationMs: 1})
|
|
}
|
|
|
|
sum := s.Summary()
|
|
if sum.TotalRequests != int64(bufferSize+50) {
|
|
t.Fatalf("expected total requests to keep counting past buffer size, got %d", sum.TotalRequests)
|
|
}
|
|
|
|
recent := s.Recent(bufferSize + 100)
|
|
if len(recent) != bufferSize {
|
|
t.Fatalf("expected Recent to be capped at bufferSize (%d), got %d", bufferSize, len(recent))
|
|
}
|
|
}
|
|
|
|
func TestStore_RecentByUser(t *testing.T) {
|
|
s := NewStore()
|
|
uidA := uint(1)
|
|
uidB := uint(2)
|
|
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/a1", UserID: &uidA})
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/b1", UserID: &uidB})
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/a2", UserID: &uidA})
|
|
s.Record(RequestRecord{Time: time.Now(), Path: "/none"}) // بدون کاربر (مثل OTP)
|
|
|
|
got := s.RecentByUser(uidA, 10)
|
|
if len(got) != 2 {
|
|
t.Fatalf("expected 2 records for user A, got %d", len(got))
|
|
}
|
|
if got[0].Path != "/a2" || got[1].Path != "/a1" {
|
|
t.Fatalf("expected newest-first order for user A, got %+v", got)
|
|
}
|
|
}
|