App-Sqitch
view release on metacpan or search on metacpan
#
# export SQITCH_TEST_ORACLE_URI=db:oracle://sqitchtest:oracle@localhost/ORCL
# export SQITCH_TEST_ALT_ORACLE_REGISTRY=oe
# prove -lv t/oracle.t
use strict;
use warnings;
use 5.010;
use Test::More 0.94;
use Test::MockModule;
use Test::Exception;
use Locale::TextDomain qw(App-Sqitch);
use Capture::Tiny 0.12 qw(:all);
use Try::Tiny;
use App::Sqitch;
use App::Sqitch::Target;
use App::Sqitch::Plan;
use File::Temp 'tempdir';
use lib 't/lib';
use DBIEngineTest;
use TestConfig;
my $CLASS;
BEGIN {
$CLASS = 'App::Sqitch::Engine::oracle';
require_ok $CLASS or die;
delete $ENV{ORACLE_HOME};
}
is_deeply [$CLASS->config_vars], [
target => 'any',
registry => 'any',
client => 'any',
], 'config_vars should return three vars';
my $config = TestConfig->new('core.engine' => 'oracle');
my $sqitch = App::Sqitch->new(config => $config);
my $target = App::Sqitch::Target->new(sqitch => $sqitch);
isa_ok my $ora = $CLASS->new(sqitch => $sqitch, target => $target), $CLASS;
is $ora->key, 'oracle', 'Key should be "oracle"';
is $ora->name, 'Oracle', 'Name should be "Oracle"';
my $client = 'sqlplus' . (App::Sqitch::ISWIN ? '.exe' : '');
is $ora->client, $client, 'client should default to sqlplus';
ORACLE_HOME: {
my $iswin = App::Sqitch::ISWIN || $^O eq 'cygwin';
my $cli = 'sqlplus' . ($iswin ? '.exe' : '');
# Start with no ORACLE_HOME.
my $target = App::Sqitch::Target->new(sqitch => $sqitch);
isa_ok my $ora = $CLASS->new(sqitch => $sqitch, target => $target), $CLASS;
is $ora->client, $cli, 'client should default to sqlplus';
# Put client in ORACLE_HOME.
my $tmpdir = tempdir(CLEANUP => 1);
my $tmp = Path::Class::Dir->new("$tmpdir");
my $sqlplus = $tmp->file($cli);
$sqlplus->touch;
chmod 0755, $sqlplus unless $iswin;
local $ENV{ORACLE_HOME} = "$tmpdir";
$target = App::Sqitch::Target->new(sqitch => $sqitch);
isa_ok $ora = $CLASS->new(sqitch => $sqitch, target => $target), $CLASS;
is $ora->client, $sqlplus, 'client should use $ORACLE_HOME';
# ORACLE_HOME/bin takes precedence.
my $bin = Path::Class::Dir->new("$tmpdir", 'bin');
$bin->mkpath;
$sqlplus = $bin->file($cli);
$sqlplus->touch;
chmod 0755, $sqlplus unless $iswin;
$target = App::Sqitch::Target->new(sqitch => $sqitch);
isa_ok $ora = $CLASS->new(sqitch => $sqitch, target => $target), $CLASS;
is $ora->client, $sqlplus, 'client should use $ORACLE_HOME/bin';
}
is $ora->registry, '', 'registry default should be empty';
is $ora->uri, 'db:oracle:', 'Default URI should be "db:oracle"';
my $dest_uri = $ora->uri->clone;
$dest_uri->dbname(
$ENV{TWO_TASK}
|| (App::Sqitch::ISWIN ? $ENV{LOCAL} : undef)
|| $ENV{ORACLE_SID}
);
is $ora->target->name, $ora->uri, 'Target name should be the uri stringified';
is $ora->destination, $dest_uri->as_string,
'Destination should fall back on environment variables';
is $ora->registry_destination, $ora->destination,
'Registry target should be the same as target';
my @std_opts = qw(-S -L /nolog);
is_deeply [$ora->sqlplus], [$client, @std_opts],
'sqlplus command should connect to /nolog';
is $ora->_script, join( "\n" => (
'SET ECHO OFF NEWP 0 SPA 0 PAGES 0 FEED OFF HEAD OFF TRIMS ON TAB OFF VERIFY OFF',
'WHENEVER OSERROR EXIT 9;',
'WHENEVER SQLERROR EXIT 4;',
'connect ',
$ora->_registry_variable,
) ), '_script should work';
# Set up a target URI.
$target = App::Sqitch::Target->new(
sqitch => $sqitch,
uri => URI::db->new('db:oracle://fred:derf@/blah')
);
isa_ok $ora = $CLASS->new(
sqitch => $sqitch,
target => $target,
), $CLASS;
is $ora->_script, join( "\n" => (
'SET ECHO OFF NEWP 0 SPA 0 PAGES 0 FEED OFF HEAD OFF TRIMS ON TAB OFF VERIFY OFF',
'WHENEVER OSERROR EXIT 9;',
'WHENEVER SQLERROR EXIT 4;',
'connect fred/"derf"@"blah"',
$ora->_registry_variable,
) ), '_script should assemble connection string';
# Add a host name.
$target = App::Sqitch::Target->new(
sqitch => $sqitch,
uri => URI::db->new('db:oracle://fred:derf@there/blah')
);
isa_ok $ora = $CLASS->new(
sqitch => $sqitch,
target => $target,
), $CLASS;
( run in 0.840 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )