1 package cmdopts
2
3 import (
4 "context"
5 "os"
6 "testing"
7
8 "github.com/cybertec-postgresql/pgwatch/v6/internal/db"
9 "github.com/cybertec-postgresql/pgwatch/v6/internal/sources"
10 "github.com/jackc/pgx/v5/pgxpool"
11 "github.com/pashagolub/pgxmock/v5"
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
95 f2, err := os.CreateTemp(t.TempDir(), "sample.config.yaml")
96 require.NoError(t, err)
97 defer f2.Close()
98
99 _, err = f2.WriteString(`
100 - name: test1
101 kind: postgres-continuous-discovery
102 is_enabled: true
103 conn_str: postgresql://foo@quux/baz`)
104 require.NoError(t, err)
105
106 mock.ExpectQuery("select.+datname").
107 WithArgs(pgxmock.AnyArg(), pgxmock.AnyArg()).
108 WillReturnError(assert.AnError)
109 os.Args = []string{0: "config_test", "--sources=" + f2.Name(), "source", "resolve"}
110 _, err = New(nil)
111 assert.ErrorIs(t, err, assert.AnError)
112 assert.NoError(t, mock.ExpectationsWereMet())
113 })
114
115 }
116