App-Sqitch
view release on metacpan or search on metacpan
--connect_timeout 20
)], 'mysql command should not have disabled param options';
##############################################################################
# Test _run(), _capture(), and _spool().
can_ok $mysql, qw(_run _capture _spool);
my (@run, $exp_pass);
$mock_sqitch->mock(run => sub {
local $Test::Builder::Level = $Test::Builder::Level + 2;
shift;
@run = @_;
if (defined $exp_pass) {
is $ENV{MYSQL_PWD}, $exp_pass, qq{MYSQL_PWD should be "$exp_pass"};
} else {
ok !exists $ENV{MYSQL_PWD}, 'MYSQL_PWD should not exist';
}
});
my @capture;
$mock_sqitch->mock(capture => sub {
local $Test::Builder::Level = $Test::Builder::Level + 2;
shift;
@capture = @_;
if (defined $exp_pass) {
is $ENV{MYSQL_PWD}, $exp_pass, qq{MYSQL_PWD should be "$exp_pass"};
} else {
ok !exists $ENV{MYSQL_PWD}, 'MYSQL_PWD should not exist';
}
});
my @spool;
$mock_sqitch->mock(spool => sub {
local $Test::Builder::Level = $Test::Builder::Level + 2;
shift;
@spool = @_;
if (defined $exp_pass) {
is $ENV{MYSQL_PWD}, $exp_pass, qq{MYSQL_PWD should be "$exp_pass"};
} else {
ok !exists $ENV{MYSQL_PWD}, 'MYSQL_PWD should not exist';
}
});
$target = App::Sqitch::Target->new(sqitch => $sqitch);
ok $mysql = $CLASS->new(sqitch => $sqitch, target => $target),
'Create a mysql with sqitch with options';
$exp_pass = 's3cr3t';
$target->uri->password($exp_pass);
ok $mysql->_run(qw(foo bar baz)), 'Call _run';
is_deeply \@run, [$mysql->mysql, qw(foo bar baz)],
'Command should be passed to run()';
ok $mysql->_spool('FH'), 'Call _spool';
is_deeply \@spool, [['FH'], $mysql->mysql],
'Command should be passed to spool()';
$mysql->set_variables(foo => 'bar', '"that"' => "'this'");
ok $mysql->_spool('FH'), 'Call _spool with variables';
ok my $fh = shift @{ $spool[0] }, 'Get variables file handle';
is_deeply \@spool, [['FH'], $mysql->mysql],
'Command should be passed to spool() after variables handle';
is join("\n", <$fh>), qq{SET \@"""that""" = '''this''', \@"foo" = 'bar';\n},
'Variables should have been escaped and set';
$mysql->clear_variables;
ok $mysql->_capture(qw(foo bar baz)), 'Call _capture';
is_deeply \@capture, [$mysql->mysql, qw(foo bar baz)],
'Command should be passed to capture()';
# Without password.
$target = App::Sqitch::Target->new( sqitch => $sqitch );
ok $mysql = $CLASS->new(sqitch => $sqitch, target => $target),
'Create a mysql with sqitch with no pw';
$exp_pass = undef;
$target->uri->password($exp_pass);
ok $mysql->_run(qw(foo bar baz)), 'Call _run again';
is_deeply \@run, [$mysql->mysql, qw(foo bar baz)],
'Command should be passed to run() again';
ok $mysql->_spool('FH'), 'Call _spool again';
is_deeply \@spool, [['FH'], $mysql->mysql],
'Command should be passed to spool() again';
ok $mysql->_capture(qw(foo bar baz)), 'Call _capture again';
is_deeply \@capture, [$mysql->mysql, qw(foo bar baz)],
'Command should be passed to capture() again';
##############################################################################
# Test file and handle running.
ok $mysql->run_file('foo/bar.sql'), 'Run foo/bar.sql';
is_deeply \@run, [$mysql->mysql, '--execute', 'source foo/bar.sql'],
'File should be passed to run()';
@run = ();
ok $mysql->run_handle('FH'), 'Spool a "file handle"';
is_deeply \@spool, [['FH'], $mysql->mysql],
'Handle should be passed to spool()';
@spool = ();
# Verify should go to capture unless verbosity is > 1.
ok $mysql->run_verify('foo/bar.sql'), 'Verify foo/bar.sql';
is_deeply \@capture, [$mysql->mysql, '--execute', 'source foo/bar.sql'],
'Verify file should be passed to capture()';
@capture = ();
$mock_sqitch->mock(verbosity => 2);
ok $mysql->run_verify('foo/bar.sql'), 'Verify foo/bar.sql again';
is_deeply \@run, [$mysql->mysql, '--execute', 'source foo/bar.sql'],
'Verify file should be passed to run() for high verbosity';
@run = ();
# Try with variables.
$mysql->set_variables(foo => 'bar', '"that"' => "'this'");
my $set = qq{SET \@"""that""" = '''this''', \@"foo" = 'bar';\n};
ok $mysql->run_file('foo/bar.sql'), 'Run foo/bar.sql with vars';
is_deeply \@run, [$mysql->mysql, '--execute', "${set}source foo/bar.sql"],
'Variabls and file should be passed to run()';
@run = ();
ok $mysql->run_handle('FH'), 'Spool a "file handle"';
ok $fh = shift @{ $spool[0] }, 'Get variables file handle';
is_deeply \@spool, [['FH'], $mysql->mysql],
'File handle should be passed to spool() after variables handle';
is join("\n", <$fh>), $set, 'Variables should have been escaped and set';
@spool = ();
ok $mysql->run_verify('foo/bar.sql'), 'Verbosely verify foo/bar.sql with vars';
is_deeply \@run, [$mysql->mysql, '--execute', "${set}source foo/bar.sql"],
'Variables and verify file should be passed to run()';
@run = ();
# Reset verbosity to send verify to spool.
$mock_sqitch->unmock('verbosity');
ok $mysql->run_verify('foo/bar.sql'), 'Verify foo/bar.sql with vars';
is_deeply \@capture, [$mysql->mysql, '--execute', "${set}source foo/bar.sql"],
'Verify file should be passed to capture()';
@capture = ();
$mysql->clear_variables;
$mock_sqitch->unmock_all;
##############################################################################
# Test DateTime formatting stuff.
can_ok $CLASS, '_ts2char_format';
is sprintf($CLASS->_ts2char_format, 'foo'),
q{date_format(foo, 'year:%Y:month:%m:day:%d:hour:%H:minute:%i:second:%S:time_zone:UTC')},
'_ts2char_format should work';
ok my $dtfunc = $CLASS->can('_dt'), "$CLASS->can('_dt')";
isa_ok my $dt = $dtfunc->(
'year:2012:month:07:day:05:hour:15:minute:07:second:01:time_zone:UTC'
), 'App::Sqitch::DateTime', 'Return value of _dt()';
is $dt->year, 2012, 'DateTime year should be set';
is $dt->month, 7, 'DateTime month should be set';
is $dt->day, 5, 'DateTime day should be set';
is $dt->hour, 15, 'DateTime hour should be set';
is $dt->minute, 7, 'DateTime minute should be set';
is $dt->second, 1, 'DateTime second should be set';
is $dt->time_zone->name, 'UTC', 'DateTime TZ should be set';
##############################################################################
# Test SQL helpers.
is $mysql->_listagg_format, q{GROUP_CONCAT(%1$s ORDER BY %1$s SEPARATOR ' ')},
'Should have _listagg_format';
is $mysql->_regex_op, 'REGEXP', 'Should have _regex_op';
is $mysql->_simple_from, '', 'Should have _simple_from';
is $mysql->_limit_default, '18446744073709551615', 'Should have _limit_default';
SECS: {
my $mock = Test::MockModule->new($CLASS);
my $dbh = {mariadb_serverinfo => 'foo', mariadb_serverversion => 50604};
$mock->mock(dbh => $dbh);
is $mysql->_ts_default, 'utc_timestamp(6)',
'Should have _ts_default with fractional seconds';
$dbh->{mariadb_serverversion} = 50101;
my $my51 = $CLASS->new(sqitch => $sqitch, target => $target);
is $my51->_ts_default, 'utc_timestamp',
'Should have _ts_default without fractional seconds on 5.1';
$dbh->{mariadb_serverversion} = 50304;
$dbh->{mariadb_serverinfo} = 'Something about MariaDB man';
my $maria = $CLASS->new(sqitch => $sqitch, target => $target);
is $maria->_ts_default, 'utc_timestamp',
( run in 3.012 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )