3 use DBIx::Data::Store::CRUD;
4 use DBIx::Data::Collection::Set;
6 use Scalar::Util qw(refaddr);
9 use warnings FATAL => 'all';
12 sort { $a->{name} cmp $b->{name} } @_
15 my $dsn = 'dbi:SQLite:tmp.db';
19 return DBI->connect($dsn)
26 id INTEGER NOT NULL PRIMARY KEY,
27 name VARCHAR(255) NOT NULL
30 my $pop = $dbh->prepare(q{INSERT INTO person (name) VALUES (?)});
31 my @names = qw(Joe Jim Bob Pterry);
32 $pop->execute($_) for @names;
34 my $id = 0; map +{ id => ++$id, name => $_ }, @names
38 my $db_store = DBIx::Data::Store->connect($dsn);
40 sub raw_store { $db_store }
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) ],
53 my ($set, $crud, $class) = @_;
54 ($class || 'DBIx::Data::Collection::Set')->new(
56 store => make_store($crud),
63 my @expect = setup_db;
67 is_deeply([ sort_set $set->flatten ], \@expect, 'Basic data out ok (flatten)');
70 my $stream = $set->as_stream;
72 my @got; while (my ($next) = $stream->next) { push @got, $next }
74 is_deeply([ sort_set @got ], \@expect, 'Basic data out ok (stream)');
77 $set = make_set { class => 'Spoon' };
80 [ sort_set $set->flatten ],
81 [ map { bless({ %$_ }, 'Spoon') } @expect ],
82 'Basic data with class out ok'
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;
91 DBIx::Data::Store::Command::Insert::LastInsertId->new(
93 raw_store => $self->raw_store,
94 insert_call_command => $self->raw_store->new_call_command(@_)
97 delete_single_sql => q{DELETE FROM person WHERE id = ?},
98 delete_single_argument_order => [ 'id' ],
101 my $doug = $set->add({ name => 'Doug' });
103 ok($doug->{id}, 'id filled out in new row');
105 my ($set_doug) = grep $_->{name} eq 'Doug', $set->flatten;
107 ok($set_doug, 'new row exists in flatten');
109 cmp_ok(refaddr($doug), '==', refaddr($set_doug), 'Same hashref returned');
113 is_deeply([ sort_set $set->flatten ], \@expect, 'new row gone after remove');
117 is_deeply([ sort_set $set->flatten ], \@expect, 'new row still gone on reload');
119 $set = make_set {}, {
120 update_single_sql => q{UPDATE person SET name = ? WHERE id = ?},
121 update_single_argument_order => [ qw(name id) ]
124 my ($pterry) = grep $_->{name} eq 'Pterry', $set->flatten;
126 $pterry->{name} = 'Sir Pterry'; # http://xrl.us/bgse8s
128 $set->_update_in_store($pterry);
132 my ($fresh_pterry) = grep $_->{name} =~ /Pterry/, $set->flatten;
134 is($fresh_pterry->{name}, 'Sir Pterry', 'Update persisted correctly');
136 $set = make_set {}, {
137 select_single_sql => q{SELECT id, name FROM person WHERE id = ?},
138 select_single_argument_order => [ qw(id) ],
141 my $pterry_id = (grep $_->{name} eq 'Pterry', @expect)[0]->{id};
143 $pterry = $set->get({ id => $pterry_id });
145 is($pterry->{name}, 'Sir Pterry', 'Pterry retrieved by id');
147 ok(!defined($set->get({ id => -1 })), 'undef on missing id');
149 $pterry->{name} = 'Pterry';
151 is_deeply([ sort_set $set->flatten ], \@expect, 'Basic data after fetch by id');
156 run_tests unless caller;