174 lines
7.3 KiB
Go
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)
|
|
}
|
|
} |