0.04001, dump_overwrite -> really_erase_my_files
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 23dumpmore.t
1 use strict;
2 use Test::More;
3 use lib qw(t/lib);
4 use File::Path;
5 use make_dbictest_db;
6 require DBIx::Class::Schema::Loader;
7
8 plan tests => 40;
9
10 plan skip_all => "ActiveState perl produces additional warnings, and this test uses unix paths"
11     if ($^O eq 'MSWin32');
12
13 my $DUMP_PATH = './t/_dump';
14
15 sub do_dump_test {
16     my %tdata = @_;
17
18     my $schema_class = $tdata{classname};
19
20     no strict 'refs';
21     @{$schema_class . '::ISA'} = ('DBIx::Class::Schema::Loader');
22     $schema_class->loader_options(dump_directory => $DUMP_PATH, %{$tdata{options}});
23
24     my @warns;
25     eval {
26         local $SIG{__WARN__} = sub { push(@warns, @_) };
27         $schema_class->connect($make_dbictest_db::dsn);
28     };
29     my $err = $@;
30     $schema_class->storage->disconnect if !$err && $schema_class->storage;
31     undef *{$schema_class};
32
33     is($err, $tdata{error});
34
35     my $check_warns = $tdata{warnings};
36     is(@warns, @$check_warns);
37     for(my $i = 0; $i <= $#$check_warns; $i++) {
38         like($warns[$i], $check_warns->[$i]);
39     }
40
41     my $file_regexes = $tdata{regexes};
42     my $file_neg_regexes = $tdata{neg_regexes} || {};
43     my $schema_regexes = delete $file_regexes->{schema};
44     
45     my $schema_path = $DUMP_PATH . '/' . $schema_class;
46     $schema_path =~ s{::}{/}g;
47     dump_file_like($schema_path . '.pm', @$schema_regexes);
48     foreach my $src (keys %$file_regexes) {
49         my $src_file = $schema_path . '/' . $src . '.pm';
50         dump_file_like($src_file, @{$file_regexes->{$src}});
51     }
52     foreach my $src (keys %$file_neg_regexes) {
53         my $src_file = $schema_path . '/' . $src . '.pm';
54         dump_file_not_like($src_file, @{$file_neg_regexes->{$src}});
55     }
56 }
57
58 sub dump_file_like {
59     my $path = shift;
60     open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!";
61     my $contents = do { local $/; <$dumpfh>; };
62     close($dumpfh);
63     like($contents, $_) for @_;
64 }
65
66 sub dump_file_not_like {
67     my $path = shift;
68     open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!";
69     my $contents = do { local $/; <$dumpfh>; };
70     close($dumpfh);
71     unlike($contents, $_) for @_;
72 }
73
74 sub append_to_class {
75     my ($class, $string) = @_;
76     $class =~ s{::}{/}g;
77     $class = $DUMP_PATH . '/' . $class . '.pm';
78     open(my $appendfh, '>>', $class) or die "Failed to open '$class' for append: $!";
79     print $appendfh $string;
80     close($appendfh);
81 }
82
83 rmtree($DUMP_PATH, 1, 1);
84
85 do_dump_test(
86     classname => 'DBICTest::DumpMore::1',
87     options => { },
88     error => '',
89     warnings => [
90         qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
91         qr/Schema dump completed/,
92     ],
93     regexes => {
94         schema => [
95             qr/package DBICTest::DumpMore::1;/,
96             qr/->load_classes/,
97         ],
98         Foo => [
99             qr/package DBICTest::DumpMore::1::Foo;/,
100             qr/->set_primary_key/,
101             qr/1;\n$/,
102         ],
103         Bar => [
104             qr/package DBICTest::DumpMore::1::Bar;/,
105             qr/->set_primary_key/,
106             qr/1;\n$/,
107         ],
108     },
109 );
110
111 append_to_class('DBICTest::DumpMore::1::Foo',q{# XXX This is my custom content XXX});
112
113 do_dump_test(
114     classname => 'DBICTest::DumpMore::1',
115     options => { },
116     error => '',
117     warnings => [
118         qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
119         qr/Schema dump completed/,
120     ],
121     regexes => {
122         schema => [
123             qr/package DBICTest::DumpMore::1;/,
124             qr/->load_classes/,
125         ],
126         Foo => [
127             qr/package DBICTest::DumpMore::1::Foo;/,
128             qr/->set_primary_key/,
129             qr/1;\n# XXX This is my custom content XXX/,
130         ],
131         Bar => [
132             qr/package DBICTest::DumpMore::1::Bar;/,
133             qr/->set_primary_key/,
134             qr/1;\n$/,
135         ],
136     },
137 );
138
139 do_dump_test(
140     classname => 'DBICTest::DumpMore::1',
141     options => { really_erase_my_files => 1 },
142     error => '',
143     warnings => [
144         qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
145         qr/Deleting existing file /,
146         qr/Deleting existing file /,
147         qr/Deleting existing file /,
148         qr/Schema dump completed/,
149     ],
150     regexes => {
151         schema => [
152             qr/package DBICTest::DumpMore::1;/,
153             qr/->load_classes/,
154         ],
155         Foo => [
156             qr/package DBICTest::DumpMore::1::Foo;/,
157             qr/->set_primary_key/,
158             qr/1;\n$/,
159         ],
160         Bar => [
161             qr/package DBICTest::DumpMore::1::Bar;/,
162             qr/->set_primary_key/,
163             qr/1;\n$/,
164         ],
165     },
166     neg_regexes => {
167         Foo => [
168             qr/# XXX This is my custom content XXX/,
169         ],
170     },
171 );
172
173 END { rmtree($DUMP_PATH, 1, 1); }