The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl -w
use strict;
use warnings;

use Test::More;
use DBIx::ResultSet::Connector;

my $connector = DBIx::ResultSet->connect( 'dbi:SQLite:dbname=t/test.db', '', '' );

$connector->run(sub{
    my ($dbh) = @_;

    $dbh->do('DROP TABLE IF EXISTS users');
    $dbh->do('CREATE TABLE users (user_id NUMBER, user_name TEXT, status NUMBER)');
});

my $users = $connector->resultset('users');
$users->insert( {user_id=>1, user_name=>'one',   status=>1} );
$users->insert( {user_id=>2, user_name=>'two',   status=>0} );
$users->insert( {user_id=>3, user_name=>'three', status=>1} );

my $on_users = $users->search({ status => 1 });
is( $on_users->table(), 'users', 'table' );
is_deeply( $on_users->where(), { status=>1 }, 'where' );

is( $on_users->search(undef, {order_by=>'user_name'})->clauses->{order_by}, 'user_name', 'order_by' );
is( $on_users->search(undef, {page=>3})->clauses->{page}, 3, 'page' );
is( $on_users->search(undef, {rows=>20})->clauses->{rows}, 20, 'rows' );

my $paged_rs = $users->search(undef, { page=>1, rows=>2, order_by=>'user_id' });
is( $paged_rs->last_page(), 2, 'last_page' );
is( $paged_rs->total_entries(), 3, 'total_entries' );

is_deeply( $paged_rs->column('user_id'), [1, 2], 'page 1' );
$paged_rs = $paged_rs->search(undef, { page=>2 });
is_deeply( $paged_rs->column('user_id'), [3], 'page 2' );

is_deeply(
    $users->search(undef,{order_by=>'user_id'})->array_row(['user_id', 'user_name']),
    ['1', 'one'],
    'array_row',
);

is_deeply(
    $users->search(undef,{order_by=>'user_id'})->hash_row(['user_id', 'user_name']),
    { user_id => '1', user_name => 'one' },
    'hash_row',
);

is_deeply(
    $users->search(undef,{order_by=>'user_id'})->array_of_array_rows('user_id'),
    [[1],[2],[3]],
    'array_of_array_rows',
);

is_deeply(
    $users->search(undef,{order_by=>'user_id'})->array_of_hash_rows('user_name'),
    [{user_name=>'one'},{user_name=>'two'},{user_name=>'three'}],
    'array_of_hash_rows',
);

is_deeply(
    $users->hash_of_hash_rows('user_id', 'user_id'),
    {1=>{user_id=>1},2=>{user_id=>2},3=>{user_id=>3}},
    'hash_of_hash_rows',
);

is( $on_users->count(), 2, 'count' );

done_testing;