Files
wehub-resource-sync f99010fae1
CI / lint (push) Failing after 1s
CI / frontend (push) Failing after 1s
CI / scripts (push) Failing after 1s
CI / Go Test (ubuntu-latest) (push) Failing after 0s
CI / frontend-node-25 (push) Failing after 1s
CI / docs (push) Failing after 0s
CI / coverage (push) Failing after 0s
CI / e2e (push) Failing after 0s
Docker / build-and-push (push) Failing after 1s
CI / integration (push) Failing after 4m43s
CI / Go Test (windows-latest) (push) Has been cancelled
CI / Desktop Unit Tests (Windows) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux (arm64)) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Windows) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (aarch64)) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (x86_64)) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:36 +08:00

169 lines
5.5 KiB
Go

//go:build pgtest
package postgres
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.kenn.io/agentsview/internal/db"
)
func TestStoreGetTrendsTerms(t *testing.T) {
_, store := prepareUsageSchema(t, "agentsview_trends_terms_test")
ctx := context.Background()
_, err := store.DB().ExecContext(ctx, `
INSERT INTO sessions (
id, machine, project, agent, started_at, ended_at,
message_count, user_message_count
) VALUES (
'trends-pg-001', 'test-machine', 'alpha', 'claude',
'2024-06-01T09:00:00Z'::timestamptz,
'2024-06-01T10:00:00Z'::timestamptz,
3, 2
)`)
require.NoError(t, err, "insert session")
_, err = store.DB().ExecContext(ctx, `
INSERT INTO messages (
session_id, ordinal, role, content, timestamp,
content_length, is_system
) VALUES
('trends-pg-001', 0, 'user', 'load bearing seam',
'2024-06-01T09:00:00Z'::timestamptz, 17, FALSE),
('trends-pg-001', 1, 'assistant', 'load-bearing seams seam',
'2024-06-08T09:00:00Z'::timestamptz, 23, FALSE),
('trends-pg-001', 2, 'user', 'seam system',
'2024-06-08T09:00:00Z'::timestamptz, 11, TRUE)`)
require.NoError(t, err, "insert messages")
terms, err := db.ParseTrendTerms([]string{"load bearing | load-bearing", "seam"})
require.NoError(t, err, "ParseTrendTerms")
got, err := store.GetTrendsTerms(ctx, db.AnalyticsFilter{
From: "2024-06-01", To: "2024-06-09", Timezone: "UTC",
}, terms, "week")
require.NoError(t, err, "GetTrendsTerms")
assert.Equal(t, []string{"2024-05-27", "2024-06-03"},
trendBucketDates(got.Buckets))
assert.Equal(t, []int{1, 1},
trendBucketMessageCounts(got.Buckets))
assert.Equal(t, 2, got.MessageCount)
byTerm := trendSeriesByTerm(got.Series)
assert.Equal(t, 2, byTerm["load bearing"].Total)
assert.Equal(t, 3, byTerm["seam"].Total)
assert.Equal(t, []int{1, 1},
trendPointCounts(byTerm["load bearing"].Points))
assert.Equal(t, []int{1, 2},
trendPointCounts(byTerm["seam"].Points))
}
func TestStoreGetTrendsTermsUsesMessageTimestampFilters(t *testing.T) {
_, store := prepareUsageSchema(t, "agentsview_trends_terms_message_filters_test")
ctx := context.Background()
_, err := store.DB().ExecContext(ctx, `
INSERT INTO sessions (
id, machine, project, agent, started_at,
message_count, user_message_count
) VALUES (
'trends-pg-message-filters-001', 'test-machine',
'alpha', 'claude',
'2024-06-04T08:00:00Z'::timestamptz, 2, 2
)`)
require.NoError(t, err, "insert session")
_, err = store.DB().ExecContext(ctx, `
INSERT INTO messages (
session_id, ordinal, role, content, timestamp,
content_length, is_system
) VALUES
('trends-pg-message-filters-001', 0, 'user', 'seam',
'2024-06-05T09:00:00Z'::timestamptz, 4, FALSE),
('trends-pg-message-filters-001', 1, 'user', 'seam',
'2024-06-05T10:00:00Z'::timestamptz, 4, FALSE)`)
require.NoError(t, err, "insert messages")
terms, err := db.ParseTrendTerms([]string{"seam"})
require.NoError(t, err, "ParseTrendTerms")
dow := 2
hour := 9
got, err := store.GetTrendsTerms(ctx, db.AnalyticsFilter{
From: "2024-06-05",
To: "2024-06-05",
Timezone: "UTC",
DayOfWeek: &dow,
Hour: &hour,
}, terms, "day")
require.NoError(t, err, "GetTrendsTerms")
assert.Equal(t, 1, got.MessageCount)
assert.Equal(t, 1, trendSeriesByTerm(got.Series)["seam"].Total)
}
func TestStoreGetTrendsTermsModelFilterStaysOnMatchingMessages(
t *testing.T,
) {
_, store := prepareUsageSchema(t, "agentsview_trends_terms_model_messages_test")
ctx := context.Background()
_, err := store.DB().ExecContext(ctx, `
INSERT INTO sessions (
id, machine, project, agent, started_at,
message_count, user_message_count
) VALUES (
'trends-pg-model-messages-001', 'test-machine',
'alpha', 'claude',
'2024-06-01T09:00:00Z'::timestamptz, 3, 1
)`)
require.NoError(t, err, "insert session")
_, err = store.DB().ExecContext(ctx, `
INSERT INTO messages (
session_id, ordinal, role, content, timestamp,
content_length, is_system, model
) VALUES
('trends-pg-model-messages-001', 0, 'user', 'seam',
'2024-06-01T09:00:00Z'::timestamptz, 4, FALSE, ''),
('trends-pg-model-messages-001', 1, 'assistant', 'ready',
'2024-06-01T09:01:00Z'::timestamptz, 5, FALSE, 'gpt-4o'),
('trends-pg-model-messages-001', 2, 'assistant', 'seam seam',
'2024-06-01T09:05:00Z'::timestamptz, 9, FALSE, 'claude-3-5-sonnet')`)
require.NoError(t, err, "insert messages")
terms, err := db.ParseTrendTerms([]string{"seam"})
require.NoError(t, err, "ParseTrendTerms")
got, err := store.GetTrendsTerms(ctx, db.AnalyticsFilter{
From: "2024-06-01", To: "2024-06-01", Timezone: "UTC",
Model: "gpt-4o",
}, terms, "day")
require.NoError(t, err, "GetTrendsTerms")
assert.Equal(t, 2, got.MessageCount)
assert.Equal(t, 1, trendSeriesByTerm(got.Series)["seam"].Total)
}
func trendBucketDates(buckets []db.TrendBucket) []string {
dates := make([]string, len(buckets))
for i, bucket := range buckets {
dates[i] = bucket.Date
}
return dates
}
func trendBucketMessageCounts(buckets []db.TrendBucket) []int {
counts := make([]int, len(buckets))
for i, bucket := range buckets {
counts[i] = bucket.MessageCount
}
return counts
}
func trendSeriesByTerm(series []db.TrendSeries) map[string]db.TrendSeries {
byTerm := make(map[string]db.TrendSeries, len(series))
for _, entry := range series {
byTerm[entry.Term] = entry
}
return byTerm
}
func trendPointCounts(points []db.TrendPoint) []int {
counts := make([]int, len(points))
for i, point := range points {
counts[i] = point.Count
}
return counts
}