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;
use Data::RuledCluster;

my $dr = Data::RuledCluster->new(
    config   => undef,
    callback => undef,
);

subtest 'List Strategy' => sub {
    my $config = +{
        clusters => +{
            SLAVE => +{
                strategy        => 'List',
                nodes           => [qw/SLAVE001 SLAVE002 SLAVE003/],
                strategy_config => +{
                    SLAVE001 => [qw/1 4/],
                    SLAVE002 => [qw/2 3 6/],
                    SLAVE003 => [qw/5/],
                },
            },
        },
        node => +{
            SLAVE001 => ['dbi:mysql:slave001', 'root', '',],
            SLAVE002 => ['dbi:mysql:slave002', 'root', '',],
            SLAVE003 => ['dbi:mysql:slave003', 'root', '',],
        },
    };
    $dr->config($config);

    my $node_info;
    $node_info = $dr->resolve('SLAVE', 1);
    note explain $node_info;
    is_deeply $node_info, +{node => 'SLAVE001', node_info => ['dbi:mysql:slave001', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 4), +{node => 'SLAVE001', node_info => ['dbi:mysql:slave001', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 2), +{node => 'SLAVE002', node_info => ['dbi:mysql:slave002', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 3), +{node => 'SLAVE002', node_info => ['dbi:mysql:slave002', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 6), +{node => 'SLAVE002', node_info => ['dbi:mysql:slave002', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 5), +{node => 'SLAVE003', node_info => ['dbi:mysql:slave003', 'root', '',]};

    my $resolve_node_keys = $dr->resolve_node_keys('SLAVE', [qw/1 2 3 4 5 6/]);
    note explain $resolve_node_keys;
    is_deeply $resolve_node_keys, +{
        SLAVE001 => [qw/1 4/],
        SLAVE002 => [qw/2 3 6/],
        SLAVE003 => [qw/5/],
    };
};

subtest 'List Strategy' => sub {
    my $config = +{
        clusters => +{
            SLAVE => +{
                strategy        => 'List',
                nodes           => [qw/SLAVE001 SLAVE002 SLAVE003/],
                list_map        => +{
                    1 => 'SLAVE001',
                    4 => 'SLAVE001',
                    2 => 'SLAVE002',
                    3 => 'SLAVE002',
                    6 => 'SLAVE002',
                    5 => 'SLAVE003',
                },
            },
        },
        node => +{
            SLAVE001 => ['dbi:mysql:slave001', 'root', '',],
            SLAVE002 => ['dbi:mysql:slave002', 'root', '',],
            SLAVE003 => ['dbi:mysql:slave003', 'root', '',],
        },
    };
    $dr->config($config);

    my $node_info;
    $node_info = $dr->resolve('SLAVE', 1);
    note explain $node_info;
    is_deeply $node_info, +{node => 'SLAVE001', node_info => ['dbi:mysql:slave001', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 4), +{node => 'SLAVE001', node_info => ['dbi:mysql:slave001', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 2), +{node => 'SLAVE002', node_info => ['dbi:mysql:slave002', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 3), +{node => 'SLAVE002', node_info => ['dbi:mysql:slave002', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 6), +{node => 'SLAVE002', node_info => ['dbi:mysql:slave002', 'root', '',]};
    is_deeply $dr->resolve('SLAVE', 5), +{node => 'SLAVE003', node_info => ['dbi:mysql:slave003', 'root', '',]};

    my $resolve_node_keys = $dr->resolve_node_keys('SLAVE', [qw/1 2 3 4 5 6/]);
    note explain $resolve_node_keys;
    is_deeply $resolve_node_keys, +{
        SLAVE001 => [qw/1 4/],
        SLAVE002 => [qw/2 3 6/],
        SLAVE003 => [qw/5/],
    };
};

done_testing;