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