Data-ObjectDriver
view release on metacpan or search on metacpan
t/41-callbacks.t view on Meta::CPAN
# $Id$
use strict;
use warnings;
use lib 't/lib';
use Test::More;
use DodTestUtil;
BEGIN { DodTestUtil->check_driver }
plan tests => 25;
setup_dbs({
global => [ qw( wines ) ],
});
use Wine;
## can add callbacks
{
ok(Data::ObjectDriver::BaseObject->can('add_trigger'), 'can add triggers to BaseObject class');
ok(My::BaseObject->can('add_trigger'), 'can add triggers to directly derived class');
ok(Wine->can('add_trigger'), 'can add triggers to doubly derived class');
};
sub clear_triggers {
my ($obj, $when) = @_;
my $triggers = Class::Trigger::__fetch_triggers($obj);
delete $triggers->{$when};
}
## test pre_save
{
my $wine = Wine->new;
$wine->name("Saumur Champigny, Le Grand Clos 2001");
$wine->rating(4);
my $ran_callback = 0;
my $test_pre_save = sub {
is scalar(@_), 2, 'callback received correct number of parameters';
my ($saving_wine, $orig_wine) = @_;
## This is not the original object, so we can't test it that way.
isa_ok $saving_wine, 'Wine', 'callback received correct kind of object';
cmp_ok $saving_wine->name, 'eq', "Saumur Champigny, Le Grand Clos 2001";
cmp_ok $saving_wine->rating, '==', 4, "modifiable Wine has a rating";
ok !defined($saving_wine->id), 'modifiable Wine has no id yet';
isa_ok $orig_wine, 'Wine', 'callback received correct kind of object';
cmp_ok $orig_wine->name, 'eq', "Saumur Champigny, Le Grand Clos 2001";
cmp_ok $orig_wine->rating, '==', 4, "original Wine has a rating";
ok !defined($orig_wine->id), 'original Wine has no id yet either';
## Change rating of modifiable Wine to test immutability of original.
$saving_wine->rating(5);
$ran_callback++;
return;
};
Wine->add_trigger('pre_save', $test_pre_save);
$wine->save or die "Object did not save successfully";
is $ran_callback, 1, 'callback ran exactly once';
ok defined $wine->id, 'object did receive an id';
ok ! $wine->is_changed, "not changed, since we've just saved the obj";
my $saved_wine = Wine->lookup($wine->id)
or die "Object just saved could not be retrieved successfully";
is $saved_wine->rating, 5, 'change in callback did change saved data';
is $wine->rating, 4, 'change in callback did not change original object';
clear_triggers('Wine', 'pre_save');
is $wine->remove, 1, 'Remove correct number or rows';
};
( run in 0.596 second using v1.01-cache-2.11-cpan-39bf76dae61 )