The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests=> 13;
use File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../lib";
use lib File::Basename::dirname(__FILE__).'/../..';

use URT;

my $dbh = URT::DataSource::SomeSQLite->get_default_handle;

ok($dbh, 'Got a database handle');

ok($dbh->do('create table product
            ( product_id int NOT NULL PRIMARY KEY, product_name varchar, product_class varchar)'),
   'created product table');
ok($dbh->do('create table cool_product
            ( product_id int NOT NULL PRIMARY KEY, coolness integer )'),
   'created cool_product table');

ok($dbh->do("insert into product values (1,'race car', 'URT::Product::Cool')"),
         'insert row into product for race car');
ok($dbh->do("insert into cool_product values (1,10)"),
          'insert row into cool_product for race car');
ok($dbh->do("insert into product values (2,'pencil','URT::Product::NotCool')"),
         'insert row into product for pencil');

UR::Object::Type->define(
    class_name => 'URT::Product',
    is_abstract => 1,
    subclassify_by => 'product_class',
    id_by => 'product_id',
    has => [
        product_name  => { is => 'Text' },
        product_class => { is => 'Text' },
        coolness      => { is_abstract => 1, is_transient => 1 },
    ],
    data_source => 'URT::DataSource::SomeSQLite',
    table_name => 'product',
);
UR::Object::Type->define(
    class_name => 'URT::Product::Cool',
    is => 'URT::Product',
    id_by => 'product_id',
    has => [
        coolness => { is => 'Number' },
    ],
    data_source => 'URT::DataSource::SomeSQLite',
    table_name => 'cool_product',
);
UR::Object::Type->define(
    class_name => 'URT::Product::NotCool',
    is => 'URT::Product',
    id_by => 'product_id',
    has_constant => [
        coolness => { is => 'Number', is_classwide => 1, value => 0  },
    ],
);



my @p = URT::Product->get('coolness >' => 0);
is(scalar(@p), 1, 'Got one product with positive coolness');
isa_ok($p[0], 'URT::Product::Cool');
is($p[0]->product_name, 'race car', 'name is correct');

@p = URT::Product->get(coolness => 0);
is(scalar(@p), 1, 'Got one product with zero coolness');
isa_ok($p[0], 'URT::Product::NotCool');
is($p[0]->product_name, 'pencil', 'name is correct');

@p = URT::Product->get('product_name true' => 1, -hints => ['coolness']);
is(scalar(@p), 2, 'Getting products with -hints => coolness got 2 items');