switch to Path::Class for fewer mistakes
[dbsrgits/DBIx-Class-DeploymentHandler.git] / t / deploy_methods / sql_translator.t
CommitLineData
02d58ac0 1#!perl
2
cbbd1b5f 3use strict;
4use warnings;
5
02d58ac0 6use Test::More;
2482377b 7use Test::Fatal qw(lives_ok dies_ok);
02d58ac0 8
9use lib 't/lib';
10use DBICDHTest;
459a67e3 11use aliased 'DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator';
297e662f 12use Path::Class qw(dir file);
7b3d00f9 13use File::Temp qw(tempfile tempdir);
459a67e3 14
f3b5161e 15my $dbh = DBICDHTest::dbh();
624e3018 16my @connection = (sub { $dbh }, { ignore_version => 1 });
7b3d00f9 17my $sql_dir = tempdir( CLEANUP => 1 );
2dfc27ba 18my (undef, $stuffthatran_fn) = tempfile(OPEN => 0);
459a67e3 19
25c3bec3 20for (qw(initialize upgrade downgrade deploy)) {
297e662f 21 dir($sql_dir, '_common', $_, '_any')->mkpath;
25c3bec3 22 open my $fh, '>',
297e662f 23 file($sql_dir, '_common', $_, qw(_any 000-win.pl ));
2dfc27ba 24 print {$fh} qq^sub {open my \$fh, ">>", '$stuffthatran_fn'; use Data::Dumper::Concise; print {\$fh} join(",", \@{\$_[1]||[]}) . "\\n"; }^;
25c3bec3 25 close $fh;
26}
27
28for (qw(initialize upgrade downgrade deploy)) {
297e662f 29 dir($sql_dir, 'SQLite', $_, '_any')->mkpath;
25c3bec3 30 open my $fh, '>',
297e662f 31 file($sql_dir, 'SQLite', $_, qw(_any 000-win2.pl ));
2dfc27ba 32 print {$fh} qq^sub {open my \$fh, ">>", '$stuffthatran_fn'; use Data::Dumper::Concise; print {\$fh} join(",", \@{\$_[1]||[]}) . "\\n"; }^;
25c3bec3 33 close $fh;
34}
459a67e3 35
36VERSION1: {
37 use_ok 'DBICVersion_v1';
38 my $s = DBICVersion::Schema->connect(@connection);
39 my $dm = Translator->new({
3b98a3a1 40 schema => $s,
91adde75 41 script_directory => $sql_dir,
3b98a3a1 42 databases => ['SQLite'],
02a7b8ac 43 sql_translator_args => { add_drop_table => 0 },
459a67e3 44 });
45
46 ok( $dm, 'DBIC::DH::DM::SQL::Translator gets instantiated correctly' );
3b98a3a1 47
91557c90 48 $dm->prepare_deploy;
fc4b7602 49
297e662f 50 dir($sql_dir, qw(SQLite initialize 1.0 ))->mkpath;
fc4b7602 51 open my $prerun, '>',
297e662f 52 file($sql_dir, qw(SQLite initialize 1.0 003-semiautomatic.pl ));
2dfc27ba 53 my (undef, $fn) = tempfile(OPEN => 0);
54 print {$prerun} "sub { open my \$fh, '>', '$fn'}";
fc4b7602 55 close $prerun;
ff40cb1f 56 $dm->initialize({ version => '1.0' });
fc4b7602 57
2dfc27ba 58 ok -e $fn, 'code got run in preinit';
fc4b7602 59
92624ee5 60 dies_ok {$dm->prepare_deploy} 'prepare_deploy dies if you run it twice' ;
3b98a3a1 61
62 ok(
297e662f 63 -f file($sql_dir, qw(SQLite deploy 1.0 001-auto.sql )),
3b98a3a1 64 '1.0 schema gets generated properly'
65 );
66
67 dies_ok {
68 $s->resultset('Foo')->create({
69 bar => 'frew',
70 })
71 } 'schema not deployed';
72
026eaf0c 73 $dm->deploy;
3b98a3a1 74
75 lives_ok {
76 $s->resultset('Foo')->create({
77 bar => 'frew',
78 })
79 } 'schema is deployed';
80}
81
82VERSION2: {
83 use_ok 'DBICVersion_v2';
84 my $s = DBICVersion::Schema->connect(@connection);
85 my $dm = Translator->new({
86 schema => $s,
91adde75 87 script_directory => $sql_dir,
3b98a3a1 88 databases => ['SQLite'],
02a7b8ac 89 sql_translator_args => { add_drop_table => 0 },
91557c90 90 txn_wrap => 1,
3b98a3a1 91 });
92
93 ok( $dm, 'DBIC::DH::SQL::Translator w/2.0 instantiates correctly');
94
cbbd1b5f 95 my $version = $s->schema_version();
91557c90 96 $dm->prepare_deploy;
3b98a3a1 97 ok(
297e662f 98 -f file($sql_dir, qw(SQLite deploy 2.0 001-auto.sql )),
3b98a3a1 99 '2.0 schema gets generated properly'
100 );
297e662f 101 dir($sql_dir, qw(SQLite upgrade 1.0-2.0 ))->mkpath;
be140a5f 102 $dm->prepare_upgrade({
103 from_version => '1.0',
104 to_version => '2.0',
105 version_set => [qw(1.0 2.0)]
106 });
d50f2521 107
108 {
109 my $warned = 0;
110 local $SIG{__WARN__} = sub{$warned = 1};
be140a5f 111 $dm->prepare_upgrade({
112 from_version => '0.0',
113 to_version => '1.0',
114 version_set => [qw(0.0 1.0)]
115 });
d50f2521 116 ok( $warned, 'prepare_upgrade with a bogus preversion warns' );
117 }
3b98a3a1 118 ok(
297e662f 119 -f file($sql_dir, qw(SQLite upgrade 1.0-2.0 001-auto.sql )),
d50f2521 120 '1.0-2.0 diff gets generated properly and default start and end versions get set'
3b98a3a1 121 );
297e662f 122 dir($sql_dir, qw(SQLite downgrade 2.0-1.0 ))->mkpath;
be140a5f 123 $dm->prepare_downgrade({
124 from_version => $version,
125 to_version => '1.0',
126 version_set => [$version, '1.0']
127 });
3b98a3a1 128 ok(
297e662f 129 -f file($sql_dir, qw(SQLite downgrade 2.0-1.0 001-auto.sql )),
d50f2521 130 '2.0-1.0 diff gets generated properly'
3b98a3a1 131 );
132 dies_ok {
133 $s->resultset('Foo')->create({
134 bar => 'frew',
135 baz => 'frew',
136 })
137 } 'schema not deployed';
138 dies_ok {
139 $s->resultset('Foo')->create({
140 bar => 'frew',
141 baz => 'frew',
142 })
143 } 'schema not uppgrayyed';
d50f2521 144
297e662f 145 dir($sql_dir, qw(_common upgrade 1.0-2.0 ))->mkpath;
d50f2521 146 open my $common, '>',
297e662f 147 file($sql_dir, qw(_common upgrade 1.0-2.0 002-semiautomatic.sql ));
d50f2521 148 print {$common} qq<INSERT INTO Foo (bar, baz) VALUES ("hello", "world");\n\n>;
149 close $common;
150
0841a743 151 open my $common_pl, '>',
297e662f 152 file($sql_dir, qw(_common upgrade 1.0-2.0 003-semiautomatic.pl ));
0841a743 153 print {$common_pl} q|
5b5defbc 154 sub {
91557c90 155 my $schema = shift;
156 $schema->resultset('Foo')->create({
157 bar => 'goodbye',
158 baz => 'blue skies',
159 })
160 }
161 |;
0841a743 162 close $common_pl;
163
be140a5f 164 $dm->upgrade_single_step({ version_set => [qw( 1.0 2.0 )] });
d50f2521 165 is( $s->resultset('Foo')->search({
166 bar => 'hello',
167 baz => 'world',
168 })->count, 1, '_common migration got run');
0841a743 169 is( $s->resultset('Foo')->search({
170 bar => 'goodbye',
171 #baz => 'blue skies',
172 })->count, 1, '_common perl migration got run');
3b98a3a1 173 lives_ok {
174 $s->resultset('Foo')->create({
175 bar => 'frew',
176 baz => 'frew',
177 })
178 } 'schema is deployed';
be140a5f 179 $dm->downgrade_single_step({ version_set => [qw( 2.0 1.0 )] });
d50f2521 180 dies_ok {
181 $s->resultset('Foo')->create({
182 bar => 'frew',
183 baz => 'frew',
184 })
fc4b7602 185 } 'schema is downgrayyed';
be140a5f 186 $dm->upgrade_single_step({ version_set => [qw( 1.0 2.0 )] });
459a67e3 187}
02d58ac0 188
3b98a3a1 189VERSION3: {
190 use_ok 'DBICVersion_v3';
191 my $s = DBICVersion::Schema->connect(@connection);
192 my $dm = Translator->new({
193 schema => $s,
91adde75 194 script_directory => $sql_dir,
3b98a3a1 195 databases => ['SQLite'],
02a7b8ac 196 sql_translator_args => { add_drop_table => 0 },
d50f2521 197 txn_wrap => 0,
3b98a3a1 198 });
199
200 ok( $dm, 'DBIC::DH::SQL::Translator w/3.0 instantiates correctly');
201
cbbd1b5f 202 my $version = $s->schema_version();
91557c90 203 $dm->prepare_deploy;
3b98a3a1 204 ok(
297e662f 205 -f file($sql_dir, qw(SQLite deploy 3.0 001-auto.sql )),
3b98a3a1 206 '2.0 schema gets generated properly'
207 );
be140a5f 208 $dm->prepare_downgrade({
209 from_version => $version,
210 to_version => '1.0',
211 version_set => [$version, '1.0']
212 });
3b98a3a1 213 ok(
297e662f 214 -f file($sql_dir, qw(SQLite downgrade 3.0-1.0 001-auto.sql )),
d50f2521 215 '3.0-1.0 diff gets generated properly'
216 );
be140a5f 217 $dm->prepare_upgrade({
218 from_version => '1.0',
219 to_version => $version,
220 version_set => ['1.0', $version]
221 });
d50f2521 222 ok(
297e662f 223 -f file($sql_dir, qw(SQLite upgrade 1.0-3.0 001-auto.sql )),
3b98a3a1 224 '1.0-3.0 diff gets generated properly'
225 );
be140a5f 226 $dm->prepare_upgrade({
227 from_version => '2.0',
228 to_version => $version,
229 version_set => ['2.0', $version]
230 });
92624ee5 231 dies_ok {
be140a5f 232 $dm->prepare_upgrade({
233 from_version => '2.0',
234 to_version => $version,
235 version_set => ['2.0', $version]
236 });
92624ee5 237 }
238 'prepare_upgrade dies if you clobber an existing upgrade file' ;
3b98a3a1 239 ok(
297e662f 240 -f file($sql_dir, qw(SQLite upgrade 1.0-2.0 001-auto.sql )),
3b98a3a1 241 '2.0-3.0 diff gets generated properly'
242 );
243 dies_ok {
244 $s->resultset('Foo')->create({
245 bar => 'frew',
246 baz => 'frew',
247 biff => 'frew',
248 })
249 } 'schema not deployed';
be140a5f 250 $dm->upgrade_single_step({ version_set => [qw( 2.0 3.0 )] });
3b98a3a1 251 lives_ok {
252 $s->resultset('Foo')->create({
253 bar => 'frew',
254 baz => 'frew',
255 biff => 'frew',
256 })
5b766a24 257 } 'schema is deployed';
d50f2521 258 dies_ok {
be140a5f 259 $dm->upgrade_single_step({ version_set => [qw( 2.0 3.0 )] });
d50f2521 260 } 'dies when sql dir does not exist';
3b98a3a1 261}
25c3bec3 262
2dfc27ba 263my $stuff_that_ran = do { local( @ARGV, $/ ) = $stuffthatran_fn; <> };
25c3bec3 264is $stuff_that_ran,
265'
266
2671.0
2681.0
2691.0,2.0
2701.0,2.0
2712.0,1.0
2722.0,1.0
2731.0,2.0
2741.0,2.0
2752.0,3.0
2762.0,3.0
2772.0,3.0
2782.0,3.0
279', '_any got ran the right amount of times with the right args';
280
02d58ac0 281done_testing;
d50f2521 282#vim: ts=2 sw=2 expandtab