...
1 package sinks
2
3 import (
4 "context"
5 "encoding/json"
6 "os"
7 "testing"
8
9 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
10 "github.com/stretchr/testify/assert"
11 )
12
13 func TestJSONWriter_Write(t *testing.T) {
14 a := assert.New(t)
15
16 msg := metrics.MeasurementEnvelope{
17 MetricName: "test_metric",
18 Data: metrics.Measurements{
19 {"number": 1, "string": "test_data"},
20 },
21 DBName: "test_db",
22 CustomTags: map[string]string{"foo": "boo"},
23 }
24
25 tempFile := t.TempDir() + "/test.json"
26 ctx, cancel := context.WithCancel(context.Background())
27 jw, err := NewJSONWriter(ctx, tempFile)
28 a.NoError(err)
29
30 err = jw.Write([]metrics.MeasurementEnvelope{msg})
31 a.NoError(err, "write successful")
32 err = jw.Write([]metrics.MeasurementEnvelope{})
33 a.NoError(err, "empty write successful")
34
35 cancel()
36 err = jw.Write([]metrics.MeasurementEnvelope{msg})
37 a.Error(err, "context canceled")
38
39
40 var data map[string]any
41 file, err := os.ReadFile(tempFile)
42 a.NoError(err)
43 err = json.Unmarshal(file, &data)
44 a.NoError(err)
45 a.Equal(msg.MetricName, data["metric"])
46 a.Equal(len(msg.Data), len(data["data"].([]any)))
47 a.Equal(msg.DBName, data["dbname"])
48 a.Equal(len(msg.CustomTags), len(data["custom_tags"].(map[string]any)))
49 }
50
51 func TestJSONWriter_SyncMetric(t *testing.T) {
52
53 tempFile := t.TempDir() + "/test.json"
54
55 ctx, cancel := context.WithCancel(context.Background())
56 jw, err := NewJSONWriter(ctx, tempFile)
57 assert.NoError(t, err)
58
59
60 err = jw.SyncMetric("", "", "")
61 assert.NoError(t, err)
62
63 cancel()
64 err = jw.SyncMetric("", "", "")
65 assert.Error(t, err, "context canceled")
66
67 }
68