1 package sinks
2
3 import (
4 "context"
5 "testing"
6
7 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
8 "github.com/stretchr/testify/assert"
9 )
10
11 type MockWriter struct{}
12
13 func (mw *MockWriter) SyncMetric(_, _, _ string) error {
14 return nil
15 }
16
17 func (mw *MockWriter) Write(_ []metrics.MeasurementEnvelope) error {
18 return nil
19 }
20
21 func TestNewMultiWriter(t *testing.T) {
22 input := []struct {
23 opts *CmdOpts
24 w bool
25 err bool
26 }{
27 {&CmdOpts{}, false, true},
28 {&CmdOpts{
29 Sinks: []string{"foo"},
30 }, false, true},
31 {&CmdOpts{
32 Sinks: []string{"jsonfile://test.json"},
33 }, true, false},
34 {&CmdOpts{
35 Sinks: []string{"jsonfile://test.json", "jsonfile://test1.json"},
36 }, true, false},
37 {&CmdOpts{
38 Sinks: []string{"prometheus://foo/"},
39 }, false, true},
40 {&CmdOpts{
41 Sinks: []string{"rpc://foo/"},
42 }, false, true},
43 {&CmdOpts{
44 Sinks: []string{"postgresql:///baz"},
45 }, false, true},
46 {&CmdOpts{
47 Sinks: []string{"foo:///"},
48 }, false, true},
49 }
50
51 for _, i := range input {
52 mw, err := NewSinkWriter(context.Background(), i.opts, metrics.GetDefaultMetrics())
53 if i.err {
54 assert.Error(t, err)
55 } else {
56 assert.NoError(t, err)
57 }
58 if i.w {
59 assert.NotNil(t, mw)
60 } else {
61 assert.Nil(t, mw)
62 }
63 }
64 }
65
66 func TestAddWriter(t *testing.T) {
67 mw := &MultiWriter{}
68 mockWriter := &MockWriter{}
69 mw.AddWriter(mockWriter)
70 assert.Equal(t, 1, len(mw.writers))
71 }
72
73 func TestSyncMetrics(t *testing.T) {
74 mw := &MultiWriter{}
75 mockWriter := &MockWriter{}
76 mw.AddWriter(mockWriter)
77 err := mw.SyncMetric("db", "metric", "op")
78 assert.NoError(t, err)
79 }
80
81 func TestWriteMeasurements(t *testing.T) {
82 mw := &MultiWriter{}
83 mockWriter := &MockWriter{}
84 mw.AddWriter(mockWriter)
85 err := mw.Write([]metrics.MeasurementEnvelope{{}})
86 assert.NoError(t, err)
87 }
88