File Coverage

blib/lib/KiokuDB/Test/Fixture/TXN.pm
Criterion Covered Total %
statement 146 146 100.0
branch 20 22 90.9
condition n/a
subroutine 14 14 100.0
pod 0 2 0.0
total 180 184 97.8


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package KiokuDB::Test::Fixture::TXN;
4 2     2   1773 use Moose;
  2         6  
  2         13  
5              
6 2     2   9843 use Test::More;
  2         6  
  2         17  
7 2     2   518 use Test::Exception;
  2         3  
  2         14  
8              
9 2     2   385 use namespace::clean -except => 'meta';
  2         3  
  2         17  
10              
11             extends qw(KiokuDB::Test::Fixture::Small);
12              
13 2     2   822 use constant required_backend_roles => qw(TXN);
  2         3  
  2         2209  
14              
15 14     14 0 29 sub sort { 150 }
16              
17             around populate => sub {
18             my ( $next, $self, @args ) = @_;
19             $self->txn_do(sub { $self->$next(@args) });
20             };
21              
22             sub verify {
23 33     33 0 83 my $self = shift;
24              
25 33         1084 my $l = $self->directory->live_objects;
26              
27 33         959 $self->exists_ok($self->joe);
28              
29 33         14036 my $keep = $self->directory->live_objects->keep_entries;
30              
31             {
32 33         65 my $s = $self->new_scope;
  33         275  
33              
34 33         958 my $joe = $self->lookup_ok( $self->joe );
35              
36 33         1336 is( $joe->name, "joe", "name attr" );
37              
38 33         9965 my $entry = $l->objects_to_entries($joe);
39              
40 33 100       263 isa_ok( $entry, "KiokuDB::Entry" ) if $keep;
41              
42             lives_ok {
43             $self->txn_do(sub {
44 33         1086 $joe->name("HALLO");
45 33         238 $self->update_ok($joe);
46              
47 33 100       243 if ( $keep ) {
48 17         84 my $updated_entry = $l->objects_to_entries($joe);
49              
50 17         115 isnt( $updated_entry, $entry, "entry updated" );
51 17         5585 is( $updated_entry->prev, $entry, "parent of updated is orig" );
52             }
53 33     33   1284 });
54 33         6376 } "successful transaction";
55              
56 33 100       11590 if ( $keep ) {
57 17         75 my $updated_entry = $l->objects_to_entries($joe);
58              
59 17         106 isnt( $updated_entry, $entry, "entry updated" );
60 17         5643 is( $updated_entry->prev, $entry, "parent of updated is orig" );
61             }
62              
63 33         6279 is( $joe->name, "HALLO", "name attr" );
64              
65 33         11357 undef $joe;
66             }
67              
68 33         388 $self->no_live_objects;
69              
70             {
71 33         61 {
72 33         57 my $s = $self->new_scope;
  33         290  
73              
74 33         1152 my $joe = $self->lookup_ok( $self->joe );
75              
76 33         221 my $entry = $l->objects_to_entries($joe);
77              
78 33 100       189 isa_ok( $entry, "KiokuDB::Entry" ) if $keep;
79              
80             throws_ok {
81             $self->txn_do(sub {
82 33         1104 $joe->name("YASE");
83 33         268 $self->update_ok($joe);
84              
85 33 100       224 if ( $keep ) {
86 17         75 my $updated_entry = $l->objects_to_entries($joe);
87              
88 17         113 isnt( $updated_entry, $entry, "entry updated" );
89 17         5663 is( $updated_entry->prev, $entry, "parent of updated is orig" );
90             }
91              
92 33         5261 die "foo";
93 33     33   1370 });
94 33         6457 } qr/foo/, "failed transaction";
95              
96 33 100       11047 if ( $keep ) {
97 17         68 my $updated_entry = $l->objects_to_entries($joe);
98              
99 17         67 is( $updated_entry, $entry, "entry rolled back" );
100             }
101              
102 33         6426 is( $joe->name, "YASE", "name not rolled back in live object" );
103              
104 33         11039 undef $joe;
105             }
106              
107 33         338 $self->no_live_objects;
108              
109             {
110 33         68 my $s = $self->new_scope;
  33         278  
111              
112 33         1145 my $joe = $self->lookup_ok( $self->joe );
113              
114 33         1341 is( $joe->name, "HALLO", "name rolled back in DB" );
115              
116 33         11475 undef $joe;
117             }
118              
119 33         343 $self->no_live_objects;
120             }
121              
122             # txn_do nesting should still work, even if nested transactions are not supported
123             {
124 33         72 {
125 33         57 my $s = $self->new_scope;
  33         270  
126              
127 33         1097 my $joe = $self->lookup_ok( $self->joe );
128              
129 33         1274 is( $joe->name, "HALLO", "name attr" );
130              
131 33         10399 my $entry = $l->objects_to_entries($joe);
132              
133 33 100       182 isa_ok( $entry, "KiokuDB::Entry" ) if $keep;
134              
135             throws_ok {
136             $self->txn_do(sub {
137 33         1106 $joe->name("lalalala");
138 33         238 $self->update_ok($joe);
139             $self->txn_do(sub {
140 33         1107 $joe->name("oi");
141 33         256 $self->update_ok($joe);
142              
143 33 100       205 if ( $keep ) {
144 17         96 my $updated_entry = $l->objects_to_entries($joe);
145              
146 17         110 isnt( $updated_entry, $entry, "entry updated" );
147 17         6001 is( $updated_entry->prev->prev, $entry, "parent of parent of updated is orig" );
148             }
149              
150 33         5923 die "foo";
151 33         575 });
152 33     33   1342 });
153 33         6612 } qr/foo/, "failed transaction";
154              
155 33 100       12221 if ( $keep ) {
156 17         68 my $updated_entry = $l->objects_to_entries($joe);
157              
158 17         76 is( $updated_entry, $entry, "entry rolled back" );
159             }
160              
161 33         7058 is( $joe->name, "oi", "name attr of object" );
162              
163 33         11649 undef $joe;
164             }
165              
166 33         357 $self->no_live_objects;
167              
168             {
169 33         60 my $s = $self->new_scope;
  33         283  
170              
171 33         1138 my $joe = $self->lookup_ok( $self->joe );
172              
173 33         1304 is( $joe->name, "HALLO", "name rolled back in DB" );
174              
175 33         11692 undef $joe;
176             }
177              
178 33         340 $self->no_live_objects;
179             }
180              
181             {
182 33         61 $self->txn_do( scope => 1, body => sub {
183 33     33   250 my $s = $self->new_scope;
184             {
185 33         80 my $s = $self->new_scope;
  33         138  
186              
187 33         1171 my $joe = $self->lookup_ok( $self->joe );
188              
189 33         1337 $joe->name("YASE");
190 33         291 $self->update_ok($joe);
191             }
192              
193             $self->no_live_entries
194 33 50       1079 unless $self->backend->does("KiokuDB::Backend::Role::TXN::Memory");
195 33         491 });
196              
197 33 50       1073 $self->no_live_entries
198             unless $self->backend->does("KiokuDB::Backend::Role::TXN::Memory");
199             }
200              
201             {
202 33         1207 {
203 33         57 my $s = $self->new_scope;
  33         280  
204              
205 33         1203 my $joe = $self->lookup_ok( $self->joe );
206              
207             throws_ok {
208             $self->txn_do(sub {
209 33         261 $self->delete_ok($joe);
210 33         1469 $self->deleted_ok($self->joe);
211 33         11327 die "foo";
212 33     33   1418 });
213 33         462 } qr/foo/, "failed transaction";
214              
215 33         13084 $self->exists_ok($self->joe);
216              
217 33         12188 undef $joe;
218             }
219              
220 33         291 $self->no_live_objects;
221              
222             {
223 33         60 my $s = $self->new_scope;
  33         262  
224              
225 33         1056 $self->exists_ok($self->joe);
226              
227 33         12545 $self->lookup_ok( $self->joe );
228             }
229              
230 33         336 $self->no_live_objects;
231             }
232              
233             {
234 33         65 {
235 33         60 my $s = $self->new_scope;
  33         331  
236              
237             throws_ok {
238             $self->txn_do(sub {
239 33         1265 $self->delete_ok($self->joe);
240 33         1424 $self->deleted_ok($self->joe);
241 33         10581 die "foo";
242 33     33   1358 });
243 33         435 } qr/foo/, "failed transaction";
244              
245 33         12431 $self->exists_ok($self->joe);
246             }
247              
248 33         308 $self->no_live_objects;
249              
250 33         921 $self->exists_ok($self->joe);
251             }
252              
253             {
254 33         10609 {
255 33         75 my $s = $self->new_scope;
  33         246  
256              
257             $self->txn_do(sub {
258 33     33   1103 $self->delete_ok($self->joe);
259 33         1430 $self->deleted_ok($self->joe);
260 33         401 });
261              
262 33         1828 $self->deleted_ok($self->joe);
263             }
264              
265 33         270 $self->no_live_objects;
266              
267 33         915 $self->deleted_ok($self->joe);
268             }
269             }
270              
271             __PACKAGE__->meta->make_immutable;
272              
273             __PACKAGE__
274              
275             __END__