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