package KiokuDB::Test::Fixture::TXN::Scan;
use Moose;
use Test::More;
use Test::Exception;
use Test::Moose;
use KiokuDB::Test::Person;
use namespace::clean -except => 'meta';
extends qw(KiokuDB::Test::Fixture::Scan);
override required_backend_roles => sub {
return (qw(TXN), super());
};
sub sort { 151 }
around populate => sub {
my ( $next, $self, @args ) = @_;
$self->txn_do(sub { $self->$next(@args) });
};
sub verify {
my $self = shift;
$self->txn_lives(sub {
my $root = $self->root_set;
does_ok( $root, "Data::Stream::Bulk" );
my @objs = $root->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(foo bar gorch) ],
"root set",
);
is_deeply(
[ sort $self->backend->root_entry_ids->all ],
[ sort @ids ],
"root set IDs",
);
});
throws_ok {
$self->txn_do(scope => 1, body => sub {
$self->insert_ok( KiokuDB::Test::Person->new( name => "another" ) );
my $root = $self->root_set;
does_ok( $root, "Data::Stream::Bulk" );
my @objs = $root->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(foo bar gorch another) ],
"root set reflects insertion",
);
is_deeply(
[ sort $self->backend->root_entry_ids->all ],
[ sort @ids ],
"root set IDs are the same",
);
die "rollback";
});
} qr/rollback/;
$self->txn_lives(sub {
my $root = $self->root_set;
my @objs = $root->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(foo bar gorch) ],
"root set rolled back",
);
is_deeply(
[ sort $self->backend->root_entry_ids->all ],
[ sort @ids ],
"ids are the same",
);
});
my $foo_id;
$self->txn_lives(sub {
my %objs = map { $_->name => $_ } $self->root_set->all;
$foo_id = $self->object_to_id($objs{foo});
});
ok( defined($foo_id), "got an ID for foo" );
throws_ok {
$self->txn_do(scope => 1, body => sub {
$self->delete_ok($foo_id);
{
my $root = $self->root_set;
my @objs = $root->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(bar gorch) ],
"root set reflects deletion",
);
is_deeply(
[ sort $self->backend->root_entry_ids->all ],
[ sort @ids ],
"root set IDs are the same",
);
}
{
$self->insert_ok( KiokuDB::Test::Person->new( name => "blah" ) );
my $root = $self->root_set;
does_ok( $root, "Data::Stream::Bulk" );
my @objs = $root->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(blah bar gorch) ],
"root set reflects deletion and insertion",
);
is_deeply(
[ sort $self->backend->root_entry_ids->all ],
[ sort @ids ],
"root set IDs are the same",
);
}
die "rollback";
});
} qr/rollback/;
$self->txn_lives(sub {
my $root = $self->root_set;
my @objs = $root->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(foo bar gorch) ],
"root set",
);
is_deeply(
[ sort $self->backend->root_entry_ids->all ],
[ sort @ids ],
"ids are the same",
);
});
$self->txn_lives(sub {
my @objs = $self->all_objects->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(foo bar gorch quxx) ],
"all entries",
);
is_deeply(
[ sort $self->backend->all_entry_ids->all ],
[ sort @ids ],
"all IDs",
);
});
throws_ok {
$self->txn_do(scope => 1, body => sub {
$self->backend->clear;
is_deeply(
[ $self->all_objects->all ],
[ ],
"no enrtries (db cleared)",
);
$self->insert_ok( KiokuDB::Test::Person->new( name => "very new" ) );
is_deeply(
[ map { $_->name } $self->all_objects->all ],
[ "very new" ],
"one entry",
);
$self->txn_lives(sub {
$self->backend->clear;
is_deeply(
[ $self->all_objects->all ],
[ ],
"no enrtries (db cleared)",
);
});
is_deeply(
[ $self->all_objects->all ],
[ ],
"no enrtries (db cleared)",
);
die "rollback";
});
} qr/rollback/, "rolled back";
$self->txn_lives(sub {
my @objs = $self->all_objects->all;
my @ids = $self->objects_to_ids(@objs);
is_deeply(
[ sort map { $_->name } @objs ],
[ sort qw(foo bar gorch quxx) ],
"all entries restored",
);
is_deeply(
[ sort $self->backend->all_entry_ids->all ],
[ sort @ids ],
"all IDs",
);
});
$self->txn_lives(sub {
$self->backend->clear;
});
$self->txn_lives(sub {
is_deeply(
[ $self->all_objects->all ],
[ ],
"no enrtries (db cleared)",
);
});
}
__PACKAGE__->meta->make_immutable;
__PACKAGE__
__END__