make t/05testapp.t silent and fix remaining Win32 issues
[catagits/Catalyst-Model-DBIC-Schema.git] / t / 05testapp.t
CommitLineData
5d11d759 1use strict;
2use Test::More;
3use FindBin;
b34b0aff 4use File::Spec::Functions qw/catfile catdir/;
5d11d759 5use File::Find;
b34b0aff 6use Config;
bd99d89c 7use DBI;
d9ed80ee 8use IPC::Open3 'open3';
5d11d759 9
10plan skip_all => 'Enable this optional test with $ENV{C_M_DBIC_SCHEMA_TESTAPP}'
11 unless $ENV{C_M_DBIC_SCHEMA_TESTAPP};
12
13my $test_params = [
14 [ 'TestSchema', 'DBIC::Schema', '' ],
ce9e19dc 15 [ 'TestSchemaDSN', 'DBIC::Schema', qw/fakedsn fakeuser fakepass/, '{ AutoCommit => 1 }' ],
b34b0aff 16 [ 'TestSchemaDSN', 'DBIC::Schema', 'create=static', 'traits=Caching', q|moniker_map={ roles => 'ROLE' }|, 'constraint=^users\z', 'dbi:SQLite:testdb.db' ],
17 [ 'TestSchemaDSN', 'DBIC::Schema', 'create=static', 'traits=Caching', q|moniker_map={ roles => 'ROLE' }|, 'constraint=^users\z', 'dbi:SQLite:testdb.db', '', '', q|on_connect_do=['select 1', 'select 2']| ],
18 [ 'TestSchemaDSN', 'DBIC::Schema', 'create=static', 'traits=Caching', q|moniker_map={ roles => 'ROLE' }|, 'dbi:SQLite:testdb.db', q|on_connect_do=['select 1', 'select 2']| ],
ce9e19dc 19 [ 'TestSchemaDSN', 'DBIC::Schema', 'create=static', 'traits=Caching', 'inflect_singular=sub { $_[0] =~ /\A(.+?)(_id)?\z/; $1 }', q{moniker_map=sub { return join('', map ucfirst, split(/[\W_]+/, lc $_[0])); }}, 'dbi:SQLite:testdb.db' ],
5d11d759 20];
21
5d11d759 22my $test_dir = $FindBin::Bin;
b34b0aff 23my $blib_dir = catdir ($test_dir, '..', 'blib', 'lib');
24my $cat_dir = catdir ($test_dir, 'TestApp');
25my $catlib_dir = catdir ($cat_dir, 'lib');
26my $schema_dir = catdir ($catlib_dir, 'TestSchemaDSN');
27my $creator = catfile($cat_dir, 'script', 'testapp_create.pl');
28my $model_dir = catdir ($catlib_dir, 'TestApp', 'Model');
bd99d89c 29my $db = catfile($cat_dir, 'testdb.db');
b34b0aff 30
31my $catalyst_pl;
32
acb56229 33foreach my $bin (split /(?:$Config{path_sep}|:)/, $ENV{PATH}) {
b34b0aff 34 my $file = catfile($bin, 'catalyst.pl');
35 if (-f $file) {
36 $catalyst_pl = $file;
37 last;
38 }
39}
40
41plan skip_all => 'catalyst.pl not found' unless $catalyst_pl;
5d11d759 42
43chdir($test_dir);
d9ed80ee 44silent_exec("$^X $catalyst_pl TestApp");
5d11d759 45chdir($cat_dir);
46
a75b6e58 47# create test db
bd99d89c 48my $dbh = DBI->connect("dbi:SQLite:$db", '', '', {
49 RaiseError => 1, PrintError => 0
50});
51$dbh->do(<<'EOF');
a75b6e58 52CREATE TABLE users (
d9ed80ee 53 id INTEGER PRIMARY KEY,
54 username TEXT,
55 password TEXT,
56 email_address TEXT,
57 first_name TEXT,
58 last_name TEXT,
59 active INTEGER
a75b6e58 60);
bd99d89c 61EOF
62$dbh->do(<<'EOF');
a75b6e58 63CREATE TABLE roles (
64 id INTEGER PRIMARY KEY,
65 role TEXT
66);
67EOF
bd99d89c 68$dbh->disconnect;
a75b6e58 69
5d11d759 70foreach my $tparam (@$test_params) {
ce9e19dc 71 my ($model, $helper, @args) = @$tparam;
72
6b6abf77 73 cleanup_schema();
ce9e19dc 74
d9ed80ee 75 silent_exec($^X, "-I$blib_dir", $creator, 'model', $model, $helper, $model, @args);
ce9e19dc 76
b34b0aff 77 my $model_path = catfile($model_dir, $model . '.pm');
5d11d759 78 ok( -f $model_path, "$model_path is a file" );
d9ed80ee 79 my $compile_rv = silent_exec($^X, "-I$blib_dir", "-I$catlib_dir", "-c", $model_path);
5d11d759 80 ok($compile_rv == 0, "perl -c $model_path");
a75b6e58 81
ce9e19dc 82 if (grep /create=static/, @args) {
6b6abf77 83 my @result_files = result_files();
ce9e19dc 84
85 if (grep /constraint/, @args) {
6b6abf77 86 is scalar @result_files, 1, 'constraint works';
a75b6e58 87 } else {
6b6abf77 88 is scalar @result_files, 2, 'correct number of tables';
a75b6e58 89 }
6b6abf77 90
91 for my $file (@result_files) {
92 my $code = code_for($file);
93
94 like $code, qr/use Moose;\n/, 'use_moose enabled';
95 like $code, qr/__PACKAGE__->meta->make_immutable;\n/, 'use_moose enabled';
96 }
97 }
98}
99
100# Test that use_moose=1 is not applied to existing non-moose schemas (RT#60558)
101{
102 cleanup_schema();
103
d9ed80ee 104 silent_exec($^X, "-I$blib_dir", $creator, 'model',
6b6abf77 105 'TestSchemaDSN', 'DBIC::Schema', 'TestSchemaDSN',
106 'create=static', 'use_moose=0', 'dbi:SQLite:testdb.db'
107 );
108
109 my @result_files = result_files();
110
111 for my $file (@result_files) {
112 my $code = code_for($file);
113
114 unlike $code, qr/use Moose;\n/, 'non use_moose=1 schema';
115 unlike $code, qr/__PACKAGE__->meta->make_immutable;\n/, 'non use_moose=1 schema';
116 }
117
d9ed80ee 118 silent_exec($^X, "-I$blib_dir", $creator, 'model',
6b6abf77 119 'TestSchemaDSN', 'DBIC::Schema', 'TestSchemaDSN',
120 'create=static', 'dbi:SQLite:testdb.db'
121 );
122
123 for my $file (@result_files) {
124 my $code = code_for($file);
125
126 unlike $code, qr/use Moose;\n/,
127 'non use_moose=1 schema not upgraded to use_moose=1';
128 unlike $code, qr/__PACKAGE__->meta->make_immutable;\n/,
129 'non use_moose=1 schema not upgraded to use_moose=1';
a75b6e58 130 }
5d11d759 131}
132
1fcd7804 133# Test that a moose schema is not detected as a non-moose schema due to an
134# errant file.
135{
136 cleanup_schema();
137
d9ed80ee 138 silent_exec($^X, "-I$blib_dir", $creator, 'model',
1fcd7804 139 'TestSchemaDSN', 'DBIC::Schema', 'TestSchemaDSN',
140 'create=static', 'dbi:SQLite:testdb.db'
141 );
142
143 mkdir "$schema_dir/.svn";
144 open my $fh, '>', "$schema_dir/.svn/foo"
145 or die "Could not open $schema_dir/.svn/foo for writing: $!";
146 print $fh "gargle\n";
147 close $fh;
148
149 mkdir "$schema_dir/Result/.svn";
150 open $fh, '>', "$schema_dir/Result/.svn/foo"
151 or die "Could not open $schema_dir/Result/.svn/foo for writing: $!";
152 print $fh "hlagh\n";
153 close $fh;
154
d9ed80ee 155 silent_exec($^X, "-I$blib_dir", $creator, 'model',
1fcd7804 156 'TestSchemaDSN', 'DBIC::Schema', 'TestSchemaDSN',
157 'create=static', 'dbi:SQLite:testdb.db'
158 );
159
160 for my $file (result_files()) {
161 my $code = code_for($file);
162
163 like $code, qr/use Moose;\n/,
164 'use_moose detection not confused by version control files';
165 like $code, qr/__PACKAGE__->meta->make_immutable;\n/,
166 'use_moose detection not confused by version control files';
167 }
168}
169
ce9e19dc 170done_testing;
5d11d759 171
172sub rm_rf {
173 my $name = $File::Find::name;
b34b0aff 174 if(-d $name) { rmdir $name or warn "Cannot rmdir $name: $!" }
5d11d759 175 else { unlink $name or die "Cannot unlink $name: $!" }
176}
ce9e19dc 177
6b6abf77 178sub cleanup_schema {
179 return unless -d $schema_dir;
d9ed80ee 180 finddepth({ wanted => \&rm_rf, no_chdir => 1 }, $schema_dir);
6b6abf77 181 unlink "${schema_dir}.pm";
182}
183
184sub code_for {
185 my $file = shift;
186
187 open my $fh, '<', $file;
188 my $code = do { local $/; <$fh> };
189 close $fh;
190
191 return $code;
192}
193
194sub result_files {
b34b0aff 195 my $result_dir = catfile($schema_dir, 'Result');
196
197 my @results;
198
199 opendir my $dir, $result_dir
200 or die "Could not open $result_dir: $!";
201
202 while (my $file = readdir $dir) {
203 next unless $file =~ /\.pm\z/;
204
205 push @results, catfile($result_dir, $file);
206 }
207
208 closedir $dir;
6b6abf77 209
b34b0aff 210 return @results;
6b6abf77 211}
212
d9ed80ee 213sub silent_exec {
214 local *NULL;
215 open NULL, '+<', File::Spec->devnull;
216
217 my $pid = open3('<&NULL', '>&NULL', '>&NULL', @_);
218
219 waitpid $pid, 0;
220
221 return $?;
222}
223
ce9e19dc 224END {
87145c6c 225 if ($ENV{C_M_DBIC_SCHEMA_TESTAPP}) {
226 chdir($test_dir);
d9ed80ee 227 finddepth({ wanted => \&rm_rf, no_chdir => 1 }, $cat_dir);
87145c6c 228 }
ce9e19dc 229}
6b6abf77 230
231# vim:sts=3 sw=3 et tw=80: