add test (and fix) for loading external custom content from unsingularized results...
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 25backcompat_v4.t
CommitLineData
66afce69 1use strict;
2use warnings;
3use Test::More;
a0e0a56a 4use File::Path qw/rmtree make_path/;
66afce69 5use Class::Unload;
ffc705f3 6use File::Temp qw/tempfile tempdir/;
7use IO::File;
66afce69 8use lib qw(t/lib);
9use make_dbictest_db2;
10
11my $DUMP_DIR = './t/_common_dump';
12rmtree $DUMP_DIR;
a0e0a56a 13my $SCHEMA_CLASS = 'DBIXCSL_Test::Schema';
66afce69 14
66afce69 15# test dynamic schema in 0.04006 mode
16{
17 my $res = run_loader();
a0e0a56a 18 my $warning = $res->{warnings}[0];
66afce69 19
a0e0a56a 20 like $warning, qr/dynamic schema/i,
66afce69 21 'dynamic schema in backcompat mode detected';
a0e0a56a 22 like $warning, qr/run in 0\.04006 mode/i,
66afce69 23 'dynamic schema in 0.04006 mode warning';
a0e0a56a 24 like $warning, qr/DBIx::Class::Schema::Loader::Manual::UpgradingFromV4/,
25 'warning refers to upgrading doc';
26
27 run_v4_tests($res);
28}
66afce69 29
a0e0a56a 30# setting naming accessor on dynamic schema should disable warning (even when
31# we're setting it to 'v4' .)
32{
33 my $res = run_loader(naming => 'v4');
66afce69 34
a0e0a56a 35 is_deeply $res->{warnings}, [], 'no warnings with naming attribute set';
f53dcdf0 36
37 run_v4_tests($res);
a0e0a56a 38}
39
40# test upgraded dynamic schema
41{
42 my $res = run_loader(naming => 'current');
66afce69 43
a0e0a56a 44# to dump a schema for debugging...
45# {
46# mkdir '/tmp/HLAGH';
47# $schema->_loader->{dump_directory} = '/tmp/HLAGH';
48# $schema->_loader->_dump_to_dir(values %{ $res->{classes} });
49# }
66afce69 50
a0e0a56a 51 is_deeply $res->{warnings}, [], 'no warnings with naming attribute set';
66afce69 52
a0e0a56a 53 run_v5_tests($res);
54}
55
ffc705f3 56# test upgraded dynamic schema with external content loaded
57{
58 my $temp_dir = tempdir;
59 push @INC, $temp_dir;
60
61 my $external_result_dir = join '/', $temp_dir, split /::/, $SCHEMA_CLASS;
62 make_path $external_result_dir;
63
64 IO::File->new(">$external_result_dir/Quuxs.pm")->print(<<"EOF");
65package ${SCHEMA_CLASS}::Quuxs;
66sub a_method { 'hlagh' }
671;
68EOF
69
70 my $res = run_loader(naming => 'current');
71 my $schema = $res->{schema};
72
73 is scalar @{ $res->{warnings} }, 1,
74'correct nummber of warnings for upgraded dynamic schema with external ' .
75'content for unsingularized Result.';
76
77 my $warning = $res->{warnings}[0];
78 like $warning, qr/Detected external content/i,
79 'detected external content warning';
80
81 is eval { $schema->resultset('Quux')->find(1)->a_method }, 'hlagh',
82'external custom content for unsingularized Result was loaded by upgraded ' .
83'dynamic Schema';
84
85 run_v5_tests($res);
86
87 rmtree $temp_dir;
88 pop @INC;
89}
90
30a4c064 91# test upgraded static schema with external content loaded
92{
93 my $temp_dir = tempdir;
94 push @INC, $temp_dir;
95
96 my $external_result_dir = join '/', $temp_dir, split /::/, $SCHEMA_CLASS;
97 make_path $external_result_dir;
98
99 IO::File->new(">$external_result_dir/Quuxs.pm")->print(<<"EOF");
100package ${SCHEMA_CLASS}::Quuxs;
101sub a_method { 'dongs' }
1021;
103EOF
104
105 write_v4_schema_pm();
106
107 my $res = run_loader(dump_directory => $DUMP_DIR, naming => 'current');
108 my $schema = $res->{schema};
109
110 run_v5_tests($res);
111
112 is eval { $schema->resultset('Quux')->find(1)->a_method }, 'dongs',
113'external custom content for unsingularized Result was loaded by upgraded ' .
114'static Schema';
115
116 my $file = $schema->_loader->_get_dump_filename($res->{classes}{quuxs});
117 my $code = do { local ($/, @ARGV) = (undef, $file); <> };
118
119 like $code, qr/package ${SCHEMA_CLASS}::Quux;/,
120'package line translated correctly from external custom content in static dump';
121
122 like $code, qr/sub a_method { 'dongs' }/,
123'external custom content loaded into static dump correctly';
124
125 rmtree $temp_dir;
126 pop @INC;
127}
128
a0e0a56a 129# test running against v4 schema without upgrade
130{
30a4c064 131 write_v4_schema_pm();
a0e0a56a 132
133 # now run the loader
134 my $res = run_loader(dump_directory => $DUMP_DIR);
135 my $warning = $res->{warnings}[0];
136
137 like $warning, qr/static schema/i,
138 'static schema in backcompat mode detected';
139 like $warning, qr/0.04006/,
140 'correct version detected';
141 like $warning, qr/DBIx::Class::Schema::Loader::Manual::UpgradingFromV4/,
142 'refers to upgrading doc';
143
ffc705f3 144 is scalar @{ $res->{warnings} }, 3,
145 'correct number of warnings for static schema in backcompat mode';
146
a0e0a56a 147 run_v4_tests($res);
148
149 # add some custom content to a Result that will be replaced
150 my $schema = $res->{schema};
151 my $quuxs_pm = $schema->_loader
152 ->_get_dump_filename($res->{classes}{quuxs});
153 {
154 local ($^I, @ARGV) = ('', $quuxs_pm);
155 while (<>) {
156 if (/DO NOT MODIFY THIS OR ANYTHING ABOVE/) {
157 print;
158 print "sub a_method { 'mtfnpy' }\n";
159 }
160 else {
161 print;
162 }
163 }
164 }
165
166 # now upgrade the schema
167 $res = run_loader(dump_directory => $DUMP_DIR, naming => 'current');
168 $schema = $res->{schema};
169
170 like $res->{warnings}[0], qr/Dumping manual schema/i,
171 'correct warnings on upgrading static schema (with "naming" set)';
172
173 like $res->{warnings}[1], qr/dump completed/i,
174 'correct warnings on upgrading static schema (with "naming" set)';
175
176 is scalar @{ $res->{warnings} }, 2,
f53dcdf0 177'correct number of warnings on upgrading static schema (with "naming" set)'
178 or diag @{ $res->{warnings} };
a0e0a56a 179
180 run_v5_tests($res);
181
182 (my $result_dir = "$DUMP_DIR/$SCHEMA_CLASS") =~ s{::}{/}g;
183 my $result_count =()= glob "$result_dir/*";
184
185 is $result_count, 4,
186 'un-singularized results were replaced during upgrade';
187
188 # check that custom content was preserved
189 is eval { $schema->resultset('Quux')->find(1)->a_method }, 'mtfnpy',
190 'custom content was carried over from un-singularized Result';
66afce69 191}
192
193done_testing;
194
ffc705f3 195END {
196 rmtree $DUMP_DIR unless $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP};
197}
a0e0a56a 198
dbe9e0f7 199sub run_loader {
200 my %loader_opts = @_;
201
202 eval {
203 foreach my $source_name ($SCHEMA_CLASS->clone->sources) {
204 Class::Unload->unload("${SCHEMA_CLASS}::${source_name}");
205 }
206
207 Class::Unload->unload($SCHEMA_CLASS);
208 };
209 undef $@;
210
211 my @connect_info = $make_dbictest_db2::dsn;
212 my @loader_warnings;
213 local $SIG{__WARN__} = sub { push(@loader_warnings, $_[0]); };
214 eval qq{
215 package $SCHEMA_CLASS;
216 use base qw/DBIx::Class::Schema::Loader/;
217
218 __PACKAGE__->loader_options(\%loader_opts);
219 __PACKAGE__->connection(\@connect_info);
220 };
221
222 ok(!$@, "Loader initialization") or diag $@;
223
224 my $schema = $SCHEMA_CLASS->clone;
225 my (%monikers, %classes);
226 foreach my $source_name ($schema->sources) {
227 my $table_name = $schema->source($source_name)->from;
228 $monikers{$table_name} = $source_name;
229 $classes{$table_name} = "${SCHEMA_CLASS}::${source_name}";
230 }
231
232 return {
233 schema => $schema,
234 warnings => \@loader_warnings,
235 monikers => \%monikers,
236 classes => \%classes,
237 };
238}
239
30a4c064 240sub write_v4_schema_pm {
241 (my $schema_dir = "$DUMP_DIR/$SCHEMA_CLASS") =~ s/::[^:]+\z//;
242 rmtree $schema_dir;
243 make_path $schema_dir;
244 my $schema_pm = "$schema_dir/Schema.pm";
245 open my $fh, '>', $schema_pm or die $!;
246 print $fh <<'EOF';
247package DBIXCSL_Test::Schema;
248
249use strict;
250use warnings;
251
252use base 'DBIx::Class::Schema';
253
254__PACKAGE__->load_classes;
255
256
257# Created by DBIx::Class::Schema::Loader v0.04006 @ 2009-12-25 01:49:25
258# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ibIJTbfM1ji4pyD/lgSEog
259
260
261# You can replace this text with custom content, and it will be preserved on regeneration
2621;
263EOF
264}
265
dbe9e0f7 266sub run_v4_tests {
267 my $res = shift;
268 my $schema = $res->{schema};
269
270 is_deeply [ @{ $res->{monikers} }{qw/foos bar bazs quuxs/} ],
271 [qw/Foos Bar Bazs Quuxs/],
272 'correct monikers in 0.04006 mode';
273
274 isa_ok ((my $bar = eval { $schema->resultset('Bar')->find(1) }),
275 $res->{classes}{bar},
276 'found a bar');
277
278 isa_ok eval { $bar->foo_id }, $res->{classes}{foos},
279 'correct rel name in 0.04006 mode';
280
281 ok my $baz = eval { $schema->resultset('Bazs')->find(1) };
282
283 isa_ok eval { $baz->quux }, 'DBIx::Class::ResultSet',
284 'correct rel type and name for UNIQUE FK in 0.04006 mode';
285}
286
287sub run_v5_tests {
288 my $res = shift;
289 my $schema = $res->{schema};
290
291 is_deeply [ @{ $res->{monikers} }{qw/foos bar bazs quuxs/} ],
292 [qw/Foo Bar Baz Quux/],
293 'correct monikers in current mode';
294
295 ok my $bar = eval { $schema->resultset('Bar')->find(1) };
296
297 isa_ok eval { $bar->foo }, $res->{classes}{foos},
298 'correct rel name in current mode';
299
300 ok my $baz = eval { $schema->resultset('Baz')->find(1) };
301
302 isa_ok eval { $baz->quux }, $res->{classes}{quuxs},
303 'correct rel type and name for UNIQUE FK in current mode';
304}