package pilgrim_conf_test import ( "testing" "github.com/stretchr/testify/assert" pilgrim_mock "mvvasilev.dev/pilgrim/internal/mocks" "mvvasilev.dev/pilgrim/internal/pilgrim_conf" ) const CliUrlValue = "postgres://cli_host:5432/cli_segment1/cli_segment2?cli_arg1=cli_val1&cli_arg2=cli_val2" const CliDriverValue = pilgrim_conf.DbDriver_Postgres func setupMockDefaults( env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever, ) { env.EXPECT().Url().Return("", false) env.EXPECT().Driver().Return(pilgrim_conf.DbDriver_Postgres, false) env.EXPECT().Username().Return("", false) env.EXPECT().Password().Return("", false) env.EXPECT().Host().Return("", false) env.EXPECT().Port().Return("", false) env.EXPECT().Segments().Return([]string{}, false) env.EXPECT().Args().Return(map[string]string{}, false) env.EXPECT().Directory().Return("", false) env.EXPECT().MigrationTable().Return("", false) env.EXPECT().MigrationTableSchema().Return("", false) cli.EXPECT().Url().Return("", false) cli.EXPECT().Driver().Return(pilgrim_conf.DbDriver_Postgres, false) cli.EXPECT().Username().Return("", false) cli.EXPECT().Password().Return("", false) cli.EXPECT().Host().Return("", false) cli.EXPECT().Port().Return("", false) cli.EXPECT().Segments().Return([]string{}, false) cli.EXPECT().Args().Return(map[string]string{}, false) cli.EXPECT().Directory().Return("", false) cli.EXPECT().IsUp().Return(false, false) cli.EXPECT().IsDown().Return(false, false) cli.EXPECT().Script().Return("", false) cli.EXPECT().MigrationTable().Return("", false) cli.EXPECT().MigrationTableSchema().Return("", false) cli.EXPECT().IsChecksumValidationEnabled().Return(false, false) cli.EXPECT().IsStrictOrderingEnabled().Return(false, false) cli.EXPECT().IsValidatingMigrationOrder().Return(false, false) cli.EXPECT().IsValidatingLatest().Return(false, false) cli.EXPECT().IsValidatingChecksums().Return(false, false) } func runTest( setupMocks func( env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever, ), test func( env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever, ), ) { env, cli := new(pilgrim_mock.EnvVarRetriever), new(pilgrim_mock.CliFlagRetriever) setupMocks(env, cli) setupMockDefaults(env, cli) test(env, cli) } func Test_PilgrimContext_CliDriverOverridesCliUrlDriver(t *testing.T) { runTest( func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { env.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MSSQL, true) cli.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MySQL, true) // This should be of highest priority cli.EXPECT().Url().Return("postgres://cli_host:5432/cli_segment1/cli_segment2?cli_arg1=cli_val1&cli_arg2=cli_val2", true) }, func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { ctx := pilgrim_conf.NewPilgrimContext(cli, env) assert.Equal(t, pilgrim_conf.DbDriver_MySQL, ctx.UrlParts().Driver) }, ) } func Test_PilgrimContext_EnvDriverOverridesEnvUrlDriver(t *testing.T) { runTest( func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { env.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MSSQL, true) // This should be highest priority env.EXPECT().Url().Return("postgres://env_host:5432", true) }, func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { ctx := pilgrim_conf.NewPilgrimContext(cli, env) assert.Equal(t, pilgrim_conf.DbDriver_MSSQL, ctx.UrlParts().Driver) }, ) } func Test_PilgrimContext_CliUrlDriverOverridesEnvDriver(t *testing.T) { runTest( func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { env.EXPECT().Driver().Return(pilgrim_conf.DbDriver_Postgres, true) cli.EXPECT().Url().Return("mssql://cli_host:1433", true) }, func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { ctx := pilgrim_conf.NewPilgrimContext(cli, env) assert.Equal(t, pilgrim_conf.DbDriver_MSSQL, ctx.UrlParts().Driver) }, ) } func Test_PilgrimContext_CliDriverOverridesEnvDriver(t *testing.T) { runTest( func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { env.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MSSQL, true) cli.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MariaDB, true) }, func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { ctx := pilgrim_conf.NewPilgrimContext(cli, env) assert.Equal(t, pilgrim_conf.DbDriver_MariaDB, ctx.UrlParts().Driver) }, ) } func Test_PilgrimContext_EnvDriverIsUsedIfNoCliDriverProvided(t *testing.T) { runTest( func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { env.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MSSQL, true) }, func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { ctx := pilgrim_conf.NewPilgrimContext(cli, env) assert.Equal(t, pilgrim_conf.DbDriver_MSSQL, ctx.UrlParts().Driver) }, ) } func Test_PilgrimContext_EnvUrlDriverIsNotUsedIfCliDriverOverrideProvided(t *testing.T) { runTest( func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { env.EXPECT().Url().Return("mysql://localhost:3306", true) cli.EXPECT().Driver().Return(pilgrim_conf.DbDriver_MariaDB, true) }, func(env *pilgrim_mock.EnvVarRetriever, cli *pilgrim_mock.CliFlagRetriever) { ctx := pilgrim_conf.NewPilgrimContext(cli, env) assert.Equal(t, pilgrim_conf.DbDriver_MariaDB, ctx.UrlParts().Driver) }, ) }