use strict; use warnings; no warnings 'redefine'; use strict; use WebGUI::Test import => [qw(collateral addToCleanup)]; use Test::More; use Test::MockObject; use Test::MockObject::Extends; use File::Temp; use File::Path qw(make_path); use File::Basename qw(basename); use WebGUI::Paths; use WebGUI::Upgrade; use WebGUI::Session::Id; use WebGUI::VersionTag; use Try::Tiny; use Capture::Tiny qw(capture); local *WebGUI::Paths::siteConfigs; local *WebGUI::Paths::upgrades; our $configFile = WebGUI::Test->config->pathToFile; { no warnings 'redefine'; *WebGUI::Paths::siteConfigs = sub { $configFile }; } my $upgrade = Test::MockObject::Extends->new( WebGUI::Upgrade->new( createBackups => 0, useMaintenanceMode => 0, ), ); $upgrade->set_always('getCurrentVersion', '8.0.0'); $upgrade->set_always('getCodeVersion', '8.4.3'); $upgrade->set_true('markVersionUpgrade'); { no warnings 'redefine'; *WebGUI::Paths::upgrades = sub { collateral('Upgrade', 'non-existant') } ; } ok ! try { $upgrade->calcUpgradePath('8.0.0', '8.4.3'); 1 }, "calcUpgradePath dies when upgrades path doesn't exist"; { no warnings 'redefine'; *WebGUI::Paths::upgrades = sub { collateral('Upgrade', 'impossible') } ; } ok ! try { $upgrade->calcUpgradePath('8.0.0', '8.4.3'); 1 }, 'calcUpgradePath dies when unable to find a path'; { no warnings 'redefine'; *WebGUI::Paths::upgrades = sub { collateral('Upgrade', 'backtrack') } ; } is_deeply [ $upgrade->calcUpgradePath('8.0.0', '8.4.3') ], [qw( 8.0.0-8.1.0 8.1.0-8.2.0 8.2.0-8.3.0 8.3.0-8.4.3 )], 'calcUpgradePath finds correct path with backtracking'; { no warnings 'redefine'; *WebGUI::Paths::upgrades = sub { collateral('Upgrade', 'valid') } ; } $upgrade->set_true('runUpgradeFile'); capture { my $res = $upgrade->upgradeSites; ok $res, 'upgradeSites runs'; }; $upgrade->called_ok('getCurrentVersion', '... and checked current version'); $upgrade->called_ok('getCodeVersion', '... and checked code version'); SKIP: { $upgrade->called_ok('runUpgradeFile', '... and checked code version') or skip 'upgrade file not run', 1; while ( my ($name, $args) = $upgrade->next_call ) { if ($name eq 'runUpgradeFile') { my $upgradeFile = $args->[3] && basename($args->[3]); is $upgradeFile, '00_simple.pl', '... correct upgrade file'; } } } $upgrade->clear; $upgrade->unmock('runUpgradeFile'); $upgrade->mock(testUpgrade => sub { my $self = shift; my $file = shift; $self->runUpgradeFile($configFile, '8.3.0', collateral('Upgrade', $file), @_); }); { my $stdout = capture { eval { $upgrade->testUpgrade('output.pl'); } }; ok $stdout =~ 'Simple Output', 'report command functions correctly'; ok $stdout =~ 'Done', 'done command functions correctly'; } { $upgrade->quiet(1); my $stdout = capture { eval { $upgrade->testUpgrade('output.pl') } }; ok $stdout !~ 'Simple Output', 'quiet flag silences report command'; ok $stdout !~ 'Done', 'quiet flag silences done command'; } ok !try { $upgrade->testUpgrade('die.pl'); 1 }, 'Error on failing upgrade'; ok !try { $upgrade->testUpgrade('strict-failure.pl'); 1 }, 'strict enabled in upgrades'; my $session = WebGUI::Test->session; my $dbh = $upgrade->dbhForConfig(WebGUI::Test->config); our $totalAssets = $dbh->selectrow_array('SELECT COUNT(*) FROM asset'); $upgrade->testUpgrade('dbh.pl'); $upgrade->testUpgrade('config.pl'); { my $sId = $upgrade->testUpgrade('session.pl'); ok +WebGUI::Session::Id->valid($sId), 'valid session id generated'; my $hasSession = $dbh->selectrow_array('SELECT COUNT(*) FROM userSession WHERE sessionId = ?', {}, $sId); ok !$hasSession, 'session properly closed'; } $upgrade->testUpgrade('versiontag.pl'); $upgrade->testUpgrade('collateral.pl'); $upgrade->testUpgrade('package.pl'); { my $temp = File::Temp->newdir; local @INC = @INC; my @modules; for (1..2) { my $lib_dir = File::Spec->catdir($temp, 'lib' . $_); unshift @INC, $lib_dir; my $mod_dir = File::Spec->catdir($lib_dir, 'WebGUI', 'Upgrade', 'Test'); my $module = File::Spec->catfile($mod_dir, 'Module.pm'); push @modules, $module; make_path($mod_dir); open my $fh, '>', $module; print {$fh} <<'END_PM'; package WebGUI::Upgrade::Test::Module; 1; END_PM close $fh; } $upgrade->testUpgrade('rmlib.pl'); ok !(grep { -e } @modules), 'all libraries removed correctly'; } { my $package = $upgrade->testUpgrade('test-template.wgpkg'); isa_ok $package, 'WebGUI::Asset::Template'; my $vtId = $package->get('tagId'); my $vt = WebGUI::VersionTag->new($session, $vtId); WebGUI::Test->addToCleanup($vt); is $vt->get('name'), 'Upgrade to 8.3.0 - test-template', 'package import names version tag correctly'; } { my $stdout = capture { eval { $upgrade->testUpgrade('select.sql'); } }; my @lines = split /[\r\n]+/, $stdout; my $dateApplied = $lines[1]; my $dbdateApplied = $dbh->selectrow_array('SELECT dateApplied FROM webguiVersion ORDER BY dateApplied DESC LIMIT 1'); is $dateApplied, $dbdateApplied, 'SQL script run against database properly'; } done_testing;