The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

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 => 10;

# This tests a get() by subclass specific parameters on a subclass with no table of its own.
# The property is only defined on the subclass, but the data lives in the table referred to
# in the parent class

my $dbh = URT::DataSource::SomeSQLite->get_default_handle;
ok($dbh, 'Got DB handle');

ok($dbh->do(q{
            create table animal (
                animal_id   integer NOT NULL,
                name        varchar NOT NULL,
                num_legs    integer,
                subclass    varchar NOT NULL)}),
        'Created animal table');

ok($dbh->do("insert into animal (animal_id, name, subclass, num_legs) values (1,'fido','URT::Dog', 4)"),
    'Inserted fido');
ok($dbh->do("insert into animal (animal_id, name, subclass, num_legs) values (2,'woody','URT::Bird', 2)"),
    'Inserted woody');
ok($dbh->do("insert into animal (animal_id, name, subclass) values (3,'jaws','URT::Shark')"),
    'Inserted jaws');

ok($dbh->commit(), 'DB commit');
       
# Dogs and birds have legs, sharks don't
UR::Object::Type->define(
    class_name => 'URT::Animal',
    id_by => [
        animal_id => { is => 'NUMBER', len => 10 },
    ],
    has => [
        name => { is => 'Text' },
        subclass => { is => 'Text' },
    ],
    subclassify_by => 'subclass',
    data_source => 'URT::DataSource::SomeSQLite',
    table_name => 'animal',
); 

UR::Object::Type->define(
    class_name => 'URT::Dog',
    is => 'URT::Animal',
    has_optional => [
        num_legs => { is => 'Integer' },
    ],
);

UR::Object::Type->define(
    class_name => 'URT::Bird',
    is => 'URT::Animal',
    has_optional => [
        num_legs => { is => 'Integer', column_name => 'num_legs' },
    ],
);

UR::Object::Type->define(
    class_name => 'URT::Shark',
    is => 'URT::Animal',
);


my @animals = URT::Dog->get(num_legs => 3);
is(scalar(@animals), 0, 'No dogs with 3 legs');

@animals = URT::Bird->get(num_legs => 2);
is(scalar(@animals), 1, 'Got 1 bird with 2 legs');
is($animals[0]->name, 'woody', ' It was the right animal');

@animals = eval { URT::Animal->get(num_legs => 0) };
like($@, 
     qr/Unknown parameters to URT::Animal get()/,
     'Correctly got an exception trying to query URT::Animal by num_legs');