aboutsummaryrefslogtreecommitdiffstats
path: root/perllib
diff options
context:
space:
mode:
Diffstat (limited to 'perllib')
-rw-r--r--perllib/FixMyStreet/TestAppProve.pm94
1 files changed, 94 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/TestAppProve.pm b/perllib/FixMyStreet/TestAppProve.pm
new file mode 100644
index 000000000..4d8cdaccb
--- /dev/null
+++ b/perllib/FixMyStreet/TestAppProve.pm
@@ -0,0 +1,94 @@
+use strict; use warnings;
+package FixMyStreet::TestAppProve;
+use App::Prove;
+
+use YAML ();
+use Path::Tiny 'path';
+use Test::PostgreSQL;
+use Data::Dumper;
+use Getopt::Long ':config' => qw(bundling pass_through no_ignore_case);
+
+=head1 NAME
+
+FixMyStreet::TestAppProve - spin up a clean database and configuration for tests
+
+=head1 USAGE
+
+see bin/test-wrapper for usage
+
+=cut
+
+sub run {
+ my ($class, @args) = @_;
+ local @ARGV = @args;
+
+ my $config_file = 'conf/general.yml-example';
+ my $db_config_file;
+
+ my $recurse;
+ my @state;
+
+ GetOptions (
+ # our own config variables
+ 'config=s' => \$config_file,
+ 'db-config=s' => \$db_config_file,
+
+ # App::Prove variables we want to munge
+ 'r|recurse' => \$recurse,
+ '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/alert_types.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';
+ path("conf/$config_out.yml")->spew( YAML::Dump($config) );
+
+ local $ENV{FMS_OVERRIDE_CONFIG} = $config_out;
+
+ if (@ARGV and -e $ARGV[-1]) {
+ unshift @ARGV, '--verbose'
+ if -f $ARGV[-1];
+ # verbose if we have a single file
+ }
+
+ unshift @ARGV,
+ '--recurse', # we always want to recurse
+ '--state', (join ',' => @state, 'save'); # we always want to save state
+
+ my $prove = App::Prove->new;
+ $prove->process_args(@ARGV);
+ $prove->run;
+}
+
+1;