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