allow coderef in place of SQL for complex commands
[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) ];
53       },
54       update_one => 'UPDATE names SET name = ? WHERE id = ?',
55       delete_one => 'DELETE FROM names WHERE id = ?',
56     },
57   });
58 }
59
60 setup_db;
61
62 my $store = make_store;
63
64 is_deeply([$store->flatten], [], 'Empty set');
65
66 is_deeply($store->add(['Bob']), [1], 'Add record');
67
68 is_deeply([$store->flatten], [[1,'Bob']], 'One member');
69
70 is_deeply($store->get([1]), [1,'Bob'], 'Retrieve by key');
71
72 $store->replace([1],['Robert']);
73
74 is_deeply([$store->flatten], [[1,'Robert']], 'Name changed (all)');
75
76 is_deeply($store->get([1]), [1,'Robert'], 'Retrieve by key');
77
78 $store->add([$_]) for qw(Joe James Jim);
79
80 my $flatsort = sub {
81   [ sort { $a->[0] <=> $b->[0] } $store->flatten ]
82 };
83
84 is_deeply($flatsort->(), [
85   [1,'Robert'],[2,'Joe'],[3,'James'],[4,'Jim']
86 ], 'Four members');
87
88 is_deeply($store->get([3]),[3,'James'], 'Retrieve by key');
89
90 $store->remove([3]);
91
92 is_deeply($flatsort->(), [
93   [1,'Robert'],[2,'Joe'],[4,'Jim']
94 ], 'Three members left');
95
96 done_testing;