1 package cmdopts 2 3 import ( 4 "context" 5 "os" 6 "testing" 7 8 "github.com/cybertec-postgresql/pgwatch/v3/internal/db" 9 "github.com/cybertec-postgresql/pgwatch/v3/internal/sources" 10 "github.com/jackc/pgx/v5/pgxpool" 11 "github.com/pashagolub/pgxmock/v4" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestSourcePingCommand_Execute(t *testing.T) { 17 18 f, err := os.CreateTemp(t.TempDir(), "sample.config.yaml") 19 require.NoError(t, err) 20 defer f.Close() 21 22 _, err = f.WriteString(` 23 - name: test1 24 kind: postgres 25 is_enabled: true 26 conn_str: postgresql://foo@bar/baz 27 - name: test2 28 kind: postgres-continuous-discovery 29 is_enabled: true 30 conn_str: postgresql://foo@bar/baz 31 - name: test3 32 kind: patroni-namespace-discovery 33 is_enabled: true 34 conn_str: postgresql://foo@bar/baz`) 35 36 require.NoError(t, err) 37 38 sources.NewConn = func(_ context.Context, _ string, _ ...db.ConnConfigCallback) (db.PgxPoolIface, error) { 39 return nil, assert.AnError 40 } 41 sources.NewConnWithConfig = func(_ context.Context, _ *pgxpool.Config, _ ...db.ConnConfigCallback) (db.PgxPoolIface, error) { 42 return nil, assert.AnError 43 } 44 45 os.Args = []string{0: "config_test", "--sources=" + f.Name(), "source", "ping"} 46 _, err = New(nil) 47 assert.NoError(t, err) 48 49 os.Args = []string{0: "config_test", "--sources=" + f.Name(), "source", "ping", "test1"} 50 _, err = New(nil) 51 assert.NoError(t, err) 52 } 53 54 func TestSourceResolveCommand_Execute(t *testing.T) { 55 f, err := os.CreateTemp(t.TempDir(), "sample.config.yaml") 56 require.NoError(t, err) 57 defer f.Close() 58 59 _, err = f.WriteString(` 60 - name: test0 61 kind: postgres 62 is_enabled: true 63 conn_str: postgresql://foo@bar/baz 64 - name: test1 65 kind: postgres-continuous-discovery 66 is_enabled: true 67 conn_str: postgresql://foo@bar/baz`) 68 69 require.NoError(t, err) 70 71 mock, err := pgxmock.NewPool() 72 require.NoError(t, err) 73 sources.NewConn = func(_ context.Context, _ string, _ ...db.ConnConfigCallback) (db.PgxPoolIface, error) { 74 return mock, nil 75 } 76 77 t.Run("ResolveSuccess", func(t *testing.T) { 78 r := func(args []string) { 79 mock.ExpectQuery("select.+datname"). 80 WithArgs(pgxmock.AnyArg(), pgxmock.AnyArg()). 81 WillReturnRows( 82 pgxmock.NewRows([]string{"datname"}). 83 AddRow("foo")) 84 os.Args = args 85 _, err = New(nil) 86 assert.NoError(t, err) 87 assert.NoError(t, mock.ExpectationsWereMet()) 88 } 89 r([]string{0: "config_test", "--sources=" + f.Name(), "source", "resolve"}) 90 r([]string{0: "config_test", "--sources=" + f.Name(), "source", "resolve", "test1"}) 91 }) 92 93 t.Run("ResolveError", func(t *testing.T) { 94 mock.ExpectQuery("select.+datname"). 95 WithArgs(pgxmock.AnyArg(), pgxmock.AnyArg()). 96 WillReturnError(assert.AnError) 97 os.Args = []string{0: "config_test", "--sources=" + f.Name(), "source", "resolve"} 98 _, err = New(nil) 99 assert.ErrorIs(t, err, assert.AnError) 100 assert.NoError(t, mock.ExpectationsWereMet()) 101 }) 102 103 } 104