use strict;
use warnings;
use utf8;
use t::Utils;
use Test::More;
use DBIx::TransactionManager;
subtest 'do scope commit' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $txn = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (1,'baz')");
$txn->commit;
my $row = $dbh->selectrow_hashref('select * from foo');
is $row->{id}, 1;
is $row->{var}, 'baz';
};
subtest 'do scope rollback' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $txn = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (2,'boo')");
$txn->rollback;
my $row = $dbh->selectrow_hashref('select * from foo');
ok not $row;
};
subtest 'do scope guard for rollback' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
{
local $SIG{__WARN__} = sub {};
my $txn = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (3,'bebe')");
} # do rollback auto.
my $row = $dbh->selectrow_hashref('select * from foo');
ok not $row;
};
subtest 'do nested scope rollback-rollback' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $txn = $tm->txn_scope;
{
my $txn2 = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (4,'kumu')");
$txn2->rollback;
}
$dbh->do("insert into foo (id, var) values (5,'kaka')");
$txn->rollback;
ok not $dbh->selectrow_hashref('select * from foo');
};
subtest 'do nested scope commit-rollback' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $txn = $tm->txn_scope;
{
my $txn2 = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (6,'muki')");
$txn2->commit;
ok $dbh->selectrow_hashref('select * from foo');
}
$dbh->do("insert into foo (id, var) values (7,'mesi')");
$txn->rollback;
ok not $dbh->selectrow_hashref('select * from foo');
};
subtest 'do nested scope rollback-commit' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
{
local $SIG{__WARN__} = sub {};
my $txn = $tm->txn_scope;
{
my $txn2 = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (8,'uso')");
$txn2->rollback;
}
$dbh->do("insert into foo (id, var) values (9,'nani')");
eval {$txn->commit}; # XXX
like $@, qr/tried to commit but already rollbacked in nested transaction./;
}
my $row = $dbh->selectrow_hashref('select * from foo');
ok not $dbh->selectrow_hashref('select * from foo');
};
subtest 'do nested scope commit-commit' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $txn = $tm->txn_scope;
{
my $txn2 = $tm->txn_scope;
$dbh->do("insert into foo (id, var) values (10,'ahi')");
$txn2->commit;
}
$dbh->do("insert into foo (id, var) values (11,'uhe')");
$txn->commit;
my @rows = $dbh->selectrow_array('select * from foo');
is scalar(@rows), 2;
};
subtest 'do automatic rollback' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $warn;
local $SIG{__WARN__} = sub {
local $SIG{__WARN__} = 'DEFAULT';
$warn = $_[0]
};
{
my $txn = $tm->txn_scope;
}
like($warn, qr/Transaction was aborted without calling an explicit commit or rollback\. \(Guard created at \.?\/?t\/scope.t line 133\)/);
};
subtest 'pass arbitrary caller info' => sub {
my $dbh = t::Utils::setup;
my $tm = DBIx::TransactionManager->new($dbh);
my $warn;
local $SIG{__WARN__} = sub {
local $SIG{__WARN__} = 'DEFAULT';
$warn = $_[0]
};
{
my $txn = $tm->txn_scope( caller => [ "foo", "hoge.pm", 1 ] );
}
like($warn, qr/Transaction was aborted without calling an explicit commit or rollback\. \(Guard created at hoge.pm line 1\)/);
};
done_testing;