Port ::Admin from Moose to Moo
[dbsrgits/DBIx-Class.git] / t / admin / 02ddl.t
CommitLineData
cb551b07 1use DBIx::Class::Optional::Dependencies -skip_all_without => qw( admin deploy );
2
9f3849c3 3use strict;
4use warnings;
5
34963a09 6use Test::More;
9f3849c3 7use Test::Exception;
34963a09 8use Test::Warn;
9f3849c3 9
4bea1fe7 10use Path::Class;
11
12use lib qw(t/lib);
13use DBICTest;
052a832c 14use DBIx::Class::_Util 'sigwarn_silencer';
4bea1fe7 15
751a68cc 16
cb551b07 17use DBIx::Class::Admin;
751a68cc 18{
19 # no questions
20 no warnings 'redefine';
21 *DBIx::Class::Admin::_confirm = sub { 1 };
22}
9f3849c3 23
8d6b1478 24# lock early
25DBICTest->init_schema(no_deploy => 1, no_populate => 1);
26
27my $db_fn = DBICTest->_sqlite_dbfilename;
28my @connect_info = (
29 "dbi:SQLite:$db_fn",
30 undef,
31 undef,
32 { on_connect_do => 'PRAGMA synchronous = OFF' },
038fd460 33);
8d6b1478 34my $ddl_dir = dir(qw/t var/, "admin_ddl-$$");
f267b29d 35
9f3849c3 36{ # create the schema
37
2ded40e7 38# make sure we are clean
8d6b1478 39clean_dir($ddl_dir);
2ded40e7 40
2ded40e7 41
a705b175 42my $admin = DBIx::Class::Admin->new(
1edd4ca6 43 schema_class=> "DBICTest::Schema",
8d6b1478 44 sql_dir=> $ddl_dir,
99ab62de 45 connect_info => \@connect_info,
a705b175 46);
47isa_ok ($admin, 'DBIx::Class::Admin', 'create the admin object');
48lives_ok { $admin->create('MySQL'); } 'Can create MySQL sql';
49lives_ok { $admin->create('SQLite'); } 'Can Create SQLite sql';
f267b29d 50lives_ok {
052a832c 51 local $SIG{__WARN__} = sigwarn_silencer( qr/no such table.+DROP TABLE/s );
f267b29d 52 $admin->deploy()
53} 'Can Deploy schema';
9f3849c3 54}
55
9f3849c3 56{ # upgrade schema
57
8d6b1478 58clean_dir($ddl_dir);
ebcd0e4f 59require DBICVersion_v1;
9f3849c3 60
a705b175 61my $admin = DBIx::Class::Admin->new(
99ab62de 62 schema_class => 'DBICVersion::Schema',
8d6b1478 63 sql_dir => $ddl_dir,
1edd4ca6 64 connect_info => \@connect_info,
a705b175 65);
038fd460 66
a705b175 67my $schema = $admin->schema();
038fd460 68
a705b175 69lives_ok { $admin->create($schema->storage->sqlt_type(), {add_drop_table=>0}); } 'Can create DBICVersionOrig sql in ' . $schema->storage->sqlt_type;
70lives_ok { $admin->deploy( ) } 'Can Deploy schema';
2ded40e7 71
72# connect to now deployed schema
a705b175 73lives_ok { $schema = DBICVersion::Schema->connect(@{$schema->storage->connect_info()}); } 'Connect to deployed Database';
2ded40e7 74
a705b175 75is($schema->get_db_version, $DBICVersion::Schema::VERSION, 'Schema deployed and versions match');
2ded40e7 76
77
ebcd0e4f 78require DBICVersion_v2;
8d6b1478 79DBICVersion::Schema->upgrade_directory (undef); # so that we can test use of $ddl_dir
2ded40e7 80
a705b175 81$admin = DBIx::Class::Admin->new(
99ab62de 82 schema_class => 'DBICVersion::Schema',
8d6b1478 83 sql_dir => $ddl_dir,
1edd4ca6 84 connect_info => \@connect_info
a705b175 85);
2ded40e7 86
a705b175 87lives_ok { $admin->create($schema->storage->sqlt_type(), {}, "1.0" ); } 'Can create diff for ' . $schema->storage->sqlt_type;
34963a09 88{
052a832c 89 local $SIG{__WARN__} = sigwarn_silencer( qr/DB version .+? is lower than the schema version/ );
90 lives_ok { $admin->upgrade() } 'upgrade the schema';
91 dies_ok { $admin->deploy } 'cannot deploy installed schema, should upgrade instead';
34963a09 92}
2ded40e7 93
a705b175 94is($schema->get_db_version, $DBICVersion::Schema::VERSION, 'Schema and db versions match');
912e2d5a 95
96}
97
98{ # install
99
8d6b1478 100clean_dir($ddl_dir);
a705b175 101
102my $admin = DBIx::Class::Admin->new(
99ab62de 103 schema_class => 'DBICVersion::Schema',
8d6b1478 104 sql_dir => $ddl_dir,
1edd4ca6 105 connect_info => \@connect_info,
a705b175 106);
107
108$admin->version("3.0");
e952df76 109$admin->install;
a705b175 110is($admin->schema->get_db_version, "3.0", 'db thinks its version 3.0');
e952df76 111throws_ok {
112 $admin->install("4.0")
113} qr/Schema already has a version. Try upgrade instead/, 'cannot install to allready existing version';
ebcd0e4f 114
a705b175 115$admin->force(1);
34963a09 116warnings_exist ( sub {
e952df76 117 $admin->install("4.0")
34963a09 118}, qr/Forcing install may not be a good idea/, 'Force warning emitted' );
a705b175 119is($admin->schema->get_db_version, "4.0", 'db thinks its version 4.0');
9f3849c3 120}
121
122sub clean_dir {
34963a09 123 my ($dir) = @_;
8d6b1478 124 $dir->rmtree if -d $dir;
125 unlink $db_fn;
126}
127
128END {
129 clean_dir($ddl_dir);
9f3849c3 130}
131
132done_testing;