beginnings of IndexableBy
[dbsrgits/DBIx-Data-Store-old.git] / t / 01basic_collection.t
CommitLineData
65b76960 1use Test::More;
2use DBIx::Data::Store;
3use DBIx::Data::Store::CRUD;
4use DBIx::Data::Collection::Set;
65b76960 5use DBI;
de9534fa 6use Scalar::Util qw(refaddr);
7
8use Devel::Dwarn;
65b76960 9
1e948dd4 10use strict;
11use warnings FATAL => 'all';
12
65b76960 13my $dsn = 'dbi:SQLite:tmp.db';
14
d8eb0a3f 15sub sort_set {
16 sort { $a->{name} cmp $b->{name} } @_
17}
18
9f2b6cc8 19sub setup_db {
65b76960 20 unlink('tmp.db');
21 my $dbh = DBI->connect($dsn);
22 $dbh->do(q{
23 CREATE TABLE person (
24 id INTEGER NOT NULL PRIMARY KEY,
25 name VARCHAR(255) NOT NULL
26 )
27 });
28 my $pop = $dbh->prepare(q{INSERT INTO person (name) VALUES (?)});
29 my @names = qw(Joe Jim Bob Pterry);
30 $pop->execute($_) for @names;
9f2b6cc8 31 return sort_set do {
d8eb0a3f 32 my $id = 0; map +{ id => ++$id, name => $_ }, @names
33 };
65b76960 34}
35
9f2b6cc8 36my $db_store = DBIx::Data::Store->connect($dsn);
37
38sub make_store {
39 my ($crud) = @_;
40 DBIx::Data::Store::CRUD->new(
41 raw_store => $db_store,
42 select_sql => q{SELECT id, name FROM person},
43 select_column_order => [ qw(id name) ],
44 %$crud
45 );
46}
47
65b76960 48sub make_set {
9f2b6cc8 49 my ($set, $crud, $class) = @_;
50 ($class || 'DBIx::Data::Collection::Set')->new(
3a2e7c1c 51 set_over => [ 'id' ],
9f2b6cc8 52 store => make_store($crud),
1e948dd4 53 %$set
65b76960 54 );
55}
56
9f2b6cc8 57sub run_tests {
65b76960 58
9f2b6cc8 59 my @expect = setup_db;
65b76960 60
9f2b6cc8 61 my $set = make_set;
65b76960 62
9f2b6cc8 63 is_deeply([ sort_set $set->flatten ], \@expect, 'Basic data out ok (flatten)');
65b76960 64
9f2b6cc8 65 {
66 my $stream = $set->as_stream;
65b76960 67
9f2b6cc8 68 my @got; while (my ($next) = $stream->next) { push @got, $next }
1e948dd4 69
9f2b6cc8 70 is_deeply([ sort_set @got ], \@expect, 'Basic data out ok (stream)');
71 }
1e948dd4 72
9f2b6cc8 73 $set = make_set { class => 'Spoon' };
3a2e7c1c 74
9f2b6cc8 75 is_deeply(
76 [ sort_set $set->flatten ],
77 [ map { bless({ %$_ }, 'Spoon') } @expect ],
78 'Basic data with class out ok'
79 );
3a2e7c1c 80
9f2b6cc8 81 $set = make_set {}, {
82 insert_sql => q{INSERT INTO person (name) VALUES (?) },
83 insert_argument_order => [ 'name' ],
84 insert_command_constructor => sub {
85 require DBIx::Data::Store::Command::Insert::LastInsertId;
86 my $self = shift;
87 DBIx::Data::Store::Command::Insert::LastInsertId->new(
88 id_column => 'id',
89 raw_store => $self->raw_store,
90 insert_call_command => $self->raw_store->new_call_command(@_)
91 );
92 },
93 delete_sql => q{DELETE FROM person WHERE id = ?},
94 delete_argument_order => [ 'id' ],
95 };
de9534fa 96
9f2b6cc8 97 my $doug = $set->add({ name => 'Doug' });
de9534fa 98
9f2b6cc8 99 ok($doug->{id}, 'id filled out in new row');
3a2e7c1c 100
9f2b6cc8 101 my ($set_doug) = grep $_->{name} eq 'Doug', $set->flatten;
3a2e7c1c 102
9f2b6cc8 103 ok($set_doug, 'new row exists in flatten');
c51eabc5 104
9f2b6cc8 105 cmp_ok(refaddr($doug), '==', refaddr($set_doug), 'Same hashref returned');
c51eabc5 106
9f2b6cc8 107 $set->remove($doug);
c51eabc5 108
9f2b6cc8 109 is_deeply([ sort_set $set->flatten ], \@expect, 'new row gone after remove');
c51eabc5 110
9f2b6cc8 111 $set = make_set;
48d91d77 112
9f2b6cc8 113 is_deeply([ sort_set $set->flatten ], \@expect, 'new row still gone on reload');
48d91d77 114
9f2b6cc8 115 $set = make_set {}, {
116 update_sql => q{UPDATE person SET name = ? WHERE id = ?},
117 update_argument_order => [ qw(name id) ]
118 };
119
120 my ($pterry) = grep $_->{name} eq 'Pterry', $set->flatten;
48d91d77 121
9f2b6cc8 122 $pterry->{name} = 'Sir Pterry'; # http://xrl.us/bgse8s
48d91d77 123
9f2b6cc8 124 $set->_update_in_store($pterry);
48d91d77 125
9f2b6cc8 126 $set = make_set;
48d91d77 127
9f2b6cc8 128 my ($fresh_pterry) = grep $_->{name} =~ /Pterry/, $set->flatten;
48d91d77 129
9f2b6cc8 130 is($fresh_pterry->{name}, 'Sir Pterry', 'Update persisted correctly');
131
132 $set = make_set {}, {
133 select_single_sql => q{SELECT id, name FROM person WHERE id = ?},
134 select_single_argument_order => [ qw(id) ],
135 };
e49bd861 136
9f2b6cc8 137 my $pterry_id = (grep $_->{name} eq 'Pterry', @expect)[0]->{id};
e49bd861 138
9f2b6cc8 139 $pterry = $set->get({ id => $pterry_id });
e49bd861 140
9f2b6cc8 141 is($pterry->{name}, 'Sir Pterry', 'Pterry retrieved by id');
e49bd861 142
9f2b6cc8 143 ok(!defined($set->get({ id => -1 })), 'undef on missing id');
e49bd861 144
9f2b6cc8 145 $pterry->{name} = 'Pterry';
146
147 is_deeply([ sort_set $set->flatten ], \@expect, 'Basic data after fetch by id');
148
149 done_testing;
150}
b1c3fd5d 151
9f2b6cc8 152run_tests unless caller;
b1c3fd5d 153
9f2b6cc8 1541;