3bfdce1787ed3d57ec13173a2742f0905a7f2e6a
[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 $dbh = DBI->connect('dbi:SQLite::memory:');
13 my @connection = (sub { $dbh }, { 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 initialize 1.0 )));
33    open my $prerun, '>',
34       catfile(qw( t sql SQLite initialize 1.0 003-semiautomatic.pl ));
35    print {$prerun} "sub {use File::Touch; touch(q(foobar));}";
36    close $prerun;
37    $dm->initialize({ version => '1.0' });
38
39    ok -e 'foobar';
40
41    dies_ok {$dm->prepare_deploy} 'prepare_deploy dies if you run it twice' ;
42
43    ok(
44       -f catfile(qw( t sql SQLite deploy 1.0 001-auto.sql )),
45       '1.0 schema gets generated properly'
46    );
47
48    dies_ok {
49       $s->resultset('Foo')->create({
50          bar => 'frew',
51       })
52    } 'schema not deployed';
53
54    $dm->deploy;
55
56    lives_ok {
57       $s->resultset('Foo')->create({
58          bar => 'frew',
59       })
60    } 'schema is deployed';
61 }
62
63 VERSION2: {
64    use_ok 'DBICVersion_v2';
65    my $s = DBICVersion::Schema->connect(@connection);
66    my $dm = Translator->new({
67       schema            => $s,
68       script_directory => $sql_dir,
69       databases         => ['SQLite'],
70       sql_translator_args          => { add_drop_table => 0 },
71       txn_wrap          => 1,
72    });
73
74    ok( $dm, 'DBIC::DH::SQL::Translator w/2.0 instantiates correctly');
75
76    $version = $s->schema_version();
77    $dm->prepare_deploy;
78    ok(
79       -f catfile(qw( t sql SQLite deploy 2.0 001-auto.sql )),
80       '2.0 schema gets generated properly'
81    );
82    mkpath(catfile(qw( t sql SQLite upgrade 1.0-2.0 )));
83    $dm->prepare_upgrade({
84      from_version => '1.0',
85      to_version => '2.0',
86      version_set => [qw(1.0 2.0)]
87    });
88
89    {
90       my $warned = 0;
91       local $SIG{__WARN__} = sub{$warned = 1};
92       $dm->prepare_upgrade({
93         from_version => '0.0',
94         to_version => '1.0',
95         version_set => [qw(0.0 1.0)]
96       });
97       ok( $warned, 'prepare_upgrade with a bogus preversion warns' );
98    }
99    ok(
100       -f catfile(qw( t sql SQLite upgrade 1.0-2.0 001-auto.sql )),
101       '1.0-2.0 diff gets generated properly and default start and end versions get set'
102    );
103    mkpath(catfile(qw( t sql SQLite downgrade 2.0-1.0 )));
104    $dm->prepare_downgrade({
105      from_version => $version,
106      to_version => '1.0',
107      version_set => [$version, '1.0']
108    });
109    ok(
110       -f catfile(qw( t sql SQLite downgrade 2.0-1.0 001-auto.sql )),
111       '2.0-1.0 diff gets generated properly'
112    );
113    dies_ok {
114       $s->resultset('Foo')->create({
115          bar => 'frew',
116          baz => 'frew',
117       })
118    } 'schema not deployed';
119    dies_ok {
120       $s->resultset('Foo')->create({
121          bar => 'frew',
122          baz => 'frew',
123       })
124    } 'schema not uppgrayyed';
125
126    mkpath catfile(qw( t sql _common upgrade 1.0-2.0 ));
127    open my $common, '>',
128       catfile(qw( t sql _common upgrade 1.0-2.0 002-semiautomatic.sql ));
129    print {$common} qq<INSERT INTO Foo (bar, baz) VALUES ("hello", "world");\n\n>;
130    close $common;
131
132    open my $common_pl, '>',
133       catfile(qw( t sql _common upgrade 1.0-2.0 003-semiautomatic.pl ));
134    print {$common_pl} q|
135       sub {
136          my $schema = shift;
137          $schema->resultset('Foo')->create({
138             bar => 'goodbye',
139             baz => 'blue skies',
140          })
141       }
142    |;
143    close $common_pl;
144
145    $dm->upgrade_single_step({ version_set => [qw( 1.0 2.0 )] });
146    is( $s->resultset('Foo')->search({
147          bar => 'hello',
148          baz => 'world',
149       })->count, 1, '_common migration got run');
150    is( $s->resultset('Foo')->search({
151          bar => 'goodbye',
152          #baz => 'blue skies',
153       })->count, 1, '_common perl migration got run');
154    lives_ok {
155       $s->resultset('Foo')->create({
156          bar => 'frew',
157          baz => 'frew',
158       })
159    } 'schema is deployed';
160    $dm->downgrade_single_step({ version_set => [qw( 2.0 1.0 )] });
161    dies_ok {
162       $s->resultset('Foo')->create({
163          bar => 'frew',
164          baz => 'frew',
165       })
166    } 'schema is downgrayyed';
167    $dm->upgrade_single_step({ version_set => [qw( 1.0 2.0 )] });
168 }
169
170 VERSION3: {
171    use_ok 'DBICVersion_v3';
172    my $s = DBICVersion::Schema->connect(@connection);
173    my $dm = Translator->new({
174       schema            => $s,
175       script_directory => $sql_dir,
176       databases         => ['SQLite'],
177       sql_translator_args          => { add_drop_table => 0 },
178       txn_wrap          => 0,
179    });
180
181    ok( $dm, 'DBIC::DH::SQL::Translator w/3.0 instantiates correctly');
182
183    $version = $s->schema_version();
184    $dm->prepare_deploy;
185    ok(
186       -f catfile(qw( t sql SQLite deploy 3.0 001-auto.sql )),
187       '2.0 schema gets generated properly'
188    );
189    $dm->prepare_downgrade({
190      from_version => $version,
191      to_version => '1.0',
192      version_set => [$version, '1.0']
193    });
194    ok(
195       -f catfile(qw( t sql SQLite downgrade 3.0-1.0 001-auto.sql )),
196       '3.0-1.0 diff gets generated properly'
197    );
198    $dm->prepare_upgrade({
199      from_version => '1.0',
200      to_version => $version,
201      version_set => ['1.0', $version]
202    });
203    ok(
204       -f catfile(qw( t sql SQLite upgrade 1.0-3.0 001-auto.sql )),
205       '1.0-3.0 diff gets generated properly'
206    );
207    $dm->prepare_upgrade({
208      from_version => '2.0',
209      to_version => $version,
210      version_set => ['2.0', $version]
211    });
212    dies_ok {
213       $dm->prepare_upgrade({
214         from_version => '2.0',
215         to_version => $version,
216         version_set => ['2.0', $version]
217       });
218       }
219    'prepare_upgrade dies if you clobber an existing upgrade file' ;
220    ok(
221       -f catfile(qw( t sql SQLite upgrade 1.0-2.0 001-auto.sql )),
222       '2.0-3.0 diff gets generated properly'
223    );
224    dies_ok {
225       $s->resultset('Foo')->create({
226             bar => 'frew',
227             baz => 'frew',
228             biff => 'frew',
229          })
230    } 'schema not deployed';
231    $dm->upgrade_single_step({ version_set => [qw( 2.0 3.0 )] });
232    lives_ok {
233       $s->resultset('Foo')->create({
234          bar => 'frew',
235          baz => 'frew',
236          biff => 'frew',
237       })
238    } 'schema is deployed';
239    dies_ok {
240       $dm->upgrade_single_step({ version_set => [qw( 2.0 3.0 )] });
241    } 'dies when sql dir does not exist';
242 }
243 done_testing;
244 #vim: ts=2 sw=2 expandtab