DBIx-DataModel
view release on metacpan or search on metacpan
t/v1_DBIx-DataModel.t view on Meta::CPAN
d_modif => '02.09.2005',
d_birth => '01.01.1950',
last_login => '01.09.2005',
emp_id => 999});
sqlLike('UPDATE T_Employee SET d_birth = ?, firstname = ? '.
'WHERE (emp_id = ?)', ['1950-01-01', 'toto', 999], 'update2');
$emp->{firstname} = 'toto';
$emp->{d_modif} = '02.09.2005';
$emp->{d_birth} = '01.01.1950';
$emp->{last_login} = '01.09.2005';
my %emp2 = %$emp;
$emp->update;
sqlLike('UPDATE T_Employee SET d_birth = ?, firstname = ?, lastname = ? '.
'WHERE (emp_id = ?)',
['1950-01-01', 'toto', 'Bodin De Boismortier', 999], 'update3');
HR->AutoUpdateColumns( last_modif =>
sub{"someUser, someTime"}
);
HR::Employee->update(\%emp2);
sqlLike('UPDATE T_Employee SET d_birth = ?, firstname = ?, ' .
'last_modif = ?, lastname = ? WHERE (emp_id = ?)',
['1950-01-01', 'toto', "someUser, someTime",
'Bodin De Boismortier', 999], 'autoUpdate');
HR->AutoInsertColumns( created_by =>
sub{"firstUser, firstTime"}
);
HR::Employee->insert({firstname => "Felix",
lastname => "Mendelssohn"});
sqlLike('INSERT INTO T_Employee (created_by, firstname, last_modif, lastname) ' .
'VALUES (?, ?, ?, ?)',
['firstUser, firstTime', 'Felix', 'someUser, someTime', 'Mendelssohn'],
'autoUpdate / insert');
$emp = HR::Employee->blessFromDB({emp_id => 999});
$emp->delete;
sqlLike('DELETE FROM T_Employee '.
'WHERE (emp_id = ?)', [999], 'delete');
$emp = HR::Employee->blessFromDB({emp_id => 999, spouse_id => 888});
my $emp_spouse = $emp->spouse;
sqlLike('SELECT * ' .
'FROM T_Employee ' .
"WHERE ( emp_id = ? )", [888], 'spouse self-ref assoc.');
# testing -preExec / -postExec
my %check_callbacks;
HR::Employee->select(-where => {foo=>'bar'},
-preExec => sub {$check_callbacks{pre} = "was called"},
-postExec => sub {$check_callbacks{post} = "was called"},);
is_deeply(\%check_callbacks, {pre =>"was called",
post => "was called" }, 'select, pre/post callbacks');
%check_callbacks = ();
HR::Employee->fetch(1234, {-preExec => sub {$check_callbacks{pre} = "was called"},
-postExec => sub {$check_callbacks{post} = "was called"}});
is_deeply(\%check_callbacks, {pre =>"was called",
post => "was called" }, 'fetch, pre/post callbacks');
# testing transactions
my $ok_trans = sub { return "scalar transaction OK" };
my $ok_trans_array = sub { return qw/array transaction OK/ };
my $fail_trans = sub { die "failed transaction" };
my $nested_1 = sub { HR->doTransaction($ok_trans) };
my $nested_many = sub {
my $r1 = HR->doTransaction($nested_1);
my @r2 = HR->doTransaction($ok_trans_array);
return ($r1, @r2);
};
is (HR->doTransaction($ok_trans),
"scalar transaction OK",
"scalar transaction");
sqlLike('BEGIN WORK', [],
'COMMIT', [], "scalar transaction commit");
is_deeply ([HR->doTransaction($ok_trans_array)],
[qw/array transaction OK/],
"array transaction");
sqlLike('BEGIN WORK', [],
'COMMIT', [], "array transaction commit");
die_ok {HR->doTransaction($fail_trans)};
sqlLike('BEGIN WORK', [],
'ROLLBACK', [], "fail transaction rollback");
$dbh->do('FAKE SQL, HISTORY MARKER');
is_deeply ([HR->doTransaction($nested_many)],
["scalar transaction OK", qw/array transaction OK/],
"nested transaction");
sqlLike('FAKE SQL, HISTORY MARKER', [],
'BEGIN WORK', [],
'COMMIT', [], "nested transaction commit");
# transaction object
eval {HR->doTransaction($fail_trans)};
my $err = $@;
like ($err->initial_error, qr/^failed transaction/, "initial_error");
is_deeply([$err->rollback_errors], [], "rollback_errors");
# nested transactions on two different databases
$dbh->{private_id} = "dbh1";
my $other_dbh = DBI->connect('DBI:Mock:', '', '',
{private_id => "dbh2", RaiseError => 1});
$emp_id = 66;
my $tell_dbh_id = sub {my $db_id = HR->dbh->{private_id};
HR::Employee->update({emp_id => $emp_id++, name => $db_id});
return "transaction on $db_id" };
my $nested_change_dbh = sub {
my $r1 = HR->doTransaction($tell_dbh_id);
my $r2 = HR->doTransaction($tell_dbh_id, $other_dbh);
( run in 0.764 second using v1.01-cache-2.11-cpan-39bf76dae61 )