The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../lib";
use lib File::Basename::dirname(__FILE__)."/../..";
use URT;
use Test::More tests => 7;

UR::Object::Type->define(
    class_name => 'Person',
    has => [
        name    => { is => 'String' },
        attribs => { is => 'PersonAttr', is_many => 1, reverse_as => 'person' },
        address => { is => 'String', via => 'attribs', to => 'value', where => [key => 'address'] },
    ],
);

UR::Object::Type->define(
    class_name => 'PersonAttr',
    has => [
        person => { is => 'Person', id_by => 'person_id' },
        key    => { is => 'String' },
        value  => { is => 'String' },
    ],
);

my $bob = Person->create(name => 'Bob');
my $bob_addr = $bob->add_attrib(key => 'address', value => '123 main st');

my $fred = Person->create(name => 'Fred');
my $fred_addr = $fred->add_attrib(key => 'address', value => '456 oak st');

my @people = Person->get(name => 'Fred');
is(scalar(@people), 1, 'Got 1 person named Fred');
is($people[0], $fred, 'it is the right person');

@people = Person->get(address => '123 main st');
is(scalar(@people), 1, 'Got 1 person with address 123 main st');
is($people[0], $bob, 'it is the right person');

ok($fred_addr->value('789 elm st'), 'Change address for Fred');
@people = Person->get(address => '456 oak st');
is(scalar(@people), 0, 'Got 0 people at Fred\' old address');

is($fred->address, '789 elm st', 'Address for Fred is correct through delegated property');