...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/reaper/reaper_test.go

Documentation: github.com/cybertec-postgresql/pgwatch/v3/internal/reaper

     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  		// Load again with the same sources
    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: ""} // Empty group should not filter
    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"} // Default group should not filter
    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