The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# This documents a bug that didn't actually get shipped that would cause the
# default retriable methods on RDBMSRetriableOperations to wrap the first data
# source to use it even for subsequent data sources.

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

my %_sync_database;
*URT::DataSource::SomeSQLiteA::_sync_database = sub {
    $_sync_database{'URT::DataSource::SomeSQLiteA'}++;
    return 1;
};
*URT::DataSource::SomeSQLiteB::_sync_database = sub {
    $_sync_database{'URT::DataSource::SomeSQLiteB'}++;
    return 1;
};

my @ds_spec = (
    ['URT::DataSource::SomeSQLiteA', 'URT::DataSource::RetriableSQLiteA'],
    ['URT::DataSource::SomeSQLiteB', 'URT::DataSource::RetriableSQLiteB'],
);

my $method = '_sync_database';

for (my $i = 0; $i < @ds_spec; $i++) {
    my $ds_typename = $ds_spec[$i][0];
    my $ds_name     = $ds_spec[$i][1];

    UR::Object::Type->define(
        class_name => $ds_typename,
        is => 'URT::DataSource::SomeSQLite',
    );

    UR::Object::Type->define(
        class_name => $ds_name,
        is => [
            'UR::DataSource::RDBMSRetriableOperations',
            $ds_typename,
        ],
    );
}

for (my $i = 0; $i < @ds_spec; $i++) {
    my $ds_typename = $ds_spec[$i][0];
    my $ds_name     = $ds_spec[$i][1];

    my $oi = ($i + 1) % 2;
    my $other_ds_typename = $ds_spec[$oi][0];
    my $other_ds_name     = $ds_spec[$oi][1];

    setUp();
    is(scalar(keys %_sync_database), 0, "$ds_name: setUp OK");

    my $ds = $ds_name->get();
    my $sync_rv = $ds->$method();

    ok($sync_rv,                             "$ds_name: $method returned successfully");
    ok( $_sync_database{$ds_typename},       "$ds_name: this datasource method was called");
    ok(!$_sync_database{$other_ds_typename}, "$ds_name: other datasource method was not called");
}

sub setUp {
    for my $k (keys %_sync_database) {
        delete $_sync_database{$k};
    }
}