3 use DBIx::Data::Store::CRUD;
4 use DBIx::Data::Collection::Set;
6 use Scalar::Util qw(refaddr);
11 use warnings FATAL => 'all';
13 my $dsn = 'dbi:SQLite:tmp.db';
18 sort { $a->{name} cmp $b->{name} } @_
23 my $dbh = 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;
33 @expect = sort_set do {
34 my $id = 0; map +{ id => ++$id, name => $_ }, @names
39 my ($set, $crud) = @_;
40 DBIx::Data::Collection::Set->new(
42 store => DBIx::Data::Store::CRUD->new(
43 raw_store => DBIx::Data::Store->connect($dsn),
44 select_sql => q{SELECT id, name FROM person},
45 select_column_order => [ qw(id name) ],
54 is_deeply([ sort_set $set->flatten ], \@expect, 'Basic data out ok (flatten)');
57 my $stream = $set->as_stream;
59 my @got; while (my ($next) = $stream->next) { push @got, $next }
61 is_deeply([ sort_set @got ], \@expect, 'Basic data out ok (stream)');
64 $set = make_set { class => 'Spoon' };
67 [ sort_set $set->flatten ],
68 [ map { bless({ %$_ }, 'Spoon') } @expect ],
69 'Basic data with class out ok'
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;
78 DBIx::Data::Store::Command::Insert::LastInsertId->new(
80 raw_store => $self->raw_store,
81 insert_call_command => $self->raw_store->new_call_command(@_)
84 delete_sql => q{DELETE FROM person WHERE id = ?},
85 delete_argument_order => [ 'id' ],
88 my $doug = $set->add({ name => 'Doug' });
90 ok($doug->{id}, 'id filled out in new row');
92 my ($set_doug) = grep $_->{name} eq 'Doug', $set->flatten;
94 ok($set_doug, 'new row exists in flatten');
96 cmp_ok(refaddr($doug), '==', refaddr($set_doug), 'Same hashref returned');
100 is_deeply([ sort_set $set->flatten ], \@expect, 'new row gone after remove');
104 is_deeply([ sort_set $set->flatten ], \@expect, 'new row still gone on reload');