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