...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/cmdopts/cmdsource_test.go

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

     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