very basic outline
[dbsrgits/DBIx-Data-Store.git] / t / crud.t
CommitLineData
54bed31b 1use strictures 1;
2use Test::More;
3
4use DBIx::Data::Store::CRUD;
5use DBIx::Data::Store::Raw;
6
7use DBI;
8use Scalar::Util qw(refaddr);
9
10sub sort_set {
11 sort { $a->{name} cmp $b->{name} } @_
12}
13
14my $dsn = 'dbi:SQLite:tmp.db';
15
16sub setup_dbh {
17 unlink('tmp.db');
18 return DBI->connect($dsn, undef, undef, { RaiseError => 1 })
19}
20
21sub 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
37my $db_store = DBIx::Data::Store::Raw->connect($dsn);
38
39sub raw_store { $db_store }
40
41sub 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
56setup_db;
57
58my $store = make_store;
59
60is_deeply([$store->flatten], [], 'Empty set');
61
62is_deeply($store->add(['Bob']), [1], 'Add record');
63
64is_deeply([$store->flatten], [[1,'Bob']], 'One member');
65
66is_deeply($store->get([1]), [1,'Bob'], 'Retrieve by key');
67
68$store->replace([1],['Robert']);
69
70is_deeply([$store->flatten], [[1,'Robert']], 'Name changed (all)');
71
72is_deeply($store->get([1]), [1,'Robert'], 'Retrieve by key');
73
74$store->add([$_]) for qw(Joe James Jim);
75
76my $flatsort = sub {
77 [ sort { $a->[0] <=> $b->[0] } $store->flatten ]
78};
79
80is_deeply($flatsort->(), [
81 [1,'Robert'],[2,'Joe'],[3,'James'],[4,'Jim']
82], 'Four members');
83
84is_deeply($store->get([3]),[3,'James'], 'Retrieve by key');
85
86$store->remove([3]);
87
88is_deeply($flatsort->(), [
89 [1,'Robert'],[2,'Joe'],[4,'Jim']
90], 'Three members left');
91
92done_testing;