diff options
Diffstat (limited to 'perllib/FixMyStreet/TestAppProve.pm')
-rw-r--r-- | perllib/FixMyStreet/TestAppProve.pm | 90 |
1 files changed, 54 insertions, 36 deletions
diff --git a/perllib/FixMyStreet/TestAppProve.pm b/perllib/FixMyStreet/TestAppProve.pm index d549b0148..049f7da6c 100644 --- a/perllib/FixMyStreet/TestAppProve.pm +++ b/perllib/FixMyStreet/TestAppProve.pm @@ -33,6 +33,59 @@ END { cleanup(); } +my $pg; + +sub spin_up_database { + warn "Spinning up a Pg cluster/database...\n"; + $pg = Test::PostgreSQL->new(); + + warn sprintf "# Connected to %s\n", $pg->dsn; + + my $dbh = DBI->connect($pg->dsn); + + my $tmpwarn = $SIG{__WARN__}; + $SIG{__WARN__} = + sub { print STDERR @_ if $_[0] !~ m/NOTICE: CREATE TABLE/; }; + $dbh->do( path('db/schema.sql')->slurp ) or die $!; + $dbh->do( path('db/fixture.sql')->slurp ) or die $!; + $dbh->do( path('db/generate_secret.sql')->slurp ) or die $!; + $SIG{__WARN__} = $tmpwarn; + + return { + FMS_DB_PORT => $pg->port, + FMS_DB_NAME => 'test', + FMS_DB_USER => 'postgres', + FMS_DB_HOST => 'localhost', + FMS_DB_PASS => '', + }; +} + +sub get_config { + my $cls = shift; + my $extra_config = shift; + my $config_file = delete $extra_config->{config_file}; + my $db_config_file = delete $extra_config->{db_config_file}; + + my $config = YAML::Load( path($config_file)->slurp ); + if ($db_config_file) { + my $db_config = YAML::Load( path($db_config_file)->slurp ); + $config->{FMS_DB_PORT} = $db_config->{FMS_DB_PORT}; + $config->{FMS_DB_NAME} = $db_config->{FMS_DB_NAME}; + $config->{FMS_DB_USER} = $db_config->{FMS_DB_USER}; + $config->{FMS_DB_HOST} = $db_config->{FMS_DB_HOST}; + $config->{FMS_DB_PASS} = $db_config->{FMS_DB_PASS}; + } else { + my $new_db_config = $cls->spin_up_database(); + $config = { %$config, %$new_db_config }; + } + + $config = { %$config, %$extra_config }; + + my $config_out = "general-test-autogenerated.$$.yml"; + path("conf/$config_out")->spew( YAML::Dump($config) ); + return $config_out; +} + sub run { my ($class, @args) = @_; local @ARGV = @args; @@ -53,42 +106,7 @@ sub run { 'state=s@' => \@state, ); - my $config = YAML::Load( path($config_file)->slurp ); - my $pg; - if ($db_config_file) { - my $db_config = YAML::Load( path($db_config_file)->slurp ); - $config->{FMS_DB_PORT} = $db_config->{FMS_DB_PORT}; - $config->{FMS_DB_NAME} = $db_config->{FMS_DB_NAME}; - $config->{FMS_DB_USER} = $db_config->{FMS_DB_USER}; - $config->{FMS_DB_HOST} = $db_config->{FMS_DB_HOST}; - $config->{FMS_DB_PASS} = $db_config->{FMS_DB_PASS}; - } - else { - warn "Spinning up a Pg cluster/database...\n"; - $pg = Test::PostgreSQL->new(); - - warn sprintf "# Connected to %s\n", $pg->dsn; - - my $dbh = DBI->connect($pg->dsn); - - my $tmpwarn = $SIG{__WARN__}; - $SIG{__WARN__} = - sub { print STDERR @_ if $_[0] !~ m/NOTICE: CREATE TABLE/; }; - $dbh->do( path('db/schema.sql')->slurp ) or die $!; - $dbh->do( path('db/fixture.sql')->slurp ) or die $!; - $dbh->do( path('db/generate_secret.sql')->slurp ) or die $!; - $SIG{__WARN__} = $tmpwarn; - - $config->{FMS_DB_PORT} = $pg->port; - $config->{FMS_DB_NAME} = 'test'; - $config->{FMS_DB_USER} = 'postgres'; - $config->{FMS_DB_HOST} = 'localhost'; - $config->{FMS_DB_PASS} = ''; - } - - my $config_out = "general-test-autogenerated.$$.yml"; - path("conf/$config_out")->spew( YAML::Dump($config) ); - + my $config_out = $class->get_config({ config_file => $config_file, db_config_file => $db_config_file }); local $ENV{FMS_OVERRIDE_CONFIG} = $config_out; my $prove = App::Prove->new; |