X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Flib%2Fdbixcsl_dumper_tests.pm;h=0382c0c23b97332cde3feca523944a297ac25f67;hb=160b07c52696f02de5573349e70c9892e71479ce;hp=1ee720a386c28bfb4389998c46ef8cd775ee141e;hpb=900195eb6fc5ac5c15673b5eef751d513c6cd972;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/t/lib/dbixcsl_dumper_tests.pm b/t/lib/dbixcsl_dumper_tests.pm index 1ee720a..0382c0c 100644 --- a/t/lib/dbixcsl_dumper_tests.pm +++ b/t/lib/dbixcsl_dumper_tests.pm @@ -5,22 +5,38 @@ use Test::More; use File::Path; use IPC::Open3; use IO::Handle; +use List::Util 'any'; use DBIx::Class::Schema::Loader::Utils 'dumper_squashed'; use DBIx::Class::Schema::Loader (); +use Class::Unload (); +use namespace::clean; -use dbixcsl_test_dir qw/$tdir/; +use dbixcsl_test_dir '$tdir'; my $DUMP_PATH = "$tdir/dump"; + sub cleanup { rmtree($DUMP_PATH, 1, 1); } -sub append_to_class { - my ($self, $class, $string) = @_; +sub class_file { + my ($self, $class) = @_; + $class =~ s{::}{/}g; $class = $DUMP_PATH . '/' . $class . '.pm'; + + return $class; +} + +sub append_to_class { + my ($self, $class, $string) = @_; + + $class = $self->class_file($class); + open(my $appendfh, '>>', $class) or die "Failed to open '$class' for append: $!"; + print $appendfh $string; + close($appendfh); } @@ -31,7 +47,10 @@ sub dump_test { $tdata{options}{dump_directory} = $DUMP_PATH; $tdata{options}{use_namespaces} ||= 0; - for my $dumper (\&_dump_directly, \&_dump_dbicdump) { + SKIP: for my $dumper (\&_dump_directly, \&_dump_dbicdump) { + skip 'skipping dbicdump tests on Win32', 1, + if $dumper == \&_dump_dbicdump && $^O eq 'MSWin32'; + _test_dumps(\%tdata, $dumper->(%tdata)); } } @@ -56,12 +75,13 @@ sub _dump_directly { }; my $err = $@; - $schema_class->storage->disconnect if !$err && $schema_class->storage; - undef *{$schema_class}; + my $classes = !$err && $schema_class->loader->generated_classes; + + Class::Unload->unload($schema_class); _check_error($err, $tdata{error}); - return @warns; + return \@warns, $classes; } sub _dump_dbicdump { @@ -74,7 +94,14 @@ sub _dump_dbicdump { while (my ($opt, $val) = each(%{ $tdata{options} })) { $val = dumper_squashed $val if ref $val; - push @cmd, '-o', "$opt=$val"; + + my $param = "$opt=$val"; + + if ($^O eq 'MSWin32') { + $param = q{"} . $param . q{"}; # that's not nearly enough... + } + + push @cmd, '-o', $param; } my @connect_info = _get_connect_info(\%tdata); @@ -103,7 +130,7 @@ sub _dump_dbicdump { _check_error($exception, $tdata{error}); } - return @warnings; + return \@warnings; } sub _get_connect_info { @@ -141,18 +168,27 @@ sub _check_error { } sub _test_dumps { - my ($tdata, @warns) = @_; + my ($tdata, $warns, $classes) = @_; my %tdata = %{$tdata}; my $schema_class = $tdata{classname}; my $check_warns = $tdata{warnings}; - is(@warns, @$check_warns, "$schema_class warning count") - or diag @warns; + is(@$warns, @$check_warns, "$schema_class warning count") + or diag @$warns; for(my $i = 0; $i <= $#$check_warns; $i++) { - like(($warns[$i] || ''), $check_warns->[$i], "$schema_class warning $i"); + like(($warns->[$i] || ''), $check_warns->[$i], "$schema_class warning $i"); + } + + if ($classes && (my $results = $tdata{generated_results})) { + my $ns = $tdata{options}{use_namespaces} ? ("::".($tdata{result_namespace} || "Result")) : ""; + is_deeply( + [ sort grep { $_ ne $schema_class } @$classes ], + [ sort map { "${schema_class}${ns}::$_" } @$results ], + "$schema_class generated_classes set correctly", + ); } my $file_regexes = $tdata{regexes}; @@ -174,19 +210,21 @@ sub _test_dumps { } } -sub _dump_file_like { +sub _slurp { my $path = shift; - open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!"; + open(my $dumpfh, '<:raw', $path) or die "Failed to open '$path': $!"; my $contents = do { local $/; <$dumpfh>; }; close($dumpfh); + return ($path, $contents); +} + +sub _dump_file_like { + my ($path, $contents) = _slurp shift; like($contents, $_, "$path matches $_") for @_; } sub _dump_file_not_like { - my $path = shift; - open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!"; - my $contents = do { local $/; <$dumpfh>; }; - close($dumpfh); + my ($path, $contents) = _slurp shift; unlike($contents, $_, "$path does not match $_") for @_; }