use strict;
use Test::More tests => 68;
BEGIN {
use_ok('DBD::Mock');
}
{ # check the available methods
can_ok("DBD::Mock::StatementTrack", 'new');
my $st_track = DBD::Mock::StatementTrack->new();
isa_ok($st_track, 'DBD::Mock::StatementTrack');
can_ok($st_track, 'num_fields');
can_ok($st_track, 'num_params');
can_ok($st_track, 'bound_param');
can_ok($st_track, 'bound_param_trailing');
can_ok($st_track, 'is_active');
can_ok($st_track, 'is_finished');
can_ok($st_track, 'mark_executed');
can_ok($st_track, 'next_record');
can_ok($st_track, 'is_depleted');
can_ok($st_track, 'to_string');
can_ok($st_track, 'is_executed');
can_ok($st_track, 'statement');
can_ok($st_track, 'current_record_num');
can_ok($st_track, 'return_data');
can_ok($st_track, 'fields');
can_ok($st_track, 'bound_params');
}
{ # check the default state
my $st_track = DBD::Mock::StatementTrack->new();
isa_ok($st_track, 'DBD::Mock::StatementTrack');
is($st_track->num_fields(), 0, '... we have no fields in the default');
is_deeply($st_track->fields(), [], '... we have no fields in the default');
is($st_track->num_params(), 0, '... we have no bound params in the default');
is_deeply($st_track->bound_params(), [], '... we have no bound params in the default');
is_deeply($st_track->return_data(), [], '... we have no return data in the default');
is($st_track->current_record_num(), 0, '... our current record num is 0 in the default');
is($st_track->statement(), '', '... our statement is a blank string in the default');
is($st_track->is_executed(), 'no', '... our statement is not executed in the default');
ok($st_track->is_depleted(), '... the default state is depleted');
ok(!defined($st_track->next_record()), '... the default state has no next record since it is depleted');
is($st_track->is_finished(), 'no', '... our statement is not finished in the default');
is($st_track->is_active(), 0, '... the default state is not active');
}
{ # check a pre-defined state
my %params = (
return_data => [ [1, 1, 1], [2, 2, 2], [3, 3, 3] ],
fields => [ 'foo', 'bar', 'baz' ],
bound_params => [ 'baz' ],
statement => 'SELECT foo FROM bar WHERE baz = ?'
);
my $st_track = DBD::Mock::StatementTrack->new(%params);
isa_ok($st_track, 'DBD::Mock::StatementTrack');
is($st_track->num_fields(), 3, '... we have the expected num of fields');
is_deeply($st_track->fields(), $params{fields}, '... we have the expected fields');
is($st_track->num_params(), 1, '... we have the expected num of bound params');
is_deeply($st_track->bound_params(), $params{bound_params}, '... we have the expected bound params');
is_deeply($st_track->return_data(), $params{return_data}, '... we have the expected return data');
is($st_track->current_record_num(), 0, '... our current record num is 0 in the default');
is($st_track->statement(), $params{statement}, '... our statement as expected ');
is($st_track->is_executed(), 'no', '... our statement is not executed');
ok(!$st_track->is_depleted(), '... the state is not depleted');
is($st_track->is_finished(), 'no', '... our statement is not finished');
is($st_track->is_active(), 0, '... the default state is active');
# now lets alter that state
# and make sure changes reflect
is_deeply(
$st_track->bound_param(2, 'foo'),
[ 'baz', 'foo' ],
'... we have the expected bound params');
$st_track->bound_param_trailing('bar', 'foobar');
is_deeply(
$st_track->bound_params(),
[ 'baz', 'foo', 'bar', 'foobar' ],
'... we have the expected bound params');
is($st_track->num_params(), 4, '... we have the expected num of bound params');
{
my $old_SQL = $st_track->statement();
my $SQL = 'INSERT INTO foo (foo, bar, baz) VALUE(1, 2, 3)';
$st_track->statement($SQL);
is($st_track->statement(), $SQL, '... our statement as expected ');
is($st_track->is_active(), 0, '... with an INSERT we are not considered active');
$st_track->statement($old_SQL);
is($st_track->statement(), $old_SQL, '... restore our statement');
}
$st_track->mark_executed();
is($st_track->is_executed(), 'yes', '... our statement is now executed');
is($st_track->current_record_num(), 0, '... our current record num is 0');
is($st_track->is_active(), 1, '... we are active now that we are executed');
for (1 .. 3) {
ok(!$st_track->is_depleted(), '... the state is not depleted');
is_deeply(
$st_track->next_record(),
[ $_, $_, $_ ],
'... got the next record as expected');
is($st_track->current_record_num(), $_, '... our current record num is now ' . $_);
}
ok(!defined($st_track->next_record()), '... no more records');
ok($st_track->is_depleted(), '... we are now depleted');
is($st_track->is_active(), 0, '... we are no longer active now that we are depleted');
is($st_track->is_finished(), 'no', '... passing in nothing just returns the value');
$st_track->is_finished('yes');
is($st_track->is_finished(), 'yes', '... our statement is now finished');
$st_track->is_finished('nothing');
is($st_track->is_finished(), 'no', '... our statement is no longer finished');
}