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 Test::More tests => 3;

use File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../lib";
use lib File::Basename::dirname(__FILE__)."/../..";
use URT; # dummy namespace

use File::Temp;
use File::Spec;

my $sqlite_dir = File::Temp::tempdir( CLEANUP => 1 );

create_dir_with_schema_files($sqlite_dir);
define_classes($sqlite_dir);

my $person = URT::Person->get(car_make => 'ford');
is($person->name, 'bob', 'bob owns the ford');

$person = URT::Person->get(car_model => 'model s');
is($person->name, 'fred', 'fred owns the mode s');

$person = URT::Person->get(car_model => 'hupmobile');
ok(!$person, 'no one owns a hupmobile');

sub create_dir_with_schema_files {
    my$sqlite_dir = shift;
    my $main_schema_file = File::Spec->catfile($sqlite_dir, 'main.sqlite3');
    my $main_dbh = DBI->connect("dbi:SQLite:dbname=$main_schema_file",'','')
            || die "Can't create main schema file in dir $sqlite_dir: ".$DBI::errstr;
    $main_dbh->do('create table person (person_id integer primary key, name varchar)');
    $main_dbh->do("insert into person values (1, 'bob')");
    $main_dbh->do("insert into person values (2, 'fred')");

    my $car_schema_file = File::Spec->catfile($sqlite_dir, 'cars.sqlite3');
    my $car_dbh = DBI->connect("dbi:SQLite:dbname=$car_schema_file",'','')
            || die "Can't create cars schema file in dir $sqlite_dir: ".$DBI::errstr;
    $car_dbh->do('create table car (car_id integer primary_key, owner_id integer not null, make varchar, model varchar)');
    $car_dbh->do("insert into car values (1, 1, 'ford','galaxie')");
    $car_dbh->do("insert into car values (2, 1, 'chrysler', 'airstream')");
    $car_dbh->do("insert into car values (3, 2, 'tesla', 'model s')");
}

sub define_classes {
    my $sqlite_dir = shift;

    UR::Object::Type->define(
        class_name => 'URT::DataSource::SQLiteDir',
        is => 'UR::DataSource::SQLite',
        has_constant => [
            server => { value => $sqlite_dir },
        ],
    );

    UR::Object::Type->define(
        class_name => 'URT::Person',
        id_by => 'person_id',
        has => [
            name => { is => 'String' },
            cars => { is_many => 1, reverse_as => 'owner', is => 'URT::Car' },
            car_make => { via => 'cars', to => 'make' },
            car_model => { via => 'cars', to => 'model' },
        ],
        data_source => 'URT::DataSource::SQLiteDir',
        table_name => 'main.person',
    );

    UR::Object::Type->define(
        class_name => 'URT::Car',
        id_by => 'car_id',
        has => [
            owner => { id_by => 'owner_id', is => 'URT::Person' },
            make => { is => 'String' },
            model => { is => 'String' },
        ],
        data_source => 'URT::DataSource::SQLiteDir',
        table_name => 'cars.car',
    );
}