DBIx-ObjectMapper

 view release on metacpan or  search on metacpan

t/12_session/021_validation.t  view on Meta::CPAN

        my $self = shift;
        if( @_ ) {
            $self->{parent_id} = shift;
        }
        $self->{parent_id};
    }

    sub parent {
        my $self = shift;
        if( @_ ) {
            $self->{parent} = shift;
        }
        $self->{parent};
    }

    1;
};

{
    package MyTest21::HasOne;
    use strict;
    use warnings;

    sub new {
        my $class = shift;
        my %param = @_ % 2 == 0 ? @_ : %{$_[0]};
        my $self = bless \%param, $class;
        return $self;
    }

    sub id {
        my $self = shift;
        $self->{id} = shift if @_;
        return $self->{id};
    }

    sub memo {
        my $self = shift;
        $self->{memo} = shift if @_;
        return $self->{memo};
    }

    sub parent {
        my $self = shift;
        if( @_ ) {
            $self->{parent} = shift;
        }
        $self->{parent};
    }

    1;
};

my $parent_mapper = $mapper->maps(
    $mapper->metadata->t('parent') => 'MyTest21::Parent',
    attributes => {
        properties => {
            children => {
                isa => $mapper->relation(
                    has_many => 'MyTest21::Child',
                    { cascade => 'save_update' }
                ),
                validation => 1,
            },
            has_one => {
                isa => $mapper->relation(
                    has_one => 'MyTest21::HasOne',
                    { cascade => 'save_update' }
                ),
                validation => 1,
            },
            id => { validation => 1 },
            name => { validation => 1 },
        }
    }
);

ok $parent_mapper->attributes->property('children')->is_cascade_save_update, 'only cascade save_update';
ok $parent_mapper->attributes->property('children')->validation, 'set validation option';

$mapper->maps(
    $mapper->metadata->t('child') => 'MyTest21::Child',
    attributes => {
        properties => {
            parent => {
                isa => $mapper->relation(
                    belongs_to => 'MyTest21::Parent',
                    { cascade => 'save_update' }
                ),
                validation => 1,
            },
        }
    }
);


$mapper->maps(
    $mapper->metadata->t('has_one') => 'MyTest21::HasOne',
    attributes => {
        properties => {
            parent => {
                isa => $mapper->relation( has_one => 'MyTest21::Parent' ),
                validation => 1,
            },
            memo => { validation => 1 },
        }
    }
);

{
    my $session = $mapper->begin_session;

    my $parent = MyTest21::Parent->new( id => 1 );
    $session->add($parent);

    ok $parent->name('abcdef'),'set parent.name ok';
    dies_ok { $parent->name(123) } 'validation failed parent.name';
    dies_ok { $parent->name('abc-efg') } 'validation failed parent.name2';

    dies_ok { $parent->children(1) } 'validation failed parent.children';
    dies_ok { $parent->children([qw(a b c)]) } 'validation failed parent.children2';
    my @children = map { MyTest21::Child->new( parent_id => 1 ) } ( 1 .. 5 );
    ok $parent->children(\@children);

    dies_ok { $parent->has_one( 'a' ) } 'validation failed prent.has_one';
    dies_ok { $parent->has_one( ['a'] ) } 'validation failed prent.has_one2';
    ok $parent->has_one( MyTest21::HasOne->new( memo => 'memo' ) );
};

{
    my $session = $mapper->begin_session;
    ok my $parent = $session->get( 'MyTest21::Parent' => 1 );
    is $parent->name, 'abcdef';
    ok @{$parent->children} == 5;
    ok $parent->has_one;
};

{
    my $session = $mapper->begin_session;
    my $has_one = MyTest21::HasOne->new( memo => 'hoge' );
    $session->add($has_one);
    $session->flush;

    ok my $r = $session->get( 'MyTest21::HasOne' => 2 );
    is $r->memo, 'hoge';
};

done_testing;



( run in 1.341 second using v1.01-cache-2.11-cpan-39bf76dae61 )