The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use t::Utils;
use Mock::Basic;
use Test::More;

my $dbh = t::Utils->setup_dbh;
my $db = Mock::Basic->new({dbh => $dbh});
$db->setup_test_db;

$db->insert('mock_basic',{
    id   => 1,
    name => 'perl',
});
$db->insert('mock_basic',{
    id   => 2,
    name => 'ruby',
});

subtest 'search_named' => sub {
    my $itr = $db->search_named(q{SELECT * FROM mock_basic WHERE id = :id}, {id => 1});
    isa_ok $itr, 'Teng::Iterator';

    my $row = $itr->next;
    isa_ok $row, 'Teng::Row';
    is $row->id , 1;
    is $row->name, 'perl';
};

subtest 'search_named' => sub {
    my $itr = $db->search_named(q{SELECT * FROM mock_basic WHERE id = :id OR name = :name}, {id => 1, name => 'ruby'});
    isa_ok $itr, 'Teng::Iterator';

    my @row = $itr->all;
    isa_ok $row[0], 'Teng::Row';
    is $row[0]->id , 1;
    is $row[0]->name, 'perl';
    isa_ok $row[1], 'Teng::Row';
    is $row[1]->id , 2;
    is $row[1]->name, 'ruby';
};

subtest 'search_named with arrayref' => sub {

    my $org_code = Teng->can('search_by_sql');
    my ($query, $bind);
    no warnings 'redefine';
    local *Teng::search_by_sql = sub {
        $query = $_[1];
        $bind  = $_[2];
        $org_code->(@_);
    };

    my $itr = $db->search_named(q{
        SELECT * FROM mock_basic
        WHERE (
            id IN :ids
        )
        limit 100
    }, +{ ids => [1, 2, 3] });

    isa_ok $itr, 'Teng::Iterator';

    my $row = $itr->next;
    isa_ok $row, 'Teng::Row';
    is $row->id , 1;
    is $row->name, 'perl';

    is $query, q{
        SELECT * FROM mock_basic
        WHERE (
            id IN ( ?,?,? )
        )
        limit 100
    };
    is_deeply $bind, [qw/1 2 3/];
};

subtest 'search_named with non existent bind' => sub {
    eval {
        my $itr = $db->search_named(
            q{SELECT * FROM mock_basic WHERE id = :id OR name = :name},
            { id => 1 }
        );
    };
    like $@, qr/'name' does not exist in bind hash/;
};

done_testing;