use strict; use warnings; use above 'UR'; use Test::More tests => 9; UR::Object::Type->define(class_name => 'Sandwich'); UR::Object::Type->define(class_name => 'Drink'); UR::Object::Type->define( class_name => 'Combo', id_by => [ sandwich => { is => 'Sandwich' }, drink => { is => 'Drink' }, ], ); UR::Object::Type->define( class_name => 'Order', has => [ sandwich => { is => 'Sandwich', id_by => 'sandwich_id' }, drink => { is => 'Drink' }, ], ); UR::Object::Type->define( class_name => 'BuggedOrder', has => [ # sandwich has to have the id_by here in order to trigger the bug sandwich => { is => 'Sandwich', id_by => 'sandwich_id' }, drink => { is => 'Drink' }, # yes, drink_id is ommitted here ], has_optional => [ combo => { is => 'Combo', id_by => ['sandwich_id', 'drink_id'], # This drink_id is not related to 'drink' above }, ], ); my $sandwich = Sandwich->create; isa_ok($sandwich, 'Sandwich', 'sandwich'); my $drink = Drink->create; isa_ok($drink, 'Drink', 'drink'); my $ok_order = Order->create(sandwich => $sandwich, drink => $drink); isa_ok($ok_order, 'Order', 'ok_order'); is($ok_order->__meta__->property('sandwich')->is_optional, 0, 'sandwich is not optional'); my $order = BuggedOrder->create(sandwich => $sandwich, drink => $drink); isa_ok($order, 'BuggedOrder', 'order'); my $order_meta = $order->__meta__; is($order_meta->property('sandwich_id')->is_optional, 0, 'sandwich_id is not optional'); is($order_meta->property('sandwich')->is_optional, 0, 'sandwich is not optional'); is($order_meta->property('drink')->is_optional, 0, 'drink is not optional'); # because drink_id isn't mentioned in the definition of drink, but is for combo is($order_meta->property('drink_id')->is_optional, 1, 'drink_id is optional');