#!/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 => 20;
# This tests a get() by subclass specific parameters on a subclass with no table of its own.
# The idea is to make sure that queries run with any subclass specific parameters (which can
# be stored in hangoff tables or calculated) do not cause the cache to believe it had loaded
# more objects of that specific subclass than it actually has.
setup_classes_and_db();
my $fido = URT::Dog->get(color => 'black');
ok($fido, 'Got fido by hangoff parameter (color)');
is($fido->name, 'fido', 'Fido has correct name');
is($fido->id, 1, 'Fido has correct id');
my $rex = URT::Dog->get(color => 'brown');
ok($rex, 'Got rex by hangoff parameter (color)');
SKIP: {
skip 'Failed to get rex, not testing his properties', 2 if !defined $rex;
is($rex->name, 'rex', 'Rex has correct name');
is($rex->id, 2, 'Rex has correct id');
};
$fido = URT::Dog->get(tag_id => 1);
ok($fido, 'Got fido by calculated property (tag_id)');
is($fido->name, 'fido', 'Fido has correct name');
is($fido->id, 1, 'Fido has correct id');
$rex = URT::Dog->get(tag_id => 2);
ok($rex, 'Got rex by calculated property (tag_id)');
SKIP: {
skip 'Failed to get rex, not testing his properties', 2 if !defined $rex;
is($rex->name, 'rex', 'Rex has correct name');
is($rex->id, 2, 'Rex has correct id');
};
sub setup_classes_and_db {
my $dbh = URT::DataSource::SomeSQLite->get_default_handle;
ok($dbh, 'Got DB handle');
ok($dbh->do(q{
create table animal (
animal_id integer,
name varchar,
subclass varchar)}),
'Created animal table');
ok($dbh->do(q{
create table animal_param (
animal_param_id integer,
animal_id integer references animal(animal_id),
param_name varchar,
param_value varchar)}),
'Created animal_param table');
ok($dbh->do("insert into animal (animal_id, name, subclass) values (1,'fido','URT::Dog')"),
'Inserted fido');
ok($dbh->do("insert into animal_param (animal_param_id, animal_id, param_name, param_value) values (1, 1, 'color', 'black')"),
'Turned fido black');
ok($dbh->do("insert into animal (animal_id, name, subclass) values (2,'rex','URT::Dog')"),
'Inserted rex');
ok($dbh->do("insert into animal_param (animal_param_id, animal_id, param_name, param_value) values (2, 2, 'color', 'brown')"),
'Turned rex brown');
ok($dbh->commit(), 'DB commit');
UR::Object::Type->define(
class_name => 'URT::Animal',
id_by => [
animal_id => { is => 'NUMBER', len => 10 },
],
has => [
name => { is => 'Text' },
subclass => { is => 'Text' },
],
has_many_optional => [
params => { is => 'URT::AnimalParam', reverse_as => 'animal', },
],
is_abstract => 1,
subclassify_by => 'subclass',
data_source => 'URT::DataSource::SomeSQLite',
table_name => 'animal',
);
UR::Object::Type->define(
class_name => 'URT::Dog',
is => 'URT::Animal',
has => [
tag_id => {
calculate_from => [ 'animal_id' ],
calculate => q{ return $animal_id; },
},
color => {
via => 'params',
is => 'Text',
to => 'param_value',
where => [ param_name => 'color', ],
},
],
);
UR::Object::Type->define(
class_name => 'URT::AnimalParam',
id_by => [
animal_param_id => { is => 'NUMBER' },
],
has => [
animal => { id_by => 'animal_id', is => 'URT::Animal' },
param_name => { is => 'Text' },
param_value => { is => 'Text' },
],
data_source => 'URT::DataSource::SomeSQLite',
table_name => 'animal_param',
);
}