#!/usr/bin/env perl BEGIN { use Test::Most; plan skip_all => 'DBICM_TEST_MYSQL not set' unless $ENV{DBICM_TEST_MYSQL} || $ENV{AUTHOR_MODE}; } use lib 't/lib'; use DBIx::Class::Migration; use File::Spec::Functions 'catfile', 'catdir', 'splitpath'; use File::Path 'rmtree'; use Test::Requires qw(Test::mysqld); ok( my $migration = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class'); isa_ok( my $schema = $migration->schema, 'Local::Schema', 'got a reasonable looking schema'); is( DBIx::Class::Migration::_infer_database_from_schema($schema), 'MySQL', 'can correctly infer a database DBD'); $migration->prepare; ok( (my $target_dir = $migration->target_dir), 'got a good target directory'); ok -d catfile($target_dir, 'fixtures'), 'got fixtures'; ok -e catfile($target_dir, 'fixtures','1','conf','all_tables.json'), 'got the all_tables.json'; ok -d catfile($target_dir, 'migrations'), 'got migrations'; ok -e catfile($target_dir, 'migrations','MySQL','deploy','1','001-auto.sql'), 'found DDL'; open( my $perl_run, ">", catfile($target_dir, 'migrations', 'MySQL', 'deploy', '1', '002-artists.pl') ) || die "Cannot open: $!"; print $perl_run <<'END'; use Test::Most; use DBIx::Class::Migration::RunScript; migrate { my $self = shift; if($self->set_has_fixtures('all_tables')) { $self->populate('all_tables'); } else { $self->schema ->resultset('Country') ->populate([ ['code'], ['bel'], ['deu'], ['fra'], ]); $self->dump('all_tables'); ok $self->set_has_fixtures('all_tables'), 'Fixture Set exists!'; } }; END close($perl_run); $migration->install; ok $schema->resultset('Country')->find({code=>'fra'}), 'got some previously inserted data'; ok -e catfile($target_dir, 'fixtures','1','all_tables','country','1.fix'), 'found a fixture from runscript dump'; rmtree catfile($target_dir, 'fixtures','1','all_tables'); $migration->dump_all_sets; ok -e catfile($target_dir, 'fixtures','1','all_tables','country','1.fix'), 'found a fixture'; rmtree catfile($target_dir, 'fixtures','1','all_tables'); $migration->dump_named_sets('all_tables'); ok -e catfile($target_dir, 'fixtures','1','all_tables','country','1.fix'), 'found a fixture'; $migration->delete_table_rows; $migration->populate('all_tables'); ok $schema->resultset('Country')->find({code=>'fra'}), 'got some previously inserted data'; $migration->drop_tables; my $cleanup_dir = $migration->target_dir; $migration = undef; NEW_SCOPE_FOR_SCHEMA: { ok( my $migration = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class'); $migration->install; ok $schema->resultset('Country')->find({code=>'fra'}), 'got some previously inserted data'; $migration->delete_table_rows; $migration->populate('all_tables'); ok $schema->resultset('Country')->find({code=>'bel'}), 'got some previously inserted data'; SCOPE_FOR_ALREADY_RUNNING: { ## The database is still running, lets make sure we can connect ## and use it without generating an error SKIP: { skip "Test::mysqld not patched yet", 3 unless (eval qq{use Test::mysqld 0.15; 1} || 0); ok( my $migration = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class 3'); isa_ok( my $schema = $migration->schema, 'Local::Schema', 'got a reasonable looking schema'); ok $schema->resultset('Country')->find({code=>'fra'}), 'got some previously inserted data'; } } my ($volume,$directories,$file) = splitpath($migration->db_sandbox->test_mysqld->my_cnf->{socket}); rmtree $directories if ($directories && $file); ## check to make sure we don't rmtree root $migration = undef; RESTORE_EXISTING_NOT_RUNNING: { ## The sandbox exists, but the db is NOT running and the ## socket path is gone; SKIP: { skip "Test::mysqld not patched yet", 3 unless (eval qq{use Test::mysqld 0.15; 1} || 0); ok( my $migration = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class 4'); isa_ok( my $schema = $migration->schema, 'Local::Schema', 'got a reasonable looking schema'); ok $schema->resultset('Country')->find({code=>'fra'}), 'got some previously inserted data'; } } } SCOPE_FOR_PARALLEL_TEMP: { ok( my $migration1 = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_builder_class => 'DBIx::Class::Migration::TempDirSandboxBuilder', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class in temp 1'); $migration1->install; ok( my $migration2 = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_builder_class => 'DBIx::Class::Migration::TempDirSandboxBuilder', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class in temp 2'); $migration2->install; ok( my $migration3 = DBIx::Class::Migration->new( schema_class=>'Local::Schema', db_sandbox_builder_class => 'DBIx::Class::Migration::TempDirSandboxBuilder', db_sandbox_class=>'DBIx::Class::Migration::MySQLSandbox'), 'created migration with schema_class in temp 3'); $migration3->install; } done_testing; END { rmtree catfile($cleanup_dir, 'migrations'); rmtree catfile($cleanup_dir, 'fixtures'); rmtree catfile($cleanup_dir, 'local-schema'); }