# -*- perl -*-
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl 1.t'
# vim: syntax=perl ts=4
#########################
use Test::More tests => 18;
#use Carp;
#$SIG{__WARN__} = \&Carp::cluck;
BEGIN {
use_ok( 'POE' ); # 1
use_ok( 'POE::Component::EasyDBI' ); # 2
use_ok( 'POE::Component::EasyDBI::SubProcess' ); # 3
};
SKIP: {
eval "use DBD::SQLite";
my $have_module = ($@) ? 0 : 1;
skip "DBD::SQLite not installed", 15 unless $have_module;
POE::Session->create(
# options => { trace => 1},
inline_states => {
_start => sub {
$_[KERNEL]->alias_set('test');
eval "use Time::Stopwatch";
POE::Component::EasyDBI->spawn(
alias => 'db',
dsn => 'dbi:SQLite:dbname=',
no_cache => 1, # don't use cached queries with DBD::AnyData
username => '',
password => '',
connected => [ $_[SESSION]->ID, 'connected' ],
connect_error => [ $_[SESSION]->ID, 'error' ],
# alt_fork => 1,
stopwatch => ($@) ? 0 : 1,
);
pass("component_started"); # 4
# shouldnt take more than 30 seconds to finish
$_[KERNEL]->delay_set(fail => 30);
},
fail => sub {
diag("test took too long to finish");
fail("too_damn_long");
return $_[KERNEL]->call($_[SESSION] => shutdown => 'NOW');
},
error => sub {
diag("connect failed $_[ARG0]->{error}");
fail("connect");
return $_[KERNEL]->call($_[SESSION] => shutdown => 'NOW');
},
connected => sub {
pass("connected"); # 5
$_[KERNEL]->post(db => do => {
begin_work => 1,
sql => 'CREATE TABLE test (id INT, foo TEXT, bar TEXT)',
commit => 1,
#event => $_[SESSION]->postback('table_created'),
event => 'table_created',
});
},
table_created => sub {
$_[ARG0] = $_[ARG1]->[0];
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("create_in_memory_table");
return $_[KERNEL]->call($_[SESSION] => shutdown => 'NOW');
}
# TODO check if table exists?
pass("create_in_memory_table"); # 6
$_[KERNEL]->post(db => combo => {
queries => [
{
insert => {
table => 'test',
insert => [
{ id => 1, foo => 123456, bar => 'a quick brown fox' },
{ id => 2, foo => 7891011, bar => time() },
],
},
},
{
insert => {
table => 'test',
hash => { id => 2, foo => 7891011, bar => time() },
},
},
],
event => 'hash',
});
},
hash => sub {
$_[ARG1]->{error} = "incorrect result:insert = $_[ARG1]->{result}"
unless (!ref($_[ARG1]->{result})
&& $_[ARG1]->{result} == 1
&& !defined($_[ARG1]->{error}));
if (defined($_[ARG1]->{error})) {
diag("$_[ARG1]->{error}");
fail("insert");
return $_[KERNEL]->call($_[SESSION] => shutdown => 'NOW');
}
diag("Query took $_[ARG1]->{stopwatch} seconds to complete") if (exists($_[ARG1]->{stopwatch}));
pass("insert"); # 7
$_[KERNEL]->post(db => hash => {
sql => 'SELECT * FROM test WHERE id=?',
placeholders => [ 1 ],
event => 'array',
});
},
array => sub {
$_[ARG0]->{error} = "incorrect result:hash"
unless (ref($_[ARG0]->{result}) eq 'HASH'
&& $_[ARG0]->{result}->{foo} == 123456
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("hash");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("hash"); # 8
$_[KERNEL]->post(db => array => {
sql => 'SELECT foo FROM test',
event => 'single',
});
},
single => sub {
$_[ARG0]->{error} = "incorrect result:array"
unless (ref($_[ARG0]->{result}) eq 'ARRAY'
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("array");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("array"); # 9
$_[KERNEL]->post(db => single => {
sql => 'SELECT id FROM test WHERE id=1',
event => 'db_do',
});
},
db_do => sub {
$_[ARG0]->{error} = "incorrect result:single"
unless (defined($_[ARG0]->{result})
&& $_[ARG0]->{result} == 1
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("single");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("single"); # 10
$_[KERNEL]->post(db => do => {
begin_work => 1,
sql => 'UPDATE test SET bar=? WHERE id=?',
placeholders => [ '\'%blah"', 2 ],
# using a session id here is messing up?
event => 'update',
});
},
update => sub {
# should of updated 2 rows
$_[ARG0]->{error} = "incorrect result:do = $_[0]->{result}"
unless (defined($_[ARG0]->{result})
&& $_[ARG0]->{result} == 2
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("do");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("do"); # 11
$_[KERNEL]->post(db => commit => {
event => 'commit',
});
},
commit => sub {
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("commit");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("commit"); # 12
# $_[KERNEL]->post(db => quote => {
# # method => 'quote',
# sql => '\'%blah"',
# # args => [ '\'%blah"' ],
# event => 'keyvalhash',
# });
# },
# keyvalhash => sub {
# $_[ARG0]->{error} = "incorrect result:quote == $_[ARG0]->{result}"
# unless (defined($_[ARG0]->{result})
# && $_[ARG0]->{result} eq '\'\\\'%blah"\''
# && !defined($_[ARG0]->{error}));
#
# if (defined($_[ARG0]->{error})) {
# diag("$_[ARG0]->{error}");
# fail("quote");
# return $_[KERNEL]->call(test => shutdown => 'NOW');
# }
# pass("quote"); # 12
$_[KERNEL]->post(db => keyvalhash => {
sql => 'SELECT id,bar FROM test',
event => 'hashhash',
});
},
hashhash => sub {
$_[ARG0]->{error} = "incorrect result:keyvalhash"
unless (defined($_[ARG0]->{result})
&& ref($_[ARG0]->{result}) eq 'HASH'
&& $_[ARG0]->{result}->{2} eq '\'%blah"'
&& $_[ARG0]->{result}->{1} eq 'a quick brown fox'
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("keyvalhash");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("keyvalhash"); # 13
$_[KERNEL]->post(db => hashhash => {
sql => 'SELECT * FROM test',
primary_key => 'id',
event => 'arrayhash',
});
},
arrayhash => sub {
$_[ARG0]->{error} = "incorrect result:hashhash"
unless (defined($_[ARG0]->{result})
&& ref($_[ARG0]->{result}) eq 'HASH'
&& $_[ARG0]->{result}->{2}->{bar} eq '\'%blah"'
&& $_[ARG0]->{result}->{1}->{bar} eq 'a quick brown fox'
&& $_[ARG0]->{result}->{1}->{foo} eq '123456'
&& $_[ARG0]->{result}->{2}->{foo} eq '7891011'
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("hashhash");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("hashhash"); # 14
$_[KERNEL]->post(db => arrayhash => {
sql => 'SELECT * FROM test ORDER BY id',
event => 'arrayarray',
});
},
arrayarray => sub {
$_[ARG0]->{error} = "incorrect result:arrayhash"
unless (defined($_[ARG0]->{result})
&& ref($_[ARG0]->{result}) eq 'ARRAY'
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("arrayhash");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
my @r = [
{ id => 1, foo => 123456, bar => 'a quick brown fox' },
{ id => 2, foo => 7891011, bar => '\'%blah"'},
];
my $d = $_[ARG0]->{result};
for my $i ( 0 .. $#{$r} ) {
foreach my $k (keys %{$r->[i]}) {
unless ($r->[$i]->{$k} eq $d->[$i]->{$k}) {
$_[ARG0]->{error} = "incorrect data in $i ($k)";
}
}
}
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("arrayhash");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass("arrayhash"); # 15
warn "\nYou should see an error next, this is intended\n";
$_[KERNEL]->post(db => do => {
sql => 'PDATE TEST SET bar=2',
event => 'cause_error',
});
},
cause_error => sub {
diag($_[ARG0]->{error}) if ($_[ARG0]->{error});
if (!defined($_[ARG0]->{error})) {
fail("cause_error");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass('cause_error'); # 16
$_[KERNEL]->post(db => arrayarray => {
sql => 'SELECT * FROM test ORDER BY id',
event => 'done',
});
},
done => sub {
$_[ARG0]->{error} = "incorrect result:arrayarray"
unless (defined($_[ARG0]->{result})
&& ref($_[ARG0]->{result}) eq 'ARRAY'
&& !defined($_[ARG0]->{error}));
if (defined($_[ARG0]->{error})) {
diag("$_[ARG0]->{error}");
fail("arrayarray");
return $_[KERNEL]->call(test => shutdown => 'NOW');
}
pass('arrayarray'); # 17
$_[KERNEL]->post(db => do => {
sql => 'UPDATE test SET id=0',
event => sub {
#warn $_[0]->{rows};
pass('eventcode'); # 18
diag("Query affected ".$_[0]->{rows}." rows");
$poe_kernel->post(test => 'shutdown');
},
});
},
shutdown => sub {
$_[KERNEL]->alarm_remove_all();
$_[KERNEL]->alias_remove('test');
$_[KERNEL]->call(db => 'shutdown' => $_[ARG0]);
return;
},
},
);
POE::Kernel->run();
};
#########################