Files
gochat/internal/repository/reporting_events_rollup_repo_test.go
T
2026-06-04 15:44:48 +08:00

174 lines
7.3 KiB
Go

package repository
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/gochat/gochat/internal/model"
)
// helper: build a minimal valid ReportingEventsRollup
func newTestRollup(accountID uint, date time.Time, dimType model.DimensionType, dimID uint, metric model.RollupMetric, count int64, sum float64) *model.ReportingEventsRollup {
return &model.ReportingEventsRollup{
AccountID: accountID,
Date: date,
DimensionType: dimType,
DimensionID: dimID,
Metric: metric,
Count: count,
SumValue: sum,
SumValueBusinessHours: sum * 0.5,
}
}
// ========== Create ==========
func TestReportingEventsRollupRepo_Create(t *testing.T) {
db := setupTestDB(t, &model.ReportingEventsRollup{})
repo := NewReportingEventsRollupRepo(db)
date := time.Date(2026, 5, 20, 0, 0, 0, 0, time.UTC)
rollup := newTestRollup(1, date, model.DimensionAccount, 1, model.MetricFirstResponse, 10, 120.5)
err := repo.Create(context.Background(), rollup)
require.NoError(t, err)
assert.NotZero(t, rollup.ID, "ID should be set after Create")
assert.Equal(t, uint(1), rollup.AccountID)
assert.Equal(t, model.DimensionAccount, rollup.DimensionType)
assert.Equal(t, model.MetricFirstResponse, rollup.Metric)
assert.Equal(t, int64(10), rollup.Count)
assert.Equal(t, 120.5, rollup.SumValue)
}
// ========== FindByAccountAndDateRange ==========
func TestReportingEventsRollupRepo_FindByAccountAndDateRange(t *testing.T) {
db := setupTestDB(t, &model.ReportingEventsRollup{})
repo := NewReportingEventsRollupRepo(db)
since := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC)
until := time.Date(2026, 5, 31, 0, 0, 0, 0, time.UTC)
// Insert rollups inside the range
r1 := newTestRollup(1, time.Date(2026, 5, 10, 0, 0, 0, 0, time.UTC), model.DimensionAccount, 1, model.MetricFirstResponse, 5, 60.0)
r2 := newTestRollup(1, time.Date(2026, 5, 20, 0, 0, 0, 0, time.UTC), model.DimensionAgent, 2, model.MetricReplyTime, 8, 90.0)
require.NoError(t, repo.Create(context.Background(), r1))
require.NoError(t, repo.Create(context.Background(), r2))
// Insert a rollup outside the range (different account)
r3 := newTestRollup(2, time.Date(2026, 5, 15, 0, 0, 0, 0, time.UTC), model.DimensionAccount, 2, model.MetricFirstResponse, 3, 30.0)
require.NoError(t, repo.Create(context.Background(), r3))
results, err := repo.FindByAccountAndDateRange(context.Background(), 1, since, until)
require.NoError(t, err)
assert.Len(t, results, 2, "should return 2 rollups for account 1 in date range")
// Verify both rollups belong to account 1
for _, r := range results {
assert.Equal(t, uint(1), r.AccountID)
}
}
func TestReportingEventsRollupRepo_FindByAccountAndDateRange_NoResults(t *testing.T) {
db := setupTestDB(t, &model.ReportingEventsRollup{})
repo := NewReportingEventsRollupRepo(db)
since := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC)
until := time.Date(2026, 5, 31, 0, 0, 0, 0, time.UTC)
// Insert rollup for a different account
r1 := newTestRollup(99, time.Date(2026, 5, 10, 0, 0, 0, 0, time.UTC), model.DimensionAccount, 99, model.MetricFirstResponse, 5, 60.0)
require.NoError(t, repo.Create(context.Background(), r1))
results, err := repo.FindByAccountAndDateRange(context.Background(), 1, since, until)
require.NoError(t, err)
assert.Empty(t, results, "should return no rollups for account 1 when none exist")
}
// ========== FindByMetric ==========
func TestReportingEventsRollupRepo_FindByMetric(t *testing.T) {
db := setupTestDB(t, &model.ReportingEventsRollup{})
repo := NewReportingEventsRollupRepo(db)
since := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC)
until := time.Date(2026, 5, 31, 0, 0, 0, 0, time.UTC)
// Insert rollups with different metrics
r1 := newTestRollup(1, time.Date(2026, 5, 10, 0, 0, 0, 0, time.UTC), model.DimensionAccount, 1, model.MetricFirstResponse, 5, 60.0)
r2 := newTestRollup(1, time.Date(2026, 5, 15, 0, 0, 0, 0, time.UTC), model.DimensionAgent, 2, model.MetricReplyTime, 8, 90.0)
r3 := newTestRollup(1, time.Date(2026, 5, 20, 0, 0, 0, 0, time.UTC), model.DimensionAccount, 1, model.MetricFirstResponse, 12, 144.0)
require.NoError(t, repo.Create(context.Background(), r1))
require.NoError(t, repo.Create(context.Background(), r2))
require.NoError(t, repo.Create(context.Background(), r3))
results, err := repo.FindByMetric(context.Background(), 1, model.MetricFirstResponse, since, until)
require.NoError(t, err)
assert.Len(t, results, 2, "should return 2 rollups with MetricFirstResponse")
for _, r := range results {
assert.Equal(t, model.MetricFirstResponse, r.Metric)
assert.Equal(t, uint(1), r.AccountID)
}
}
// ========== FindByDimension ==========
func TestReportingEventsRollupRepo_FindByDimension(t *testing.T) {
db := setupTestDB(t, &model.ReportingEventsRollup{})
repo := NewReportingEventsRollupRepo(db)
since := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC)
until := time.Date(2026, 5, 31, 0, 0, 0, 0, time.UTC)
// Insert rollups with different dimensions
r1 := newTestRollup(1, time.Date(2026, 5, 10, 0, 0, 0, 0, time.UTC), model.DimensionAgent, 5, model.MetricFirstResponse, 7, 84.0)
r2 := newTestRollup(1, time.Date(2026, 5, 15, 0, 0, 0, 0, time.UTC), model.DimensionInbox, 3, model.MetricReplyTime, 4, 40.0)
r3 := newTestRollup(1, time.Date(2026, 5, 20, 0, 0, 0, 0, time.UTC), model.DimensionAgent, 5, model.MetricReplyTime, 6, 72.0)
require.NoError(t, repo.Create(context.Background(), r1))
require.NoError(t, repo.Create(context.Background(), r2))
require.NoError(t, repo.Create(context.Background(), r3))
results, err := repo.FindByDimension(context.Background(), 1, model.DimensionAgent, 5, since, until)
require.NoError(t, err)
assert.Len(t, results, 2, "should return 2 rollups for DimensionAgent/5")
for _, r := range results {
assert.Equal(t, model.DimensionAgent, r.DimensionType)
assert.Equal(t, uint(5), r.DimensionID)
assert.Equal(t, uint(1), r.AccountID)
}
}
// ========== AggregateSummary ==========
func TestReportingEventsRollupRepo_AggregateSummary(t *testing.T) {
skipIfSQLite(t) // AggregateSummary uses PG-specific aggregation queries
db := setupTestDB(t, &model.ReportingEventsRollup{})
repo := NewReportingEventsRollupRepo(db)
since := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC)
until := time.Date(2026, 5, 31, 0, 0, 0, 0, time.UTC)
// Insert rollups for the same dimension type across different dates
r1 := newTestRollup(1, time.Date(2026, 5, 5, 0, 0, 0, 0, time.UTC), model.DimensionAgent, 10, model.MetricFirstResponse, 5, 50.0)
r2 := newTestRollup(1, time.Date(2026, 5, 10, 0, 0, 0, 0, time.UTC), model.DimensionAgent, 10, model.MetricFirstResponse, 8, 80.0)
r3 := newTestRollup(1, time.Date(2026, 5, 20, 0, 0, 0, 0, time.UTC), model.DimensionInbox, 3, model.MetricFirstResponse, 3, 30.0)
require.NoError(t, repo.Create(context.Background(), r1))
require.NoError(t, repo.Create(context.Background(), r2))
require.NoError(t, repo.Create(context.Background(), r3))
results, err := repo.AggregateSummary(context.Background(), 1, model.DimensionAgent, since, until)
require.NoError(t, err)
assert.Len(t, results, 2, "should return 2 rollups for DimensionAgent across the date range")
for _, r := range results {
assert.Equal(t, uint(1), r.AccountID)
assert.Equal(t, model.DimensionAgent, r.DimensionType)
}
}