The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use xt::Utils::mysql;
use Mock::Basic;
use Test::More;
Mock::Basic->load_plugin('SearchBySQLAbstractMore::Pager::Count');

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

my $mksqls = \&Teng::Plugin::SearchBySQLAbstractMore::Pager::Count::_create_sqls;

subtest "search",
    sub {
     my ($sql, $binds, $count_sql, $count_binds)
     = $mksqls->($db,
                 {-columns  => [qw/user_id name/],
                  -limit    => 20,
                  -offset   => 1,
                  -where    => { user_id => { '>', 10 } },
                  -from     => 'users',
                 }
                );

     is _regularize($sql), 'select user_id, name from users where ( user_id > ? ) limit ? offset ?';
     is_deeply $binds, [10, 20, 1];
     is _regularize($count_sql), 'select count(*) from users where ( user_id > ? )';
     is_deeply $count_binds, [10];
    };

subtest "search_with_group_by",
    sub {
     my ($sql, $binds, $count_sql, $count_binds)
     = $mksqls->($db,
                 {-columns  => [qw/user_id count(*) date(clicked_datetime)/],
                  -group_by => [qw/user_id date(clicked_datetime)/],
                  -limit    => 20,
                  -offset   => 1,
                  -where    => { user_id => { '>', 10 } },
                  -from     => 'clicks',
                 }
                );

     is _regularize($sql), 'select user_id, count(*), date(clicked_datetime) from clicks where ( user_id > ? ) group by user_id, date(clicked_datetime) limit ? offset ?';
     is_deeply $binds, [10, 20, 1];
     is _regularize($count_sql), 'select count(*) as cnt from (select user_id, count(*), date(clicked_datetime) from clicks where ( user_id > ? ) group by user_id, date(clicked_datetime) order by null) as total_count';
     is_deeply $count_binds, [10];
    };

subtest "search_group_by_and_having",
    sub {
     my ($sql, $binds, $count_sql, $count_binds)
     = $mksqls->($db,
                 {
                  -from  => 'clicks',
                  -columns      => [qw/user_id count(*) date(clicked_datetime)/],
                  -group_by     => [qw/user_id date(clicked_datetime)/],
                  -having   => [{'count(*)' => {'>', 15}}],
                  -limit    => 20,
                  -offset   => 1,
                 }
                );
     is _regularize($sql), 'select user_id, count(*), date(clicked_datetime) from clicks group by user_id, date(clicked_datetime) having ( count(*) > ? ) limit ? offset ?';
     is_deeply $binds, [15, 20, 1];
     is _regularize($count_sql), 'select count(*) as cnt from (select user_id, count(*), date(clicked_datetime) from clicks group by user_id, date(clicked_datetime) having ( count(*) > ? ) order by null) as total_count';
     is_deeply $count_binds, [15];
    };

subtest "search_with_group_by_and_hint_columns",
    sub {
     my ($sql, $binds, $count_sql, $count_binds)
     = $mksqls->($db,
                 {
                  -from  => 'clicks',
                  -columns      => [qw/user_id count(*) date(clicked_datetime)/],
                  -group_by     => [qw/user_id date(clicked_datetime)/],
                  -hint_columns => [qw/user_id/],
                  -limit    => 20,
                  -offset   => 1,
                 }
                );
     is _regularize($sql), 'select user_id, count(*), date(clicked_datetime) from clicks group by user_id, date(clicked_datetime) limit ? offset ?';
     is_deeply $binds, [20, 1];
     is _regularize($count_sql), 'select count(*) as cnt from (select user_id from clicks group by user_id, date(clicked_datetime) order by null) as total_count';
     is_deeply $count_binds, [];
    };

subtest "search_group_by_and_hint_columns_and_having",
    sub {
     my ($sql, $binds, $count_sql, $count_binds)
     = $mksqls->($db,
                 {
                  -from  => 'clicks',
                  -columns      => [qw/user_id count(*) date(clicked_datetime)/],
                  -group_by     => [qw/user_id date(clicked_datetime)/],
                  -hint_columns => [qw/count(*)/],
                  -having   => [{'count(*)' => {'>', 15}}],
                  -limit    => 20,
                  -offset   => 1,
                 }
                );
     is _regularize($sql), 'select user_id, count(*), date(clicked_datetime) from clicks group by user_id, date(clicked_datetime) having ( count(*) > ? ) limit ? offset ?';
     is_deeply $binds, [15, 20, 1];
     is _regularize($count_sql), 'select count(*) as cnt from (select count(*) from clicks group by user_id, date(clicked_datetime) having ( count(*) > ? ) order by null) as total_count';
     is_deeply $count_binds, [15];
    };

done_testing();

sub _regularize {
    my ($sql) = @_;
    $sql =~s{\s+}{ }g;
    lc $sql;
}