Rose-DB-Object
view release on metacpan or search on metacpan
t/db-object-relationship.t view on Meta::CPAN
my $colors = $o->colors;
ok(ref $colors eq 'ARRAY' && @$colors == 2 &&
$colors->[0]->name eq 'blue' && $colors->[1]->name eq 'red',
"colors 1 - $db_type");
$colors = $o->find_colors;
ok(ref $colors eq 'ARRAY' && @$colors == 2 &&
$colors->[0]->name eq 'blue' && $colors->[1]->name eq 'red',
"find colors 1 - $db_type");
$colors = $o->find_colors([ name => { like => 'r%' } ]);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red',
"find colors 2 - $db_type");
$colors = $o->find_colors(query => [ name => { like => 'r%' } ], cache => 1);
my $colors2 = $o->find_colors(from_cache => 1);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red' &&
ref $colors2 eq 'ARRAY' && @$colors2 == 1 && $colors2->[0]->name eq 'red' &&
$colors->[0] eq $colors2->[0],
"find colors from cache - $db_type");
my $count = $o->colors_count;
is($count, 2, "count colors 1 - $db_type");
$count = $o->colors_count([ name => { like => 'r%' } ]);
is($count, 1, "count colors 2 - $db_type");
my @colors = $o->colors;
ok(@colors == 2 && $colors[0]->name eq 'blue' && $colors[1]->name eq 'red',
"colors 2 - $db_type");
$colors = $o_x->colors;
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'pink',
"colors 3 - $db_type");
@colors = $o_x->colors;
ok(@colors == 1 && $colors[0]->name eq 'pink', "colors 4 - $db_type");
$o = MyPgObject->new(id => 1)->load;
$o->fkone(1);
$o->fk2(2);
$o->fk3(3);
$o->save;
#local $Rose::DB::Object::Manager::Debug = 1;
eval
{
local $o->dbh->{'PrintError'} = 0;
$o->delete(cascade => 'null');
};
ok($@, "delete cascade null 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyPgOtherObject');
is($count, 2, "delete cascade rollback confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyPgOtherObject2');
is($count, 3, "delete cascade rollback confirm 2 - $db_type");
ok($o->delete(cascade => 'delete'), "delete cascade delete 1 - $db_type");
$o = MyPgObject->new(id => 99)->load;
$o->fkone(11);
$o->fk2(12);
$o->fk3(13);
$o->save;
eval
{
local $o->dbh->{'PrintError'} = 0;
$o->delete(cascade => 'null');
};
ok($@, "delete cascade null 2 - $db_type");
ok($o->delete(cascade => 'delete'), "delete cascade delete 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyPgColorMap');
is($count, 0, "delete cascade confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyPgOtherObject2');
is($count, 0, "delete cascade confirm 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyPgOtherObject');
is($count, 0, "delete cascade confirm 3 - $db_type");
eval { $o->meta->alias_column(nonesuch => 'foo') };
ok($@, "alias_column() nonesuch - $db_type");
# Start foreign key method tests
#
# Foreign key get_set_now
#
$o = MyPgObject->new(id => 50,
name => 'Alex',
flag => 1);
eval { $o->other_obj('abc') };
ok($@, "set foreign key object: one arg - $db_type");
eval { $o->other_obj(k1 => 1, k2 => 2, k3 => 3) };
ok($@, "set foreign key object: no save - $db_type");
$o->save;
eval
{
local $o->db->dbh->{'PrintError'} = 0;
$o->other_obj(k1 => 1, k2 => 2);
};
ok($@, "set foreign key object: too few keys - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 1 - $db_type");
ok($o->fkone == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 1 - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 2 - $db_type");
ok($o->fkone == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 2 - $db_type");
#
# Foreign key delete_now
#
ok($o->delete_other_obj, "delete foreign key object 1 - $db_type");
ok(!defined $o->fkone && !defined $o->fk2 && !defined $o->fk3, "delete foreign key object check keys 1 - $db_type");
ok(!defined $o->other_obj && defined $o->error, "delete foreign key object confirm 1 - $db_type");
ok(!defined $o->delete_other_obj, "delete foreign key object 2 - $db_type");
#
# Foreign key get_set_on_save
#
# TEST: Set, save
$o = MyPgObject->new(id => 100,
name => 'Bub',
flag => 1);
ok($o->other_obj_on_save(k1 => 21, k2 => 22, k3 => 23), "set foreign key object on save 1 - $db_type");
my $co = MyPgObject->new(id => 100);
ok(!$co->load(speculative => 1), "set foreign key object on save 2 - $db_type");
my $other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 3 - $db_type");
ok($o->save, "set foreign key object on save 4 - $db_type");
$o = MyPgObject->new(id => 100);
$o->load;
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 5 - $db_type");
# TEST: Set, set to undef, save
$o = MyPgObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 6 - $db_type");
$co = MyPgObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 7 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 8 - $db_type");
$o->other_obj_on_save(undef);
ok($o->save, "set foreign key object on save 9 - $db_type");
$o = MyPgObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 10 - $db_type");
$co = MyPgOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 11 - $db_type");
$o->delete(cascade => 1);
# TEST: Set, delete, save
$o = MyPgObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 12 - $db_type");
$co = MyPgObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 13 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 14 - $db_type");
ok($o->delete_other_obj, "set foreign key object on save 15 - $db_type");
$other_obj = $o->other_obj_on_save;
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"set foreign key object on save 16 - $db_type");
ok($o->save, "set foreign key object on save 17 - $db_type");
$o = MyPgObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 18 - $db_type");
$co = MyPgOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 19 - $db_type");
$o->delete(cascade => 1);
#
# Foreign key delete_on_save
#
$o = MyPgObject->new(id => 500,
name => 'Kip',
flag => 1);
$o->other_obj_on_save(k1 => 7, k2 => 8, k3 => 9);
$o->save;
$o = MyPgObject->new(id => 500);
$o->load;
# TEST: Delete, save
$o->del_other_obj_on_save;
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 1 - $db_type");
# ...but that the foreign object has not yet been deleted
$co = MyPgOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok($co->load(speculative => 1), "delete foreign key object on save 2 - $db_type");
# Do the save
ok($o->save, "delete foreign key object on save 3 - $db_type");
# Now it's deleted
$co = MyPgOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok(!$co->load(speculative => 1), "delete foreign key object on save 4 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 5 - $db_type");
# RESET
$o->delete;
$o = MyPgObject->new(id => 700,
name => 'Ham',
flag => 0);
$o->other_obj_on_save(k1 => 12, k2 => 34, k3 => 56);
$o->save;
$o = MyPgObject->new(id => 700);
$o->load;
# TEST: Delete, set on save, delete, save
ok($o->del_other_obj_on_save, "delete 2 foreign key object on save 1 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
t/db-object-relationship.t view on Meta::CPAN
$colors = $o->find_colors([ name => { like => 'r%' } ]);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red',
"find colors 2 - $db_type");
$colors = $o->find_colors(query => [ name => { like => 'r%' } ], cache => 1);
my $colors2 = $o->find_colors(from_cache => 1);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red' &&
ref $colors2 eq 'ARRAY' && @$colors2 == 1 && $colors2->[0]->name eq 'red' &&
$colors->[0] eq $colors2->[0],
"find colors from cache - $db_type");
my $count = $o->colors_count;
is($count, 2, "count colors 1 - $db_type");
$count = $o->colors_count([ name => { like => 'r%' } ]);
is($count, 1, "count colors 2 - $db_type");
my @colors = $o->colors;
ok(@colors == 2 && $colors[0]->name eq 'blue' && $colors[1]->name eq 'red',
"colors 2 - $db_type");
$colors = $o_x->colors;
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'pink',
"colors 3 - $db_type");
@colors = $o_x->colors;
ok(@colors == 1 && $colors[0]->name eq 'pink', "colors 4 - $db_type");
$o = MyMySQLObject->new(id => 1)->load;
$o->fk1(99);
$o->fk2(99);
$o->fk3(99);
eval { $o->other_obj };
ok($@, "fatal referential_integrity - $db_type");
ok(!defined $o->other_obj_osoft, "ok referential_integrity 1 - $db_type");
ok(!defined $o->other_obj_msoft, "ok referential_integrity 2 - $db_type");
$o->fk1(1);
$o->fk2(2);
$o->fk3(3);
$o->save;
#local $Rose::DB::Object::Manager::Debug = 1;
my $ret;
eval
{
local $o->dbh->{'PrintError'} = 0;
$ret = $o->delete(cascade => 'null');
};
# Allow for exceptions in case some fancy new version of MySQL actually
# tries preserve referential integrity. Hey, you never know...
ok($ret || $@, "delete cascade null 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyMySQLOtherObject2');
is($count, 3, "delete cascade rollback confirm 2 - $db_type");
$o = MyMySQLObject->new(id => 99)->load;
$o->fk1(11);
$o->fk2(12);
$o->fk3(13);
$o->save;
eval
{
local $o->dbh->{'PrintError'} = 0;
$ret = $o->delete(cascade => 'null');
};
ok($ret || $@, "delete cascade null 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyMySQLColorMap');
is($count, 3, "delete cascade confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyMySQLOtherObject2');
is($count, 3, "delete cascade confirm 2 - $db_type");
eval { $o->meta->alias_column(nonesuch => 'foo') };
ok($@, "alias_column() nonesuch - $db_type");
# Start foreign key method tests
#
# Foreign key get_set_now
#
$o = MyMySQLObject->new(id => 50,
name => 'Alex',
flag => 1);
eval { $o->other_obj('abc') };
ok($@, "set foreign key object: one arg - $db_type");
eval { $o->other_obj(k1 => 1, k2 => 2, k3 => 3) };
ok($@, "set foreign key object: no save - $db_type");
$o->save;
eval
{
local $o->db->dbh->{'PrintError'} = 0;
$o->other_obj(k1 => 1, k2 => 2);
};
ok($@, "set foreign key object: too few keys - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 1 - $db_type");
ok($o->fk1 == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 1 - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 2 - $db_type");
ok($o->fk1 == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 2 - $db_type");
#
# Foreign key delete_now
#
ok($o->delete_other_obj, "delete foreign key object 1 - $db_type");
ok(!defined $o->fk1 && !defined $o->fk2 && !defined $o->fk3, "delete foreign key object check keys 1 - $db_type");
ok(!defined $o->other_obj && defined $o->error, "delete foreign key object confirm 1 - $db_type");
ok(!defined $o->delete_other_obj, "delete foreign key object 2 - $db_type");
#
# Foreign key get_set_on_save
#
# TEST: Set, save
$o = MyMySQLObject->new(id => 100,
name => 'Bub',
flag => 1);
ok($o->other_obj_on_save(k1 => 21, k2 => 22, k3 => 23), "set foreign key object on save 1 - $db_type");
my $co = MyMySQLObject->new(id => 100);
ok(!$co->load(speculative => 1), "set foreign key object on save 2 - $db_type");
my $other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 3 - $db_type");
ok($o->save, "set foreign key object on save 4 - $db_type");
$o = MyMySQLObject->new(id => 100);
$o->load;
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 5 - $db_type");
# TEST: Set, set to undef, save
$o = MyMySQLObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 6 - $db_type");
$co = MyMySQLObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 7 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 8 - $db_type");
$o->other_obj_on_save(undef);
ok($o->save, "set foreign key object on save 9 - $db_type");
$o = MyMySQLObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 10 - $db_type");
$co = MyMySQLOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 11 - $db_type");
$o->delete(cascade => 1);
# TEST: Set, delete, save
$o = MyMySQLObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 12 - $db_type");
$co = MyMySQLObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 13 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 14 - $db_type");
ok($o->delete_other_obj, "set foreign key object on save 15 - $db_type");
$other_obj = $o->other_obj_on_save;
ok(!defined $other_obj && !defined $o->fk1 && !defined $o->fk2 && !defined $o->fk3,
"set foreign key object on save 16 - $db_type");
ok($o->save, "set foreign key object on save 17 - $db_type");
$o = MyMySQLObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 18 - $db_type");
$co = MyMySQLOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 19 - $db_type");
$o->delete(cascade => 1);
#
# Foreign key delete_on_save
#
$o = MyMySQLObject->new(id => 500,
name => 'Kip',
flag => 1);
$o->other_obj_on_save(k1 => 7, k2 => 8, k3 => 9);
$o->save;
$o = MyMySQLObject->new(id => 500);
$o->load;
# TEST: Delete, save
$o->del_other_obj_on_save;
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
ok(!defined $other_obj && !defined $o->fk1 && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 1 - $db_type");
# ...but that the foreign object has not yet been deleted
$co = MyMySQLOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok($co->load(speculative => 1), "delete foreign key object on save 2 - $db_type");
# Do the save
ok($o->save, "delete foreign key object on save 3 - $db_type");
# Now it's deleted
$co = MyMySQLOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok(!$co->load(speculative => 1), "delete foreign key object on save 4 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef
ok(!defined $other_obj && !defined $o->fk1 && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 5 - $db_type");
# RESET
$o->delete;
$o = MyMySQLObject->new(id => 700,
name => 'Ham',
flag => 0);
$o->other_obj_on_save(k1 => 12, k2 => 34, k3 => 56);
$o->save;
$o = MyMySQLObject->new(id => 700);
$o->load;
# TEST: Delete, set on save, delete, save
ok($o->del_other_obj_on_save, "delete 2 foreign key object on save 1 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
t/db-object-relationship.t view on Meta::CPAN
ok($colors[4]->id == 9, "add 2 many to many on save 6 - $db_type");
ok(MyMySQLColor->new(id => 2)->load(speculative => 1), "add many to many on save 7 - $db_type");
ok(MyMySQLColor->new(id => 7)->load(speculative => 1), "add many to many on save 8 - $db_type");
ok(MyMySQLColor->new(id => 1)->load(speculative => 1), "add many to many on save 9 - $db_type");
ok(MyMySQLColor->new(id => 8)->load(speculative => 1), "add many to many on save 10 - $db_type");
ok(!MyMySQLColor->new(id => 9)->load(speculative => 1), "add many to many on save 11 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 2)->load(speculative => 1),
"add 2 many to many on save 12 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 7)->load(speculative => 1),
"add 2 many to many on save 13 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 1)->load(speculative => 1),
"add 2 many to many on save 14 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 8)->load(speculative => 1),
"add 2 many to many on save 15 - $db_type");
ok(!MyMySQLColorMap->new(obj_id => 60, color_id => 9)->load(speculative => 1),
"add 2 many to many on save 16 - $db_type");
$sth = $color->db->dbh->prepare('SELECT COUNT(*) FROM rose_db_object_colors_map WHERE obj_id = 60');
$sth->execute;
$count = $sth->fetchrow_array;
is($count, 4, "add 2 many to many on save 17 - $db_type");
# Save
$o->save;
@colors = $o->colors;
ok(@colors == 5, "add 2 many to many on save 18 - $db_type");
ok($colors[0]->id == 9, "add 2 many to many on save 19 - $db_type");
ok($colors[1]->id == 2, "add 2 many to many on save 20 - $db_type");
ok($colors[2]->id == 7, "add 2 many to many on save 21 - $db_type");
ok($colors[3]->id == 1, "add 2 many to many on save 22 - $db_type");
ok($colors[4]->id == 8, "add 2 many to many on save 23 - $db_type");
ok(MyMySQLColor->new(id => 9)->load(speculative => 1), "add many to many on save 24 - $db_type");
ok(MyMySQLColor->new(id => 2)->load(speculative => 1), "add many to many on save 25 - $db_type");
ok(MyMySQLColor->new(id => 7)->load(speculative => 1), "add many to many on save 26 - $db_type");
ok(MyMySQLColor->new(id => 1)->load(speculative => 1), "add many to many on save 27 - $db_type");
ok(MyMySQLColor->new(id => 8)->load(speculative => 1), "add many to many on save 28 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 9)->load(speculative => 1),
"add 2 many to many on save 29 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 2)->load(speculative => 1),
"add 2 many to many on save 20 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 7)->load(speculative => 1),
"add 2 many to many on save 31 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 1)->load(speculative => 1),
"add 2 many to many on save 32 - $db_type");
ok(MyMySQLColorMap->new(obj_id => 60, color_id => 8)->load(speculative => 1),
"add 2 many to many on save 33 - $db_type");
$sth = $color->db->dbh->prepare('SELECT COUNT(*) FROM rose_db_object_colors_map WHERE obj_id = 60');
$sth->execute;
$count = $sth->fetchrow_array;
is($count, 5, "add 2 many to many on save 34 - $db_type");
# End "many to many" tests
# Start "one to one" cascaded delete tests
#local $Rose::DB::Object::Debug = 1;
#local $Rose::DB::Object::Manager::Debug = 1;
$o = MyMySQLObject->new(name => '1to1bug',
fk1 => 10,
fk2 => 20,
fk3 => 30,
other_obj_otoo =>
{
name => '1to1bugfo',
k1 => 10,
k2 => 20,
k3 => 30,
});
$o->save;
$o = MyMySQLObject->new(id => $o->id)->load;
ok(defined $o->other_obj_otoo, "delete(cascade => 1) one to one prep - $db_type");
$o = MyMySQLObject->new(id => $o->id);
$o->delete(cascade => 1);
ok(!MyMySQLOtherObject->new(k1 => 10, k2 => 20, k3 => 30)->load(speculative => 1),
"delete(cascade => 1) one to one delete - $db_type");
# XXX: This relies on MySQL's creepy behavior of setting not-null
# XXX: columns to 0 when they are set to NULL by a query.
#
# $o = MyMySQLObject->new(name => '1to1bug2',
# fk1 => 10,
# fk2 => 20,
# fk3 => 30,
# other_obj_otoo =>
# {
# name => '1to1bugfo2',
# k1 => 10,
# k2 => 20,
# k3 => 30,
# });
#
# $o->save;
#
# $o = MyMySQLObject->new(id => $o->id)->load;
#
# ok(defined $o->other_obj_otoo, "delete(cascade => 1) one to one prep - $db_type");
#
# $o = MyMySQLObject->new(id => $o->id);
# $o->delete(cascade => 'null');
#
# ok(MyMySQLOtherObject->new(k1 => 0, k2 => 0, k3 => 0)->load(speculative => 1),
# "delete(cascade => 1) one to one null - $db_type");
# End "one to one" cascaded delete tests
# Start fk hook-up tests
$o2 = MyMySQLOtherObject2->new(name => 'B', pid => 11);
$o2->save;
$o = MyMySQLObject->new(name => 'John', id => 12);
$o->add_other2_objs2($o2);
$o2->name('John2');
$o->save;
$o2 = MyMySQLOtherObject2->new(id => $o2->id)->load;
is($o2->pid, $o->id, "fk hook-up 1 - $db_type");
is($o2->name, 'John2', "fk hook-up 2 - $db_type");
# End fk hook-up tests
}
#
# Informix
#
SKIP: foreach my $db_type ('informix')
{
skip("Informix tests", 378) unless($HAVE_INFORMIX);
Rose::DB->default_type($db_type);
my $o = MyInformixObject->new(name => 'John', id => 1);
ok(ref $o && $o->isa('MyInformixObject'), "new() 1 - $db_type");
$o->flag2('true');
$o->date_created('now');
$o->last_modified($o->date_created);
$o->save_col(7);
ok($o->save, "save() 1 - $db_type");
ok($o->load, "load() 1 - $db_type");
my $o_x = MyInformixObject->new(id => 99, name => 'John X', flag => 0);
$o_x->save;
my $o2 = MyInformixObject->new(id => $o->id);
ok(ref $o2 && $o2->isa('MyInformixObject'), "new() 2 - $db_type");
is($o2->bits->to_Bin, '00101', "bits() (bitfield default value) - $db_type");
ok($o2->load, "load() 2 - $db_type");
ok(!$o2->not_found, "not_found() 1 - $db_type");
is($o2->name, $o->name, "load() verify 1 - $db_type");
is($o2->date_created, $o->date_created, "load() verify 2 - $db_type");
is($o2->last_modified, $o->last_modified, "load() verify 3 - $db_type");
is($o2->status, 'active', "load() verify 4 (default value) - $db_type");
is($o2->flag, 1, "load() verify 5 (default boolean value) - $db_type");
is($o2->flag2, 1, "load() verify 6 (boolean value) - $db_type");
t/db-object-relationship.t view on Meta::CPAN
my $colors = $o->colors;
ok(ref $colors eq 'ARRAY' && @$colors == 2 &&
$colors->[0]->name eq 'blue' && $colors->[1]->name eq 'red',
"colors 1 - $db_type");
$colors = $o->find_colors;
ok(ref $colors eq 'ARRAY' && @$colors == 2 &&
$colors->[0]->name eq 'blue' && $colors->[1]->name eq 'red',
"find colors 1 - $db_type");
$colors = $o->find_colors([ name => { like => 'r%' } ]);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red',
"find colors 2 - $db_type");
$colors = $o->find_colors(query => [ name => { like => 'r%' } ], cache => 1);
my $colors2 = $o->find_colors(from_cache => 1);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red' &&
ref $colors2 eq 'ARRAY' && @$colors2 == 1 && $colors2->[0]->name eq 'red' &&
$colors->[0] eq $colors2->[0],
"find colors from cache - $db_type");
my $count = $o->colors_count;
is($count, 2, "count colors 1 - $db_type");
$count = $o->colors_count([ name => { like => 'r%' } ]);
is($count, 1, "count colors 2 - $db_type");
my @colors = $o->colors;
ok(@colors == 2 && $colors[0]->name eq 'blue' && $colors[1]->name eq 'red',
"colors 2 - $db_type");
$colors = $o_x->colors;
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'pink',
"colors 3 - $db_type");
@colors = $o_x->colors;
ok(@colors == 1 && $colors[0]->name eq 'pink', "colors 4 - $db_type");
$o = MyInformixObject->new(id => 1)->load;
$o->fkone(1);
$o->fk2(2);
$o->fk3(3);
$o->save;
#local $Rose::DB::Object::Manager::Debug = 1;
eval
{
local $o->dbh->{'PrintError'} = 0;
$o->delete(cascade => 'null');
};
ok($@, "delete cascade null 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyInformixOtherObject');
is($count, 2, "delete cascade rollback confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyInformixOtherObject2');
is($count, 3, "delete cascade rollback confirm 2 - $db_type");
ok($o->delete(cascade => 'delete'), "delete cascade delete 1 - $db_type");
$o = MyInformixObject->new(id => 99)->load;
$o->fkone(11);
$o->fk2(12);
$o->fk3(13);
$o->save;
eval
{
local $o->dbh->{'PrintError'} = 0;
$o->delete(cascade => 'null');
};
ok($@, "delete cascade null 2 - $db_type");
ok($o->delete(cascade => 'delete'), "delete cascade delete 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyInformixColorMap');
is($count, 0, "delete cascade confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyInformixOtherObject2');
is($count, 0, "delete cascade confirm 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MyInformixOtherObject');
is($count, 0, "delete cascade confirm 3 - $db_type");
eval { $o->meta->alias_column(nonesuch => 'foo') };
ok($@, "alias_column() nonesuch - $db_type");
# Start foreign key method tests
#
# Foreign key get_set_now
#
$o = MyInformixObject->new(id => 50,
name => 'Alex',
flag => 1);
eval { $o->other_obj('abc') };
ok($@, "set foreign key object: one arg - $db_type");
eval { $o->other_obj(k1 => 1, k2 => 2, k3 => 3) };
ok($@, "set foreign key object: no save - $db_type");
$o->save;
eval
{
local $o->db->dbh->{'PrintError'} = 0;
$o->other_obj(k1 => 1, k2 => 2);
};
ok($@, "set foreign key object: too few keys - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 1 - $db_type");
ok($o->fkone == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 1 - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 2 - $db_type");
ok($o->fkone == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 2 - $db_type");
#
# Foreign key delete_now
#
ok($o->delete_other_obj, "delete foreign key object 1 - $db_type");
ok(!defined $o->fkone && !defined $o->fk2 && !defined $o->fk3, "delete foreign key object check keys 1 - $db_type");
ok(!defined $o->other_obj && defined $o->error, "delete foreign key object confirm 1 - $db_type");
ok(!defined $o->delete_other_obj, "delete foreign key object 2 - $db_type");
#
# Foreign key get_set_on_save
#
# TEST: Set, save
$o = MyInformixObject->new(id => 100,
name => 'Bub',
flag => 1);
ok($o->other_obj_on_save(k1 => 21, k2 => 22, k3 => 23), "set foreign key object on save 1 - $db_type");
my $co = MyInformixObject->new(id => 100);
ok(!$co->load(speculative => 1), "set foreign key object on save 2 - $db_type");
my $other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 3 - $db_type");
ok($o->save, "set foreign key object on save 4 - $db_type");
$o = MyInformixObject->new(id => 100);
$o->load;
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 5 - $db_type");
# TEST: Set, set to undef, save
$o = MyInformixObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 6 - $db_type");
$co = MyInformixObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 7 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 8 - $db_type");
$o->other_obj_on_save(undef);
ok($o->save, "set foreign key object on save 9 - $db_type");
$o = MyInformixObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 10 - $db_type");
$co = MyInformixOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 11 - $db_type");
$o->delete(cascade => 1);
# TEST: Set, delete, save
$o = MyInformixObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 12 - $db_type");
$co = MyInformixObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 13 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 14 - $db_type");
ok($o->delete_other_obj, "set foreign key object on save 15 - $db_type");
$other_obj = $o->other_obj_on_save;
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"set foreign key object on save 16 - $db_type");
ok($o->save, "set foreign key object on save 17 - $db_type");
$o = MyInformixObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 18 - $db_type");
$co = MyInformixOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 19 - $db_type");
$o->delete(cascade => 1);
#
# Foreign key delete_on_save
#
$o = MyInformixObject->new(id => 500,
name => 'Kip',
flag => 1);
$o->other_obj_on_save(k1 => 7, k2 => 8, k3 => 9);
$o->save;
$o = MyInformixObject->new(id => 500);
$o->load;
# TEST: Delete, save
$o->del_other_obj_on_save;
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 1 - $db_type");
# ...but that the foreign object has not yet been deleted
$co = MyInformixOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok($co->load(speculative => 1), "delete foreign key object on save 2 - $db_type");
# Do the save
ok($o->save, "delete foreign key object on save 3 - $db_type");
# Now it's deleted
$co = MyInformixOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok(!$co->load(speculative => 1), "delete foreign key object on save 4 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 5 - $db_type");
# RESET
$o->delete;
$o = MyInformixObject->new(id => 700,
name => 'Ham',
flag => 0);
$o->other_obj_on_save(k1 => 12, k2 => 34, k3 => 56);
$o->save;
$o = MyInformixObject->new(id => 700);
$o->load;
# TEST: Delete, set on save, delete, save
ok($o->del_other_obj_on_save, "delete 2 foreign key object on save 1 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
t/db-object-relationship.t view on Meta::CPAN
"find colors 1 - $db_type");
$colors = $o->find_colors([ name => { like => 'r%' } ]);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red',
"find colors 2 - $db_type");
$colors = $o->find_colors(query => [ name => { like => 'r%' } ], cache => 1);
my $colors2 = $o->find_colors(from_cache => 1);
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'red' &&
ref $colors2 eq 'ARRAY' && @$colors2 == 1 && $colors2->[0]->name eq 'red' &&
$colors->[0] eq $colors2->[0],
"find colors from cache - $db_type");
ok(my $iterator = $o->colors_iterator, "get colors_iterator - $db_type");
ok($iterator->isa('Rose::DB::Object::Iterator'), "colors iterator isa Iterator - $db_type");
while(my $color = $iterator->next)
{
ok($color->name, "color has a name (" . $color->name . ") - $db_type");
}
is($iterator->total, 2, "iterator total - $db_type");
my $count = $o->colors_count;
is($count, 2, "count colors 1 - $db_type");
$count = $o->colors_count([ name => { like => 'r%' } ]);
is($count, 1, "count colors 2 - $db_type");
my @colors = $o->colors;
ok(@colors == 2 && $colors[0]->name eq 'blue' && $colors[1]->name eq 'red',
"colors 2 - $db_type");
$colors = $o_x->colors;
ok(ref $colors eq 'ARRAY' && @$colors == 1 && $colors->[0]->name eq 'pink',
"colors 3 - $db_type");
@colors = $o_x->colors;
ok(@colors == 1 && $colors[0]->name eq 'pink', "colors 4 - $db_type");
$o = MySQLiteObject->new(id => 1)->load;
$o->fkone(1);
$o->fk2(2);
$o->fk3(3);
$o->save;
#local $Rose::DB::Object::Manager::Debug = 1;
eval
{
local $o->dbh->{'PrintError'} = 0;
$o->delete(cascade => 'null');
};
ok($@, "delete cascade null 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MySQLiteOtherObject');
is($count, 2, "delete cascade rollback confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MySQLiteOtherObject2');
is($count, 3, "delete cascade rollback confirm 2 - $db_type");
ok($o->delete(cascade => 'delete'), "delete cascade delete 1 - $db_type");
$o = MySQLiteObject->new(id => 99)->load;
$o->fkone(11);
$o->fk2(12);
$o->fk3(13);
$o->save;
eval
{
local $o->dbh->{'PrintError'} = 0;
$o->delete(cascade => 'null');
};
ok($@, "delete cascade null 2 - $db_type");
ok($o->delete(cascade => 'delete'), "delete cascade delete 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MySQLiteColorMap');
is($count, 0, "delete cascade confirm 1 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MySQLiteOtherObject2');
is($count, 0, "delete cascade confirm 2 - $db_type");
$count =
Rose::DB::Object::Manager->get_objects_count(
db => $o->db,
object_class => 'MySQLiteOtherObject');
is($count, 0, "delete cascade confirm 3 - $db_type");
eval { $o->meta->alias_column(nonesuch => 'foo') };
ok($@, "alias_column() nonesuch - $db_type");
# Start foreign key method tests
#
# Foreign key get_set_now
#
$o = MySQLiteObject->new(id => 50,
name => 'Alex',
flag => 1);
eval { $o->other_obj('abc') };
ok($@, "set foreign key object: one arg - $db_type");
eval { $o->other_obj(k1 => 1, k2 => 2, k3 => 3) };
ok($@, "set foreign key object: no save - $db_type");
$o->save;
eval
{
local $o->db->dbh->{'PrintError'} = 0;
$o->other_obj(k1 => 1, k2 => 2);
};
ok($@, "set foreign key object: too few keys - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 1 - $db_type");
ok($o->fkone == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 1 - $db_type");
ok($o->other_obj(k1 => 1, k2 => 2, k3 => 3), "set foreign key object 2 - $db_type");
ok($o->fkone == 1 && $o->fk2 == 2 && $o->fk3 == 3, "set foreign key object check keys 2 - $db_type");
#
# Foreign key delete_now
#
ok($o->delete_other_obj, "delete foreign key object 1 - $db_type");
ok(!defined $o->fkone && !defined $o->fk2 && !defined $o->fk3, "delete foreign key object check keys 1 - $db_type");
ok(!defined $o->other_obj && defined $o->error, "delete foreign key object confirm 1 - $db_type");
ok(!defined $o->delete_other_obj, "delete foreign key object 2 - $db_type");
#
# Foreign key get_set_on_save
#
# TEST: Set, save
$o = MySQLiteObject->new(id => 100,
name => 'Bub',
flag => 1);
ok($o->other_obj_on_save(k1 => 21, k2 => 22, k3 => 23), "set foreign key object on save 1 - $db_type");
my $co = MySQLiteObject->new(id => 100);
ok(!$co->load(speculative => 1), "set foreign key object on save 2 - $db_type");
my $other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 3 - $db_type");
ok($o->save, "set foreign key object on save 4 - $db_type");
$o = MySQLiteObject->new(id => 100);
$o->load;
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj && $other_obj->k1 == 21 && $other_obj->k2 == 22 && $other_obj->k3 == 23,
"set foreign key object on save 5 - $db_type");
# TEST: Set, set to undef, save
$o = MySQLiteObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 6 - $db_type");
$co = MySQLiteObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 7 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 8 - $db_type");
$o->other_obj_on_save(undef);
ok($o->save, "set foreign key object on save 9 - $db_type");
$o = MySQLiteObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 10 - $db_type");
$co = MySQLiteOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 11 - $db_type");
$o->delete(cascade => 1);
# TEST: Set, delete, save
$o = MySQLiteObject->new(id => 200,
name => 'Rose',
flag => 1);
ok($o->other_obj_on_save(k1 => 51, k2 => 52, k3 => 53), "set foreign key object on save 12 - $db_type");
$co = MySQLiteObject->new(id => 200);
ok(!$co->load(speculative => 1), "set foreign key object on save 13 - $db_type");
$other_obj = $o->other_obj_on_save;
ok($other_obj && $other_obj->k1 == 51 && $other_obj->k2 == 52 && $other_obj->k3 == 53,
"set foreign key object on save 14 - $db_type");
ok($o->delete_other_obj, "set foreign key object on save 15 - $db_type");
$other_obj = $o->other_obj_on_save;
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"set foreign key object on save 16 - $db_type");
ok($o->save, "set foreign key object on save 17 - $db_type");
$o = MySQLiteObject->new(id => 200);
$o->load;
ok(!defined $o->other_obj_on_save, "set foreign key object on save 18 - $db_type");
$co = MySQLiteOtherObject->new(k1 => 51, k2 => 52, k3 => 53);
ok(!$co->load(speculative => 1), "set foreign key object on save 19 - $db_type");
$o->delete(cascade => 1);
#
# Foreign key delete_on_save
#
$o = MySQLiteObject->new(id => 500,
name => 'Kip',
flag => 1);
$o->other_obj_on_save(k1 => 7, k2 => 8, k3 => 9);
$o->save;
$o = MySQLiteObject->new(id => 500);
$o->load;
# TEST: Delete, save
$o->del_other_obj_on_save;
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 1 - $db_type");
# ...but that the foreign object has not yet been deleted
$co = MySQLiteOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok($co->load(speculative => 1), "delete foreign key object on save 2 - $db_type");
# Do the save
ok($o->save, "delete foreign key object on save 3 - $db_type");
# Now it's deleted
$co = MySQLiteOtherObject->new(k1 => 7, k2 => 8, k3 => 9);
ok(!$co->load(speculative => 1), "delete foreign key object on save 4 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef
ok(!defined $other_obj && !defined $o->fkone && !defined $o->fk2 && !defined $o->fk3,
"delete foreign key object on save 5 - $db_type");
# RESET
$o->delete;
$o = MySQLiteObject->new(id => 700,
name => 'Ham',
flag => 0);
$o->other_obj_on_save(k1 => 12, k2 => 34, k3 => 56);
$o->save;
$o = MySQLiteObject->new(id => 700);
$o->load;
# TEST: Delete, set on save, delete, save
ok($o->del_other_obj_on_save, "delete 2 foreign key object on save 1 - $db_type");
$other_obj = $o->other_obj_on_save;
# Confirm that fk attrs are undef...
( run in 0.726 second using v1.01-cache-2.11-cpan-39bf76dae61 )