better cleanup of t/var
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / lib / dbixcsl_test_dir.pm
index d1b3992..39d02b0 100644 (file)
@@ -1,7 +1,11 @@
 package dbixcsl_test_dir;
 
-use warnings;
 use strict;
+use warnings;
+use File::Path 'rmtree';
+use Scalar::Util 'weaken';
+use namespace::clean;
+use DBI ();
 
 our $tdir = 't/var';
 
@@ -15,4 +19,31 @@ unless (-d $tdir) {
   mkdir $tdir or die "Unable to create $tdir: $!\n";
 }
 
+# We need to disconnect all active DBI handles before deleting the directory,
+# otherwise the SQLite .db files cannot be deleted on Win32 (file in use) since
+# END does not run in any sort of order.
+
+no warnings 'redefine';
+
+my $connect = \&DBI::connect;
+
+my @handles;
+
+*DBI::connect = sub {
+    my $dbh = $connect->(@_);
+    push @handles, $dbh;
+    weaken $handles[-1];
+    return $dbh;
+};
+
+END {
+    if (not $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP}) {
+        foreach my $dbh (@handles) {
+            $dbh->disconnect if $dbh;
+        }
+
+        rmtree($tdir, 1, 1)
+    }
+}
+
 1;