—package
Test2::Tools::QuickDB;
use
strict;
use
warnings;
our
$VERSION
=
'0.000036'
;
use
DBIx::QuickDB();
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