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