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;
use URT::DataSource::SomeSQLite;
use File::Temp qw();

my $new_ds_file = generate_somesqlite_datasource('URT::DataSource::AnotherSQLite');
require $new_ds_file->filename;

my $table_name = 'thing';
my %class_of_ds = (
    'URT::DataSource::SomeSQLite' => 'SomeThing',
    'URT::DataSource::AnotherSQLite' => 'AnotherThing',
);

for my $ds (qw(URT::DataSource::SomeSQLite URT::DataSource::AnotherSQLite)) {
    my $dbh = $ds->get_default_handle();
    my $sql = qq(create table $table_name (id integer));
    ok($dbh->do($sql), "$ds: $sql");

    UR::Object::Type->define(
        class_name => $class_of_ds{$ds},
        id_by => 'id',
        data_source => $ds,
        table_name => $table_name,
    );
}

my @classes_for_table = grep { $_->class_name !~ /::Ghost$/ } UR::Object::Type->is_loaded(table_name => $table_name);
is(scalar(@classes_for_table), 2, 'got two classes for table');

for my $ds (qw(URT::DataSource::SomeSQLite URT::DataSource::AnotherSQLite)) {
    my $class_name = $ds->_lookup_class_for_table_name($table_name);
    is($class_name, $class_of_ds{$ds}, qq(class for '$table_name' on $ds is correct));
}

for my $class (values %class_of_ds) {
    $class->create(id => 1) or die;
}
UR::Context->commit;

for my $ds (qw(URT::DataSource::SomeSQLite URT::DataSource::AnotherSQLite)) {
    my $dbh = $ds->get_default_handle();
    my $sth = $dbh->prepare(qq(select * from $table_name));
    $sth->execute();
    my $r = $sth->fetchall_arrayref();
    is_deeply($r, [[1]], qq($ds: got expected row));
}

sub generate_somesqlite_datasource {
    my $ds_class_name = shift;

    my $orig_path = $INC{'URT/DataSource/SomeSQLite.pm'};
    my $orig_file = IO::File->new($orig_path, 'r');
    local ($/);
    my $orig_source = <$orig_file>;

    $orig_source =~ s/URT::DataSource::SomeSQLite/$ds_class_name/g;

    my $new_file = File::Temp->new(TMPDIR => 1);
    $new_file->print($orig_source);
    $new_file->close();

    return $new_file;
}