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