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

{
    package Mock::BasicOnConnectDo;
    our $CONNECTION_COUNTER;
    use parent qw/Teng/;

    sub setup_test_db {
        shift->do(q{
            CREATE TABLE mock_basic_on_connect_do (
                id   integer,
                name text,
                primary key ( id )
            )
        });
    }

    package Mock::BasicOnConnectDo::Schema;
    use utf8;
    use Teng::Schema::Declare;

    table {
        name 'mock_basic';
        pk 'id';
        columns qw/
            id
            name
        /;
    };
}

subtest 'global level on_connect_do / coderef' => sub {
    local $Mock::BasicOnConnectDo::CONNECTION_COUNTER = 0;

    my $db = Mock::BasicOnConnectDo->new(
        {
            dbh => t::Utils->setup_dbh,
            on_connect_do => sub { $Mock::BasicOnConnectDo::CONNECTION_COUNTER++ }
        }
    );

    is($Mock::BasicOnConnectDo::CONNECTION_COUNTER, 0, "counter should called");
    $db->reconnect; # for do connection.
    is($Mock::BasicOnConnectDo::CONNECTION_COUNTER, 1, "called after reconnect");
};

subtest 'instance level on_connect_do / coderef' => sub {
    my $counter = 0;
    my $db = Mock::BasicOnConnectDo->new(
        {
            dbh => t::Utils->setup_dbh,
            on_connect_do => sub { $counter++ },
        }
    );

    is($counter, 0, "counter should called");
    $db->reconnect; # for do connection.
    is($counter, 1, "called after reconnect");
};

subtest 'instance level on_connect_do / scalar' => sub {
    my $query = '';
    local *Mock::BasicOnConnectDo::do = sub {
        my ($self, $sql, ) = @_;
        $self->dbh; # ca be use dbh handler
        $query = $sql;
    };
    my $db = Mock::BasicOnConnectDo->new(
        +{
            dbh => t::Utils->setup_dbh,
            on_connect_do => 'select * from sqlite_master',
        }
    );

    is $query, '';

    $query='';
    $db->reconnect;
    is $query, 'select * from sqlite_master', 'called after reconnect';
};

subtest 'instance level on_connect_do / array' => sub {
    my @query = ();
    local *Mock::BasicOnConnectDo::do = sub {
        my ($self, $sql, ) = @_;
        $self->dbh; # ca be use dbh handler
        push @query, $sql;
    };
    my $db = Mock::BasicOnConnectDo->new(
        {
            dbh => t::Utils->setup_dbh,
            on_connect_do => ['select * from sqlite_master', 'select * from sqlite_master'],
        }
    );

    is_deeply \@query, [];

    @query = ();
    $db->reconnect;
    is_deeply \@query, ['select * from sqlite_master', 'select * from sqlite_master'], 'called after reconnect';
};


done_testing();