use t::Utils; use xt::Utils::mysql; use Test::More; use Mock::Basic; my $dbh = t::Utils->setup_dbh; Mock::Basic->set_dbh($dbh); Mock::Basic->setup_test_db; subtest 'do basic transaction' => sub { Mock::Basic->txn_begin; my $row = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row->id, 1; is $row->name, 'perl'; Mock::Basic->txn_commit; is +Mock::Basic->single('mock_basic',{id => 1})->name, 'perl'; done_testing; }; subtest 'do rollback' => sub { Mock::Basic->txn_begin; my $row = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row->id, 2; is $row->name, 'perl'; Mock::Basic->txn_rollback; ok not +Mock::Basic->single('mock_basic',{id => 2}); done_testing; }; subtest 'do commit' => sub { Mock::Basic->txn_begin; my $row = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row->id, 3; is $row->name, 'perl'; Mock::Basic->txn_commit; ok +Mock::Basic->single('mock_basic',{id => 3}); done_testing; }; subtest 'do scope commit' => sub { my $txn = Mock::Basic->txn_scope; my $row = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row->id, 4; is $row->name, 'perl'; $txn->commit; ok +Mock::Basic->single('mock_basic',{id => 4}); done_testing; }; subtest 'do scope rollback' => sub { my $txn = Mock::Basic->txn_scope; my $row = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row->id, 5; is $row->name, 'perl'; $txn->rollback; ok not +Mock::Basic->single('mock_basic',{id => 5}); done_testing; }; subtest 'do scope guard for rollback' => sub { { local $SIG{__WARN__} = sub {}; my $txn = Mock::Basic->txn_scope; my $row = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row->id, 6; is $row->name, 'perl'; } ok not +Mock::Basic->single('mock_basic',{id => 6}); done_testing; }; subtest 'do nested scope rollback-rollback' => sub { my $txn = Mock::Basic->txn_scope; { my $txn2 = Mock::Basic->txn_scope; my $row2 = Mock::Basic->insert('mock_basic',{ name => 'perl5.10', }); is $row2->id, 7; is $row2->name, 'perl5.10'; $txn2->rollback; } my $row = Mock::Basic->insert('mock_basic',{ name => 'perl5.12', }); is $row->id, 8; is $row->name, 'perl5.12'; $txn->rollback; ok not +Mock::Basic->single('mock_basic',{id => 7}); ok not +Mock::Basic->single('mock_basic',{id => 8}); done_testing; }; subtest 'do nested scope commit-rollback' => sub { my $txn = Mock::Basic->txn_scope; { my $txn2 = Mock::Basic->txn_scope; my $row2 = Mock::Basic->insert('mock_basic',{ name => 'perl5.10', }); is $row2->id, 9; is $row2->name, 'perl5.10'; $txn2->commit; } my $row = Mock::Basic->insert('mock_basic',{ name => 'perl5.12', }); is $row->id, 10; is $row->name, 'perl5.12'; $txn->rollback; ok not +Mock::Basic->single('mock_basic',{id => 9}); ok not +Mock::Basic->single('mock_basic',{id => 10}); done_testing; }; subtest 'do nested scope rollback-commit' => sub { my $txn = Mock::Basic->txn_scope; { my $txn2 = Mock::Basic->txn_scope; my $row2 = Mock::Basic->insert('mock_basic',{ name => 'perl5.10', }); is $row2->id, 11; is $row2->name, 'perl5.10'; $txn2->rollback; } my $row = Mock::Basic->insert('mock_basic',{ name => 'perl5.12', }); is $row->id, 12; is $row->name, 'perl5.12'; eval { $txn->commit }; like( $@, qr/tried to commit but already rollbacked in nested transaction./, "error message" ); $txn->rollback; ok not +Mock::Basic->single('mock_basic',{id => 11}); ok not +Mock::Basic->single('mock_basic',{id => 12}); done_testing; }; subtest 'do nested scope commit-commit' => sub { my $txn = Mock::Basic->txn_scope; { my $txn2 = Mock::Basic->txn_scope; my $row2 = Mock::Basic->insert('mock_basic',{ name => 'perl5.10', }); is $row2->id, 13; is $row2->name, 'perl5.10'; $txn2->commit; } my $row = Mock::Basic->insert('mock_basic',{ name => 'perl5.12', }); is $row->id, 14; is $row->name, 'perl5.12'; $txn->commit; ok +Mock::Basic->single('mock_basic',{id => 13}); ok +Mock::Basic->single('mock_basic',{id => 14}); done_testing; }; subtest 'do nested scope rollback-commit-rollback' => sub { my $txn = Mock::Basic->txn_scope; { local $SIG{__WARN__} = sub {}; my $txn2 = Mock::Basic->txn_scope; my $row2 = Mock::Basic->insert('mock_basic',{ name => 'perl5.10', }); is $row2->id, 15; is $row2->name, 'perl5.10'; { my $txn3 = Mock::Basic->txn_scope; my $row3 = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row3->id, 16; is $row3->name, 'perl'; } eval { $txn2->commit }; like( $@, qr/tried to commit but already rollbacked in nested transaction./, "error message" ); } my $row = Mock::Basic->insert('mock_basic',{ name => 'perl5.12', }); is $row->id, 17; is $row->name, 'perl5.12'; $txn->rollback; ok not +Mock::Basic->single('mock_basic',{id => 15}); ok not +Mock::Basic->single('mock_basic',{id => 16}); ok not +Mock::Basic->single('mock_basic',{id => 17}); done_testing; }; subtest 'do nested scope rollback-commit-commit' => sub { my $txn = Mock::Basic->txn_scope; { local $SIG{__WARN__} = sub {}; my $txn2 = Mock::Basic->txn_scope; my $row2 = Mock::Basic->insert('mock_basic',{ name => 'perl5.10', }); is $row2->id, 18; is $row2->name, 'perl5.10'; { my $txn3 = Mock::Basic->txn_scope; my $row3 = Mock::Basic->insert('mock_basic',{ name => 'perl', }); is $row3->id, 19; is $row3->name, 'perl'; } } my $row = Mock::Basic->insert('mock_basic',{ name => 'perl5.12', }); is $row->id, 20; is $row->name, 'perl5.12'; eval { $txn->commit }; like( $@, qr/tried to commit but already rollbacked in nested transaction./, "error message" ); $txn->rollback; ok not +Mock::Basic->single('mock_basic',{id => 18}); ok not +Mock::Basic->single('mock_basic',{id => 19}); ok not +Mock::Basic->single('mock_basic',{id => 20}); done_testing; }; done_testing;