1 package reaper
2
3 import (
4 "context"
5 "os"
6 "path/filepath"
7 "testing"
8
9 "github.com/cybertec-postgresql/pgwatch/v3/internal/cmdopts"
10 "github.com/cybertec-postgresql/pgwatch/v3/internal/log"
11 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
12 "github.com/cybertec-postgresql/pgwatch/v3/internal/sources"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
15 )
16
17 type mockReader struct {
18 toReturn sources.Sources
19 toErr error
20 }
21
22 func (m *mockReader) GetSources() (sources.Sources, error) {
23 if m.toErr != nil {
24 return nil, m.toErr
25 }
26 return m.toReturn, nil
27 }
28
29 func (m *mockReader) WriteSources(sources.Sources) error { return nil }
30 func (m *mockReader) DeleteSource(string) error { return nil }
31 func (m *mockReader) UpdateSource(sources.Source) error { return nil }
32
33 func TestReaper_LoadSources(t *testing.T) {
34 ctx := log.WithLogger(context.Background(), log.NewNoopLogger())
35
36 t.Run("Test pause trigger file", func(t *testing.T) {
37 pausefile := filepath.Join(t.TempDir(), "pausefile")
38 require.NoError(t, os.WriteFile(pausefile, []byte("foo"), 0644))
39 r := NewReaper(ctx, &cmdopts.Options{Metrics: metrics.CmdOpts{EmergencyPauseTriggerfile: pausefile}})
40 assert.NoError(t, r.LoadSources())
41 assert.True(t, len(r.monitoredSources) == 0, "Expected no monitored sources when pause trigger file exists")
42 })
43
44 t.Run("Test SyncFromReader errror", func(t *testing.T) {
45 reader := &mockReader{toErr: assert.AnError}
46 r := NewReaper(ctx, &cmdopts.Options{SourcesReaderWriter: reader})
47 assert.Error(t, r.LoadSources())
48 assert.Equal(t, 0, len(r.monitoredSources), "Expected no monitored sources after error")
49 })
50
51 t.Run("Test SyncFromReader success", func(t *testing.T) {
52 source1 := sources.Source{Name: "Source 1", IsEnabled: true, Kind: sources.SourcePostgres}
53 source2 := sources.Source{Name: "Source 2", IsEnabled: true, Kind: sources.SourcePostgres}
54 reader := &mockReader{toReturn: sources.Sources{source1, source2}}
55 r := NewReaper(ctx, &cmdopts.Options{SourcesReaderWriter: reader})
56 assert.NoError(t, r.LoadSources())
57 assert.Equal(t, 2, len(r.monitoredSources), "Expected two monitored sources after successful load")
58 assert.NotNil(t, r.monitoredSources.GetMonitoredDatabase(source1.Name))
59 assert.NotNil(t, r.monitoredSources.GetMonitoredDatabase(source2.Name))
60 })
61
62 t.Run("Test repeated load", func(t *testing.T) {
63 source1 := sources.Source{Name: "Source 1", IsEnabled: true, Kind: sources.SourcePostgres}
64 source2 := sources.Source{Name: "Source 2", IsEnabled: true, Kind: sources.SourcePostgres}
65 reader := &mockReader{toReturn: sources.Sources{source1, source2}}
66 r := NewReaper(ctx, &cmdopts.Options{SourcesReaderWriter: reader})
67 assert.NoError(t, r.LoadSources())
68 assert.Equal(t, 2, len(r.monitoredSources), "Expected two monitored sources after first load")
69
70
71 assert.NoError(t, r.LoadSources())
72 assert.Equal(t, 2, len(r.monitoredSources), "Expected still two monitored sources after second load")
73 })
74
75 t.Run("Test group limited sources", func(t *testing.T) {
76 source1 := sources.Source{Name: "Source 1", IsEnabled: true, Kind: sources.SourcePostgres, Group: ""}
77 source2 := sources.Source{Name: "Source 2", IsEnabled: true, Kind: sources.SourcePostgres, Group: "group1"}
78 source3 := sources.Source{Name: "Source 3", IsEnabled: true, Kind: sources.SourcePostgres, Group: "group2"}
79 source4 := sources.Source{Name: "Source 4", IsEnabled: true, Kind: sources.SourcePostgres, Group: "default"}
80 reader := &mockReader{toReturn: sources.Sources{source1, source2, source3, source4}}
81 r := NewReaper(ctx, &cmdopts.Options{SourcesReaderWriter: reader, Sources: sources.CmdOpts{Groups: []string{"group1", "group2"}}})
82 assert.NoError(t, r.LoadSources())
83 assert.Equal(t, 4, len(r.monitoredSources), "Expected three monitored sources after load")
84
85 r.Sources.Groups = []string{"group1"}
86 assert.NoError(t, r.LoadSources())
87 assert.Equal(t, 3, len(r.monitoredSources), "Expected three monitored sources after group filtering")
88 })
89 }
90