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 )