#!/usr/bin/perl -w BEGIN { use lib qw( t ); } use strict; use Test::More tests => 20; use my_dbi_conf; use test_config; test_config->recreate_tables; require 'fill_tables.pl'; my ($v, $p, $s, $a, $by, $slips); ##----- fetch method ----- my $t = 'fetch method'; $v = Vehicle->fetch(1); ok( $p = $v->owner_PersonAlias, $t ); is( ref($p), 'Person', $t . ', ref of return val' ); cmp_ok( $p->id, '==', 24, $t . ', id of return val' ); ##----- forward direction auto-fetching ----- $t = 'forward direction auto-fetching'; $s = Seaplane->fetch(12); $a = $s->{anchor}; is( ref($a), 'Anchor', $t . ', ref of return val' ); cmp_ok( $a->id, '==', 17, $t . ', id of return val' ); ##----- backward direction auto-fetching ----- $t = 'backward direction auto-fetching'; $by = Boatyard->fetch(30); $slips = $by->{list_of_slips}; is( @$slips, 3, $t ); cmp_ok( grep(ref($_) ne 'Slip', @$slips), '==', 0, $t ); is_deeply( [sort map { $_->id } @$slips], [34 .. 36], $t ); ##----- forward direction auto-save ----- $t = 'forward direction auto-save (id in field)'; $a = Anchor->new({weight => 203}); $a->save; $s = Seaplane->new( { name => 'Albatross', owner => 17, ceiling => 19000, wingspan => 50, min_depth => 10, anchor => $a->id, max_wave_height => 4 } ); $s->save; $a = $s->{anchor}; is( ref($a), 'Anchor', $t . ', ref after save' ); cmp_ok( Anchor->fetch($a->id)->weight, '==', 203, $t . ', correct obj' ); ## save with object in anchor field $t = 'forward direction auto-save (unsaved obj in field)'; $s->remove; $s = Seaplane->new( { name => 'Albatross', owner => 17, ceiling => 19000, wingspan => 50, min_depth => 10, anchor => Anchor->new({weight => 250}), max_wave_height => 4 } ); $s->save; $a = $s->{anchor}; is( ref($a), 'Anchor', $t . ', ref after save' ); cmp_ok( Anchor->fetch($a->id)->weight, '==', 250, $t . ', correct obj' ); $t = 'save obj with auto-fetched obj and nosave flag'; $s->remove; use BoatNoSaveAnchor; $a = Anchor->new( { weight => 5000 } )->save; $s = BoatNoSaveAnchor->new( { name => 'Big Ship', owner => 17, min_depth => 10, anchor => $a } ); $s->save; $a = $s->{anchor}; is( ref($a), 'Anchor', $t . ', ref after save' ); cmp_ok( Anchor->fetch($a->id)->weight, '==', 5000, $t . ', correct obj' ); ##----- backward direction auto-save ----- $t = 'backward direction auto-save'; $by = Boatyard->new( { name => 'Dock City'} ); $by->{list_of_slips} = [ Slip->new( {number => 1} ), Slip->new( {number => 2} ), Slip->new( {number => 3} ), Slip->new( {number => 4} ) ]; $by->save; $slips = $by->{list_of_slips}; is( @$slips, 4, $t ); is_deeply( [map $_->{boatyard}, @$slips], [map $by->id, @$slips], $t); $by = Boatyard->fetch($by->id); $slips = $by->{list_of_slips}; is( @$slips, 4, $t ); is_deeply( [map $_->number, @$slips], [1..4], $t); ##----- forward direction auto-remove ----- $t = 'forward direction auto-remove'; my ($args, $row); $s->remove; $args = { from => [ Anchor->base_table ], select => [ 'count(*)'], where => Anchor->id_clause($a->id, undef, undef), return => 'single' }; $row = eval { Anchor->db_select($args); }; is( $row->[0], 0, $t ); ##----- backward direction auto-remove ----- $t = 'backward direction auto-remove'; $by->remove; $args = { from => [ Slip->base_table ], select => [ 'count(*)'], where => 'boatyard = ' . $by->id, return => 'single' }; $row = eval { Slip->db_select($args); }; is( $row->[0], 0, $t ); 1;