add basic inflation wrapper and simple inflator
[dbsrgits/DBIx-Data-Store.git] / t / crud_wrapped.t
1 use strictures 1;
2 use Test::More;
3 use DBIx::Data::Store::Inflator::Simple;
4 use DBIx::Data::Collection::Set::Wrapper::Inflate;
5
6 BEGIN { require 't/crud.t' }
7
8 { package My::Name; sub id { shift->{id} } sub name { shift->{name} } }
9
10 sub mkobj { bless({ id => $_[0][0], name => $_[0][1] }, 'My::Name') }
11
12 sub run_tests_crud_wrapped {
13   setup_db;
14
15   my $unwrapped = make_store;
16   my $store = DBIx::Data::Collection::Set::Wrapper::Inflate->new({
17     inner => $unwrapped,
18     inflator => DBIx::Data::Store::Inflator::Simple->new({
19       spec_columns => [ 'id' ], body_columns => [ 'name' ],
20       all_columns => [ 'id', 'name' ], class => 'My::Name'
21     })
22   });
23
24   my $bob = mkobj([1,'Bob']);
25
26   is_deeply([$store->flatten], [], 'Empty set');
27
28   is_deeply($store->add({ name => 'Bob' }), $bob, 'Add record');
29
30   is_deeply([$store->flatten], [$bob], 'One member');
31
32   is_deeply($store->get({ id => 1 }), $bob, 'Retrieve by key');
33
34   $bob = mkobj([1,'Robert']);
35
36   $store->replace($bob,$bob);
37
38   is_deeply([$store->flatten], [$bob], 'Name changed (all)');
39
40   is_deeply($store->get({ id => 1 }), $bob, 'Retrieve by key');
41
42   $store->add({ name => $_ }) for qw(Joe James Jim);
43
44   my $flatsort = sub {
45     [ sort { $a->id <=> $b->id } $store->flatten ]
46   };
47
48   is_deeply($flatsort->(), [
49     map mkobj($_), [1,'Robert'],[2,'Joe'],[3,'James'],[4,'Jim']
50   ], 'Four members');
51
52   my $james = mkobj([3,'James']);
53
54   is_deeply($store->get({ id => 3 }), $james, 'Retrieve by key');
55
56   $store->remove($james);
57
58   is_deeply($flatsort->(), [
59     map mkobj($_), [1,'Robert'],[2,'Joe'],[4,'Jim']
60   ], 'Three members left');
61
62   done_testing;
63 }
64
65 run_tests_crud_wrapped unless caller;