add basic inflation wrapper and simple inflator
[dbsrgits/DBIx-Data-Store.git] / t / crud.t
1 use strictures 1;
2 use Test::More;
3
4 use DBIx::Data::Store::CRUD;
5 use DBIx::Data::Store::Raw;
6
7 use DBI;
8 use Scalar::Util qw(refaddr);
9
10 sub sort_set {
11   sort { $a->{name} cmp $b->{name} } @_
12 }
13
14 my $dsn = 'dbi:SQLite:tmp.db';
15
16 sub setup_dbh {
17   unlink('tmp.db');
18   return DBI->connect($dsn, undef, undef, { RaiseError => 1 })
19 }
20
21 sub setup_db {
22   my $dbh = setup_dbh;
23   $dbh->do(q{
24     CREATE TABLE names (
25       id INTEGER NOT NULL PRIMARY KEY,
26       name VARCHAR(255) NOT NULL
27     )
28   });
29   #my $pop = $dbh->prepare(q{INSERT INTO person (name) VALUES (?)});
30   #my @names = qw(Joe Jim Bob Pterry);
31   #$pop->execute($_) for @names;
32   #return sort_set do {
33   #  my $id = 0; map +{ id => ++$id, name => $_ }, @names
34   #};
35 }
36
37 my $db_store = DBIx::Data::Store::Raw->connect($dsn);
38
39 sub raw_store { $db_store }
40
41 sub make_store {
42   my ($crud) = @_;
43   DBIx::Data::Store::CRUD->new({
44     raw => $db_store,
45     sql => {
46       select_all => 'SELECT id, name FROM names',
47       delete_all => 'DELETE FROM names',
48       select_one => 'SELECT id, name FROM names WHERE id = ?',
49       insert_one => sub {
50         my ($store, undef, $dbh, $args) = @_;
51         $store->_sth_for($dbh, 'INSERT INTO names (name) VALUES (?)', $args);
52         [ $dbh->last_insert_id(undef,undef,undef,undef), @$args ];
53       },
54       update_one => 'UPDATE names SET name = ? WHERE id = ?',
55       delete_one => 'DELETE FROM names WHERE id = ?',
56     },
57   });
58 }
59
60 sub run_tests {
61   setup_db;
62
63   my $store = make_store;
64
65   is_deeply([$store->flatten], [], 'Empty set');
66
67   is_deeply($store->add(['Bob']), [1,'Bob'], 'Add record');
68
69   is_deeply([$store->flatten], [[1,'Bob']], 'One member');
70
71   is_deeply($store->get([1]), [1,'Bob'], 'Retrieve by key');
72
73   $store->replace([1],['Robert']);
74
75   is_deeply([$store->flatten], [[1,'Robert']], 'Name changed (all)');
76
77   is_deeply($store->get([1]), [1,'Robert'], 'Retrieve by key');
78
79   $store->add([$_]) for qw(Joe James Jim);
80
81   my $flatsort = sub {
82     [ sort { $a->[0] <=> $b->[0] } $store->flatten ]
83   };
84
85   is_deeply($flatsort->(), [
86     [1,'Robert'],[2,'Joe'],[3,'James'],[4,'Jim']
87   ], 'Four members');
88
89   is_deeply($store->get([3]),[3,'James'], 'Retrieve by key');
90
91   $store->remove([3]);
92
93   is_deeply($flatsort->(), [
94     [1,'Robert'],[2,'Joe'],[4,'Jim']
95   ], 'Three members left');
96
97   done_testing;
98 }
99
100 run_tests unless caller;