Skip to content

Commit 06e1e15

Browse files
committed
add first stats service tests
1 parent d2f8e46 commit 06e1e15

1 file changed

Lines changed: 132 additions & 3 deletions

File tree

pkg/services/stats/service_test.go

Lines changed: 132 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,138 @@
1+
//go:build test && !race && chdb
2+
13
package stats
24

3-
import "testing"
5+
import (
6+
"context"
7+
"io"
8+
"testing"
9+
"time"
10+
11+
"github.com/prismelabs/analytics/pkg/log"
12+
"github.com/prismelabs/analytics/pkg/services/eventdb"
13+
"github.com/prismelabs/analytics/pkg/services/eventstore"
14+
"github.com/prismelabs/analytics/pkg/services/teardown"
15+
"github.com/prismelabs/analytics/pkg/testutils/faker"
16+
"github.com/prometheus/client_golang/prometheus"
17+
"github.com/stretchr/testify/require"
18+
)
19+
20+
func TestIntegNoRaceDetectorService(t *testing.T) {
21+
if testing.Short() {
22+
t.SkipNow()
23+
}
24+
25+
var (
26+
cfg = eventstore.Config{
27+
MaxBatchSize: 1,
28+
MaxBatchTimeout: time.Microsecond,
29+
RingBuffersFactor: 100,
30+
}
31+
db eventdb.Service
32+
err error
33+
promRegistry *prometheus.Registry
34+
stats Service
35+
store eventstore.Service
36+
ctx = context.Background()
37+
)
38+
39+
forEachEventStoreBackend := func(t *testing.T, test func(t *testing.T)) {
40+
eventdb.ForEachDriver(t, func(edb eventdb.Service) {
41+
promRegistry = prometheus.NewRegistry()
42+
teardown := teardown.NewService()
43+
db = edb
44+
45+
_ = io.Discard
46+
t.Run(edb.DriverName(), func(t *testing.T) {
47+
store, err = eventstore.NewService(
48+
cfg,
49+
db,
50+
log.New("stats-test", io.Discard, false),
51+
promRegistry,
52+
teardown,
53+
)
54+
stats = NewService(db, teardown)
55+
require.NoError(t, err)
56+
test(t)
57+
require.NoError(t, teardown.Teardown())
58+
})
59+
})
60+
}
61+
62+
t.Run("Visitors/Sessions/Pageviews", func(t *testing.T) {
63+
forEachEventStoreBackend(t, func(t *testing.T) {
64+
df, err := stats.Visitors(ctx, Filters{})
65+
require.NoError(t, err)
66+
require.Len(t, df.Keys, 0)
67+
68+
df, err = stats.Sessions(ctx, Filters{})
69+
require.NoError(t, err)
70+
require.Len(t, df.Keys, 0)
71+
72+
df, err = stats.PageViews(ctx, Filters{})
73+
require.NoError(t, err)
74+
require.Len(t, df.Keys, 0)
75+
76+
df, err = stats.LiveVisitors(ctx, Filters{})
77+
require.NoError(t, err)
78+
require.Len(t, df.Keys, 0)
479

5-
func TestService(t *testing.T) {
6-
t.Run("", func(t *testing.T) {
80+
df, err = stats.Bounces(ctx, Filters{})
81+
require.NoError(t, err)
82+
require.Len(t, df.Keys, 0)
783

84+
// Session 1.
85+
now := time.Now()
86+
session := faker.Session()
87+
visitorId := session.VisitorId
88+
session.SessionUuid = faker.UuidV7(now)
89+
session.PageviewCount++
90+
pv := faker.PageView(session)
91+
require.NoError(t, store.StorePageView(ctx, &pv))
92+
93+
// Session 2.
94+
{
95+
session := faker.Session()
96+
session.VisitorId = visitorId
97+
session.SessionUuid = faker.UuidV7(now)
98+
for range 2 {
99+
session.PageviewCount++
100+
pv := faker.PageView(session)
101+
require.NoError(t, store.StorePageView(ctx, &pv))
102+
}
103+
}
104+
105+
time.Sleep(time.Second)
106+
107+
df, err = stats.Visitors(ctx, Filters{})
108+
require.NoError(t, err)
109+
require.GreaterOrEqual(t, len(df.Keys), 1)
110+
require.EqualValues(t, 1, sum(df.Values))
111+
112+
df, err = stats.Sessions(ctx, Filters{})
113+
require.NoError(t, err)
114+
require.GreaterOrEqual(t, len(df.Keys), 1)
115+
require.EqualValues(t, 2, sum(df.Values))
116+
117+
df, err = stats.PageViews(ctx, Filters{})
118+
require.NoError(t, err)
119+
require.EqualValues(t, 3, sum(df.Values))
120+
121+
df, err = stats.LiveVisitors(ctx, Filters{})
122+
require.NoError(t, err)
123+
require.EqualValues(t, 1, sum(df.Values))
124+
125+
df, err = stats.Bounces(ctx, Filters{})
126+
require.NoError(t, err)
127+
require.EqualValues(t, 1, sum(df.Values))
128+
})
8129
})
9130
}
131+
132+
func sum(s []uint64) uint64 {
133+
var sum uint64 = 0
134+
for _, i := range s {
135+
sum += i
136+
}
137+
return sum
138+
}

0 commit comments

Comments
 (0)