f9f5bfa7fbf22561e6f1b77c312286f7a3601f56
[dbsrgits/DBIx-Class-DeploymentHandler.git] / t / deploy_methods / sql_translator.t
1 #!perl
2
3 use Test::More;
4 use Test::Exception;
5
6 use lib 't/lib';
7 use DBICDHTest;
8 use aliased 'DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator';
9 use File::Spec::Functions;
10 use File::Path qw(rmtree mkpath);
11
12 my $db = 'dbi:SQLite:db.db';
13 my @connection = ($db, '', '', { ignore_version => 1 });
14 my $sql_dir = 't/sql';
15
16 DBICDHTest::ready;
17
18 VERSION1: {
19    use_ok 'DBICVersion_v1';
20    my $s = DBICVersion::Schema->connect(@connection);
21    my $dm = Translator->new({
22       schema            => $s,
23       script_directory => $sql_dir,
24       databases         => ['SQLite'],
25       sql_translator_args          => { add_drop_table => 0 },
26    });
27
28    ok( $dm, 'DBIC::DH::DM::SQL::Translator gets instantiated correctly' );
29
30    $dm->prepare_deploy;
31
32    mkpath(catfile(qw( t sql SQLite preinstall 1.0 )));
33    open my $prerun, '>',
34       catfile(qw( t sql SQLite preinstall 1.0 003-semiautomatic.pl ));
35    print {$prerun} "sub {use File::Touch; touch(q(foobar));}";
36    close $prerun;
37    $dm->preinstall({ version => '1.0' });
38
39    ok -e 'foobar', 'perl migration runs';
40
41    {
42       my $warned = 0;
43       local $SIG{__WARN__} = sub{$warned = 1};
44       $dm->prepare_deploy;
45       ok( $warned, 'prepare_deploy warns if you run it twice' );
46    }
47    mkpath(catfile(qw( t sql _common schema 1.0 )));
48    open my $common, '>',
49       catfile(qw( t sql _common schema 1.0 002-error.sql ));
50    print {$common} qq<syntax fail\n\n>;
51    close $common;
52
53    ok(
54       -f catfile(qw( t sql SQLite schema 1.0 001-auto.sql-json )),
55       '1.0 schema gets generated properly'
56    );
57
58    dies_ok {
59       $s->resultset('Foo')->create({
60          bar => 'frew',
61       })
62    } 'schema not deployed';
63
64    mkpath catfile(qw( t sql _common schema 1.0 ));
65    open $common, '>',
66       catfile(qw( t sql _common schema 1.0 001-auto.sql ));
67    print {$common} qq<This will never get run>;
68    close $common;
69    {
70       my $warned = 0;
71       local $SIG{__WARN__} = sub{$warned = 1};
72       $dm->deploy;
73       ok( $warned, 'deploy warns on sql errors' );
74    }
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    $version = $s->schema_version();
97    $dm->prepare_deploy;
98    ok(
99       -f catfile(qw( t sql SQLite schema 2.0 001-auto.sql-json )),
100       '2.0 schema gets generated properly'
101    );
102    mkpath(catfile(qw( t sql SQLite up 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 up 1.0-2.0 001-auto.sql-json )),
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 down 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 down 2.0-1.0 001-auto.sql-json )),
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 up 1.0-2.0 ));
147    open my $common, '>',
148       catfile(qw( t sql _common up 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 up 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    $version = $s->schema_version();
204    $dm->prepare_deploy;
205    ok(
206       -f catfile(qw( t sql SQLite schema 3.0 001-auto.sql-json )),
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 down 3.0-1.0 001-auto.sql-json )),
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 up 1.0-3.0 001-auto.sql-json )),
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    {
233       my $warned = 0;
234       local $SIG{__WARN__} = sub{$warned = 1};
235       $dm->prepare_upgrade({
236         from_version => '2.0',
237         to_version => $version,
238         version_set => ['2.0', $version]
239       });
240       ok( $warned, 'prepare_upgrade warns if you clobber an existing upgrade file' );
241    }
242    ok(
243       -f catfile(qw( t sql SQLite up 1.0-2.0 001-auto.sql-json )),
244       '2.0-3.0 diff gets generated properly'
245    );
246    mkpath catfile(qw( t sql _generic up 2.0-3.0 ));
247    rename catfile(qw( t sql SQLite up 2.0-3.0 001-auto.sql-json )), catfile(qw( t sql _generic up 2.0-3.0 001-auto.sql-json ));
248    rmtree(catfile(qw( t sql SQLite )));
249    warn 'how can this be' if -d catfile(qw( t sql SQLite ));
250    dies_ok {
251       $s->resultset('Foo')->create({
252             bar => 'frew',
253             baz => 'frew',
254             biff => 'frew',
255          })
256    } 'schema not deployed';
257    $dm->upgrade_single_step({ version_set => [qw( 2.0 3.0 )] });
258    lives_ok {
259       $s->resultset('Foo')->create({
260          bar => 'frew',
261          baz => 'frew',
262          biff => 'frew',
263       })
264    } 'schema is deployed using _generic';
265    rmtree(catfile(qw( t sql SQLite )));
266    rmtree(catfile(qw( t sql _generic )));
267    dies_ok {
268       $dm->upgrade_single_step({ version_set => [qw( 2.0 3.0 )] });
269    } 'dies when sql dir does not exist';
270 }
271 done_testing;
272 #vim: ts=2 sw=2 expandtab