add basic inflation wrapper and simple inflator
[dbsrgits/DBIx-Data-Store.git] / t / crud_wrapped.t
diff --git a/t/crud_wrapped.t b/t/crud_wrapped.t
new file mode 100644 (file)
index 0000000..db617f5
--- /dev/null
@@ -0,0 +1,65 @@
+use strictures 1;
+use Test::More;
+use DBIx::Data::Store::Inflator::Simple;
+use DBIx::Data::Collection::Set::Wrapper::Inflate;
+
+BEGIN { require 't/crud.t' }
+
+{ package My::Name; sub id { shift->{id} } sub name { shift->{name} } }
+
+sub mkobj { bless({ id => $_[0][0], name => $_[0][1] }, 'My::Name') }
+
+sub run_tests_crud_wrapped {
+  setup_db;
+
+  my $unwrapped = make_store;
+  my $store = DBIx::Data::Collection::Set::Wrapper::Inflate->new({
+    inner => $unwrapped,
+    inflator => DBIx::Data::Store::Inflator::Simple->new({
+      spec_columns => [ 'id' ], body_columns => [ 'name' ],
+      all_columns => [ 'id', 'name' ], class => 'My::Name'
+    })
+  });
+
+  my $bob = mkobj([1,'Bob']);
+
+  is_deeply([$store->flatten], [], 'Empty set');
+
+  is_deeply($store->add({ name => 'Bob' }), $bob, 'Add record');
+
+  is_deeply([$store->flatten], [$bob], 'One member');
+
+  is_deeply($store->get({ id => 1 }), $bob, 'Retrieve by key');
+
+  $bob = mkobj([1,'Robert']);
+
+  $store->replace($bob,$bob);
+
+  is_deeply([$store->flatten], [$bob], 'Name changed (all)');
+
+  is_deeply($store->get({ id => 1 }), $bob, 'Retrieve by key');
+
+  $store->add({ name => $_ }) for qw(Joe James Jim);
+
+  my $flatsort = sub {
+    [ sort { $a->id <=> $b->id } $store->flatten ]
+  };
+
+  is_deeply($flatsort->(), [
+    map mkobj($_), [1,'Robert'],[2,'Joe'],[3,'James'],[4,'Jim']
+  ], 'Four members');
+
+  my $james = mkobj([3,'James']);
+
+  is_deeply($store->get({ id => 3 }), $james, 'Retrieve by key');
+
+  $store->remove($james);
+
+  is_deeply($flatsort->(), [
+    map mkobj($_), [1,'Robert'],[2,'Joe'],[4,'Jim']
+  ], 'Three members left');
+
+  done_testing;
+}
+
+run_tests_crud_wrapped unless caller;