From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
our $VERSION = '0.000036';
use Carp qw/croak/;
use Test2::API qw/context/;
use Importer Importer => 'import';
our @EXPORT = qw/get_db_or_skipall get_db skipall_unless_can_db/;
sub skipall_unless_can_db {
my %spec;
if (@_ == 1) {
my $type = ref($_[0]) || '';
if (!$type) {
$spec{driver} = $_[0];
}
elsif ($type eq 'ARRAY') {
$spec{drivers} = $_[0];
}
elsif ($type eq 'HASH') {
%spec = %{$_[0]};
}
else {
croak "Invalid Argument: $_[0]";
}
}
else {
%spec = @_;
}
my $ctx = context();
$spec{bootstrap} = 1 unless defined $spec{bootstrap};
$spec{autostart} = 1 unless defined $spec{autostart};
$spec{load_sql} = 1 unless defined $spec{load_sql};
my $drivers = $spec{driver} ? [$spec{driver}] : $spec{drivers} || [DBIx::QuickDB->plugins];
my $reason;
my $ok = 0;
for my $driver (@$drivers) {
next unless defined $driver;
my ($v, $fqn, $why) = DBIx::QuickDB->check_driver($driver, \%spec);
$reason = $why if @$drivers == 1;
next unless $v;
$ok = $fqn;
last;
}
if ($ok) {
$ctx->release;
return $ok;
}
$ctx->plan(0, 'SKIP' => $reason || "no db driver is viable");
$ctx->release;
return;
}
sub get_db {
# Get a context in case anything below here has testing code.
my $ctx = context();
my $db = DBIx::QuickDB->build_db(@_);
$ctx->release;
return $db;
}
sub get_db_or_skipall {
my $name = ref($_[0]) ? undef : shift(@_);
my $spec = shift(@_) || {};
my $ctx = context();
skipall_unless_can_db(%$spec);
my $db = get_db($name ? $name : (), $spec);
$ctx->release;
return $db;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test2::Tools::QuickDB - Quickly spin up temporary Database servers for tests.
=head1 DESCRIPTION
This is a test library build around DBIx::QuickDB.
=head1 SYNOPSIS
use Test2::V0 -target => DBIx::QuickDB::Driver::PostgreSQL;
use Test2::Tools::QuickDB;
skipall_unless_can_db(driver => 'PostgreSQL');
my $db = get_db({driver => 'PostgreSQL', load_sql => 't/schema/postgresql.sql'});
...
=head1 EXPORTS
=over 4
=item $driver = skipall_unless_can_db('MyDriver')
=item $driver = skipall_unless_can_db(['MyDriver', 'OurDriver'])
=item $driver = skipall_unless_can_db(%spec)
This will look for a usable driver. If no usable driver is found, this will
issue a skip_all to skip the current test or subtest. If at least one suable
driver is found then the first one found will be returned.
If you pass in 1 argument it should either be a driver to try, or an arrayref
of drivers to try.
If you passing multiple argument then you should follow the specifications in
L<DBIx::QuickDB/"SPEC HASH">.
Feel free to ignore the return value.
=item $db = get_db
=item $db = get_db($name)
=item $db = get_db(\%spec)
=item $db = get_db($name, \%spec)
=item $db = get_db $name => \%spec
Get a database.
With no arguments it will give you an instance of the first working driver it
finds.
You can provide a name for the db, the same instance can then be retrieved
anywhere B<GLOBALLY> using the same name.
You can provide a spec hashref which can contain any arguments documented in
L<DBIx::QuickDB/"SPEC HASH">.
=item $db = get_db_or_skipall $name => \%spec
=item $db = get_db_or_skipall($name, \%spec)
=item $db = get_db_or_skipall($name)
=item $db = get_db_or_skipall(\%spec)
This combines C<get_db()> and C<skipall_unless_can_db()>. The arguments
supported are identical to C<get_db()>.
=back
=head1 SOURCE
The source code repository for DBIx-QuickDB can be found at
=head1 MAINTAINERS
=over 4
=item Chad Granum E<lt>exodist@cpan.orgE<gt>
=back
=head1 AUTHORS
=over 4
=item Chad Granum E<lt>exodist@cpan.orgE<gt>
=back
=head1 COPYRIGHT
Copyright 2020 Chad Granum E<lt>exodist7@gmail.comE<gt>.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=cut