Implement result_base_class and schema_base_class options.
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 23dumpmore.t
CommitLineData
605fcea8 1use strict;
2use Test::More;
3use lib qw(t/lib);
4use File::Path;
5use make_dbictest_db;
6require DBIx::Class::Schema::Loader;
7
12c918bd 8$^O eq 'MSWin32'
9 ? plan(skip_all => "ActiveState perl produces additional warnings, and this test uses unix paths")
f44ecc2f 10 : plan(tests => 82);
605fcea8 11
a4187fdf 12my $DUMP_PATH = './t/_dump';
605fcea8 13
14sub do_dump_test {
a4187fdf 15 my %tdata = @_;
605fcea8 16
a4187fdf 17 my $schema_class = $tdata{classname};
605fcea8 18
19 no strict 'refs';
20 @{$schema_class . '::ISA'} = ('DBIx::Class::Schema::Loader');
a4187fdf 21 $schema_class->loader_options(dump_directory => $DUMP_PATH, %{$tdata{options}});
605fcea8 22
a4187fdf 23 my @warns;
605fcea8 24 eval {
a4187fdf 25 local $SIG{__WARN__} = sub { push(@warns, @_) };
605fcea8 26 $schema_class->connect($make_dbictest_db::dsn);
27 };
28 my $err = $@;
29 $schema_class->storage->disconnect if !$err && $schema_class->storage;
30 undef *{$schema_class};
a4187fdf 31
32 is($err, $tdata{error});
33
34 my $check_warns = $tdata{warnings};
35 is(@warns, @$check_warns);
36 for(my $i = 0; $i <= $#$check_warns; $i++) {
37 like($warns[$i], $check_warns->[$i]);
38 }
39
40 my $file_regexes = $tdata{regexes};
41 my $file_neg_regexes = $tdata{neg_regexes} || {};
42 my $schema_regexes = delete $file_regexes->{schema};
43
44 my $schema_path = $DUMP_PATH . '/' . $schema_class;
45 $schema_path =~ s{::}{/}g;
46 dump_file_like($schema_path . '.pm', @$schema_regexes);
47 foreach my $src (keys %$file_regexes) {
48 my $src_file = $schema_path . '/' . $src . '.pm';
49 dump_file_like($src_file, @{$file_regexes->{$src}});
50 }
51 foreach my $src (keys %$file_neg_regexes) {
52 my $src_file = $schema_path . '/' . $src . '.pm';
53 dump_file_not_like($src_file, @{$file_neg_regexes->{$src}});
54 }
605fcea8 55}
56
a4187fdf 57sub dump_file_like {
58 my $path = shift;
59 open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!";
60 my $contents = do { local $/; <$dumpfh>; };
61 close($dumpfh);
62 like($contents, $_) for @_;
63}
605fcea8 64
a4187fdf 65sub dump_file_not_like {
66 my $path = shift;
67 open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!";
68 my $contents = do { local $/; <$dumpfh>; };
69 close($dumpfh);
70 unlike($contents, $_) for @_;
605fcea8 71}
72
a4187fdf 73sub append_to_class {
74 my ($class, $string) = @_;
75 $class =~ s{::}{/}g;
76 $class = $DUMP_PATH . '/' . $class . '.pm';
77 open(my $appendfh, '>>', $class) or die "Failed to open '$class' for append: $!";
78 print $appendfh $string;
79 close($appendfh);
80}
81
82rmtree($DUMP_PATH, 1, 1);
83
84do_dump_test(
85 classname => 'DBICTest::DumpMore::1',
86 options => { },
87 error => '',
88 warnings => [
89 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
90 qr/Schema dump completed/,
91 ],
92 regexes => {
93 schema => [
94 qr/package DBICTest::DumpMore::1;/,
95 qr/->load_classes/,
96 ],
97 Foo => [
98 qr/package DBICTest::DumpMore::1::Foo;/,
99 qr/->set_primary_key/,
100 qr/1;\n$/,
101 ],
102 Bar => [
103 qr/package DBICTest::DumpMore::1::Bar;/,
104 qr/->set_primary_key/,
105 qr/1;\n$/,
106 ],
107 },
108);
109
110append_to_class('DBICTest::DumpMore::1::Foo',q{# XXX This is my custom content XXX});
111
112do_dump_test(
113 classname => 'DBICTest::DumpMore::1',
114 options => { },
115 error => '',
116 warnings => [
117 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
118 qr/Schema dump completed/,
119 ],
120 regexes => {
121 schema => [
122 qr/package DBICTest::DumpMore::1;/,
123 qr/->load_classes/,
124 ],
125 Foo => [
126 qr/package DBICTest::DumpMore::1::Foo;/,
127 qr/->set_primary_key/,
128 qr/1;\n# XXX This is my custom content XXX/,
129 ],
130 Bar => [
131 qr/package DBICTest::DumpMore::1::Bar;/,
132 qr/->set_primary_key/,
133 qr/1;\n$/,
134 ],
135 },
136);
605fcea8 137
a4187fdf 138do_dump_test(
139 classname => 'DBICTest::DumpMore::1',
28b4691d 140 options => { really_erase_my_files => 1 },
a4187fdf 141 error => '',
142 warnings => [
143 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
144 qr/Deleting existing file /,
145 qr/Deleting existing file /,
146 qr/Deleting existing file /,
147 qr/Schema dump completed/,
148 ],
149 regexes => {
150 schema => [
151 qr/package DBICTest::DumpMore::1;/,
152 qr/->load_classes/,
153 ],
154 Foo => [
155 qr/package DBICTest::DumpMore::1::Foo;/,
156 qr/->set_primary_key/,
157 qr/1;\n$/,
158 ],
159 Bar => [
160 qr/package DBICTest::DumpMore::1::Bar;/,
161 qr/->set_primary_key/,
162 qr/1;\n$/,
163 ],
164 },
165 neg_regexes => {
166 Foo => [
167 qr/# XXX This is my custom content XXX/,
168 ],
169 },
170);
605fcea8 171
f44ecc2f 172do_dump_test(
173 classname => 'DBICTest::DumpMore::1',
174 options => { use_namespaces => 1 },
175 error => '',
176 warnings => [
177 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
178 qr/Schema dump completed/,
179 ],
180 regexes => {
181 schema => [
182 qr/package DBICTest::DumpMore::1;/,
183 qr/->load_namespaces/,
184 ],
185 'Result/Foo' => [
186 qr/package DBICTest::DumpMore::1::Result::Foo;/,
187 qr/->set_primary_key/,
188 qr/1;\n$/,
189 ],
190 'Result/Bar' => [
191 qr/package DBICTest::DumpMore::1::Result::Bar;/,
192 qr/->set_primary_key/,
193 qr/1;\n$/,
194 ],
195 },
196);
197
198do_dump_test(
199 classname => 'DBICTest::DumpMore::1',
200 options => { use_namespaces => 1,
201 result_namespace => 'Res',
202 resultset_namespace => 'RSet',
203 default_resultset_class => 'RSetBase',
204 },
205 error => '',
206 warnings => [
207 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
208 qr/Schema dump completed/,
209 ],
210 regexes => {
211 schema => [
212 qr/package DBICTest::DumpMore::1;/,
213 qr/->load_namespaces/,
214 qr/result_namespace => 'Res'/,
215 qr/resultset_namespace => 'RSet'/,
216 qr/default_resultset_class => 'RSetBase'/,
217 ],
218 'Res/Foo' => [
219 qr/package DBICTest::DumpMore::1::Res::Foo;/,
220 qr/->set_primary_key/,
221 qr/1;\n$/,
222 ],
223 'Res/Bar' => [
224 qr/package DBICTest::DumpMore::1::Res::Bar;/,
225 qr/->set_primary_key/,
226 qr/1;\n$/,
227 ],
228 },
229);
230
231do_dump_test(
232 classname => 'DBICTest::DumpMore::1',
233 options => { use_namespaces => 1,
234 result_namespace => '+DBICTest::DumpMore::1::Res',
235 resultset_namespace => 'RSet',
236 default_resultset_class => 'RSetBase',
9c9c2f2b 237 result_base_class => 'My::ResultBaseClass',
238 schema_base_class => 'My::SchemaBaseClass',
f44ecc2f 239 },
240 error => '',
241 warnings => [
242 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
243 qr/Schema dump completed/,
244 ],
245 regexes => {
246 schema => [
247 qr/package DBICTest::DumpMore::1;/,
248 qr/->load_namespaces/,
249 qr/result_namespace => '\+DBICTest::DumpMore::1::Res'/,
250 qr/resultset_namespace => 'RSet'/,
251 qr/default_resultset_class => 'RSetBase'/,
9c9c2f2b 252 qr/use base 'My::SchemaBaseClass'/,
f44ecc2f 253 ],
254 'Res/Foo' => [
255 qr/package DBICTest::DumpMore::1::Res::Foo;/,
9c9c2f2b 256 qr/use base 'My::ResultBaseClass'/,
f44ecc2f 257 qr/->set_primary_key/,
258 qr/1;\n$/,
259 ],
260 'Res/Bar' => [
261 qr/package DBICTest::DumpMore::1::Res::Bar;/,
9c9c2f2b 262 qr/use base 'My::ResultBaseClass'/,
f44ecc2f 263 qr/->set_primary_key/,
264 qr/1;\n$/,
265 ],
266 },
267);
268
a4187fdf 269END { rmtree($DUMP_PATH, 1, 1); }