fix and clean up export test

This commit is contained in:
Graham Knop 2009-09-24 10:09:36 -05:00
parent c5ea4d0748
commit b6c1837756
2 changed files with 153 additions and 209 deletions

View file

@ -37,7 +37,7 @@ my $session = WebGUI::Test->session;
#----------------------------------------------------------------------------
# Tests
my $originalExportPath = $session->config->get('exportPath');
WebGUI::Test->originalConfig('exportPath');
my $testRan = 1;
@ -82,7 +82,7 @@ cmp_deeply(
# set the exportPath to a non-directory file and make sure that it explodes.
my $exportPathFile;
(undef, $exportPathFile) = tempfile('webguiXXXXX', UNLINK => 1);
(undef, $exportPathFile) = tempfile('webguiXXXXX', UNLINK => 1, TMPDIR => 1);
$config->set('exportPath', $exportPathFile);
eval { WebGUI::Asset->exportCheckPath($session) };
@ -100,7 +100,7 @@ cmp_deeply(
# *can't* write to it. exportCheckPath will try to create the exportPath if it's
# a subdirectory of a path that exists, so let's make sure this exception works.
my $tempDirectory = tempdir('webguiXXXXX', CLEANUP => 1);
my $tempDirectory = tempdir('webguiXXXXX', CLEANUP => 1, TMPDIR => 1);
my $inaccessibleDirectory = Path::Class::Dir->new($tempDirectory, 'unwritable');
SKIP: {
@ -165,61 +165,81 @@ is(-d $accessibleDirectory, 1, "exportCheckPath creating subdirectory actually c
#----------------------------------------------------------------------------
# exportCheckExportable()
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name=>"Asset Export Test"});
addToCleanup($versionTag);
my $importNode = WebGUI::Asset->getImportNode($session);
my $parent = $importNode->addChild({
className => 'WebGUI::Asset::Wobject::Layout',
styleTemplateId => 'PBtmpl0000000000000132',
url => 'parent',
});
my $firstChild = $parent->addChild({
className => 'WebGUI::Asset::Wobject::Layout',
styleTemplateId => 'PBtmpl0000000000000132',
url => 'first_child',
});
my $grandChild = $firstChild->addChild({
className => 'WebGUI::Asset::Wobject::Article',
styleTemplateId => 'PBtmpl0000000000000132',
url => 'first_child/grand_child',
});
$versionTag->commit;
my $isExportable;
# simple test first. the asset we're checking isn't exportable. should of course return 0.
my $home = WebGUI::Asset->newByUrl($session, '/home');
$home->update({ isExportable => 0 });
$isExportable = $home->exportCheckExportable;
$parent->update({ isExportable => 0 });
$isExportable = $parent->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable simple check without lineage for non-exportable asset returns 0");
# next, make the parent exportable, but the child not exportable. test that this returns 0 as well.
$home->update({ isExportable => 1 });
my $gettingStarted = WebGUI::Asset->newByUrl($session, '/getting_started');
$gettingStarted->update({ isExportable => 0 });
$isExportable = $gettingStarted->exportCheckExportable;
$parent->update({ isExportable => 1 });
$firstChild->update({ isExportable => 0 });
$isExportable = $firstChild->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable nonexportable asset, exportable parent returns 0");
# next, make both non-exportable. test that this returns 0.
$home->update({ isExportable => 0 });
$isExportable = $gettingStarted->exportCheckExportable;
$parent->update({ isExportable => 0 });
$isExportable = $firstChild->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable nonexportable asset, nonexportable parent returns 0");
# go another level deeper. asset, parent, grandparent.
my $grandChild = WebGUI::Asset->newByUrl($session, '/getting_started/getting-started');
# make it not exportable, but both parents are. still returning 0.
$grandChild->update({ isExportable => 0 });
$home->update({ isExportable => 1 });
$gettingStarted->update({ isExportable => 1 });
$parent->update({ isExportable => 1 });
$firstChild->update({ isExportable => 1 });
$isExportable = $grandChild->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable nonexportable asset, exportable parent and grandparent returns 0");
# make parent not exportable. still returning 0.
$gettingStarted->update({ isExportable => 0 });
$firstChild->update({ isExportable => 0 });
$isExportable = $grandChild->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable nonexportable asset, parent, exportable grandparent returns 0");
# switch: exportable parent, nonexportable grandparent. still 0.
$gettingStarted->update({ isExportable => 1 });
$home->update({ isExportable => 0 });
$firstChild->update({ isExportable => 1 });
$parent->update({ isExportable => 0 });
$isExportable = $grandChild->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable nonexportable asset, grandparent, exportable parent returns 0");
# none of asset, parent, grandparent are exportable. still 0.
$home->update({ isExportable => 0 });
$gettingStarted->update({ isExportable => 0 });
$parent->update({ isExportable => 0 });
$firstChild->update({ isExportable => 0 });
$isExportable = $grandChild->exportCheckExportable;
is($isExportable, 0, "exportCheckExportable nonexportable asset, grandparent, parent returns 0");
# finally, make everything exportable. make sure each one returns 1.
$home->update({ isExportable => 1 });
$gettingStarted->update({ isExportable => 1 });
$parent->update({ isExportable => 1 });
$firstChild->update({ isExportable => 1 });
$grandChild->update({ isExportable => 1 });
$isExportable = $home->exportCheckExportable;
$isExportable = $parent->exportCheckExportable;
is($isExportable, 1, "exportCheckExportable simple check without lineage for exportable asset returns 1");
$isExportable = $gettingStarted->exportCheckExportable;
$isExportable = $firstChild->exportCheckExportable;
is($isExportable, 1, "exportCheckExportable exportable asset, parent returns 1");
$isExportable = $grandChild->exportCheckExportable;
@ -233,27 +253,27 @@ my $exportPath = $config->get('exportPath');
my $litmus;
# start with something simple: export the root URL.
my $homeAsPath = $home->exportGetUrlAsPath('index.html');
$litmus = Path::Class::File->new($exportPath, $home->getUrl, 'index.html');
isa_ok($homeAsPath, 'Path::Class::File', 'exportGetUrlAsPath returns a Path::Class::File object');
is($homeAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath works for root directory");
my $parentAsPath = $parent->exportGetUrlAsPath('index.html');
$litmus = Path::Class::File->new($exportPath, $parent->getUrl, 'index.html');
isa_ok($parentAsPath, 'Path::Class::File', 'exportGetUrlAsPath returns a Path::Class::File object');
is($parentAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath works for root directory");
# make sure that 'index.html' is the default file name if none given.
$homeAsPath = $home->exportGetUrlAsPath();
$litmus = Path::Class::File->new($exportPath, $home->getUrl, 'index.html');
isa_ok($homeAsPath, 'Path::Class::File', 'exportGetUrlAsPath without index file returns a Path::Class::File object');
is($homeAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath without index file works for root directory");
$parentAsPath = $parent->exportGetUrlAsPath();
$litmus = Path::Class::File->new($exportPath, $parent->getUrl, 'index.html');
isa_ok($parentAsPath, 'Path::Class::File', 'exportGetUrlAsPath without index file returns a Path::Class::File object');
is($parentAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath without index file works for root directory");
# let's go down a level. add a directory.
my $gsAsPath = $gettingStarted->exportGetUrlAsPath('index.html');
$litmus = Path::Class::File->new($exportPath, $gettingStarted->getUrl, 'index.html');
isa_ok($gsAsPath, 'Path::Class::File', 'exportGetUrlAsPath for getting_started returns a Path::Class::File object');
is($gsAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath for getting_started works for root directory");
my $fcAsPath = $firstChild->exportGetUrlAsPath('index.html');
$litmus = Path::Class::File->new($exportPath, $firstChild->getUrl, 'index.html');
isa_ok($fcAsPath, 'Path::Class::File', 'exportGetUrlAsPath for first_child returns a Path::Class::File object');
is($fcAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath for first_child works for root directory");
# ensure 'index.html' works for a single directory.
$gsAsPath = $gettingStarted->exportGetUrlAsPath();
isa_ok($gsAsPath, 'Path::Class::File', 'exportGetUrlAsPath for getting_started without index file returns a Path::Class::File object');
is($gsAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath for getting_started without index file works for root directory");
$fcAsPath = $firstChild->exportGetUrlAsPath();
isa_ok($fcAsPath, 'Path::Class::File', 'exportGetUrlAsPath for first_child without index file returns a Path::Class::File object');
is($fcAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)->stringify, "exportGetUrlAsPath for first_child without index file works for root directory");
# down another level.
my $gcAsPath = $grandChild->exportGetUrlAsPath('index.html');
@ -273,8 +293,6 @@ WebGUI::Test->storagesToDelete($storage->getId);
my $filename = 'somePerlFile_pl.txt';
$storage->addFileFromScalar($filename, $filename);
$session->user({userId=>3});
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name=>"Asset Export Test"});
my $properties = {
# '1234567890123456789012'
id => 'ExportTest000000000001',
@ -284,8 +302,12 @@ my $properties = {
storageId => $storage->getId,
filename => 'somePerlFile_pl.txt',
};
my $defaultAsset = WebGUI::Asset->getDefault($session);
my $asset = $defaultAsset->addChild($properties, $properties->{id});
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name=>"Asset Export Test"});
addToCleanup($versionTag);
my $asset = $importNode->addChild($properties, $properties->{id});
$asset->update({
storageId => $storage->getId,
filename => $filename,
@ -309,11 +331,12 @@ $properties = {
className => 'WebGUI::Asset::File',
url => 'export-test.foobar',
};
$asset = $defaultAsset->addChild($properties, $properties->{id});
$asset = $importNode->addChild($properties, $properties->{id});
$asset->update({
storageId => $storage->getId,
filename => $filename,
});
$versionTag->commit;
$fileAsPath = $asset->exportGetUrlAsPath('index.html');
# not recognised by apache, so it'll add an index.html, make sure it does so
@ -346,22 +369,22 @@ is($fileAsPath->absolute($exportPath)->stringify, $litmus->absolute($exportPath)
# we need to be tricky here and call code in wG proper which calls www_ methods
# even though we don't have access to modperl. the following hack lets us do
# that.
$session->http->setNoHeader(1);
#$session->http->setNoHeader(1);
$session->user( { userId => 1 } );
my $content;
my $guid = $session->id->generate;
my $guidPath = Path::Class::Dir->new($config->get('uploadsPath'), 'temp', $guid);
$config->set('exportPath', $guidPath->absolute->stringify);
eval { $home->exportWriteFile() };
eval { $parent->exportWriteFile() };
is($@, '', "exportWriteFile works when creating exportPath");
# ensure that the file was actually written
ok(-e $home->exportGetUrlAsPath->absolute->stringify, "exportWriteFile actually writes the file when creating exportPath");
ok(-e $parent->exportGetUrlAsPath->absolute->stringify, "exportWriteFile actually writes the file when creating exportPath");
# now make sure that it contains the correct content
eval { $content = WebGUI::Test->getPage($home, 'exportHtml_view', { user => WebGUI::User->new($session, 1) } ) };
is(scalar $home->exportGetUrlAsPath->absolute->slurp, $content, "exportWriteFile puts the correct contents in exported home");
eval { $content = WebGUI::Test->getPage($parent, 'exportHtml_view', { user => WebGUI::User->new($session, 1) } ) };
is(scalar $parent->exportGetUrlAsPath->slurp, $content, "exportWriteFile puts the correct contents in exported parent");
# now that we know that creating the export directory works, let's make sure
@ -377,7 +400,7 @@ $session->http->setNoHeader(1);
SKIP: {
skip 'Root will cause this test to fail since it does not obey file permissions', 2
if $< == 0;
eval { $home->exportWriteFile() };
eval { $parent->exportWriteFile() };
$e = Exception::Class->caught();
isa_ok($e, 'WebGUI::Error', "exportWriteFile throws if it can't create the export path");
cmp_deeply(
@ -390,11 +413,11 @@ SKIP: {
}
# the exception was thrown, but make sure that the file also wasn't written
# can't call exportGetUrlAsPath on $home right now, since the path is
# can't call exportGetUrlAsPath on $parent right now, since the path is
# inaccessible and exportGetUrlAsPath calls exportCheckPath which throws an
# exception. therefore, specify this single specific case specifically for the
# sake of the test.
ok(!-e Path::Class::File->new($unwritablePath, 'home', 'index.html')->absolute->stringify, "exportWriteFile does not write the file when it can't create the exportPath");
ok(!-e Path::Class::File->new($unwritablePath, 'parent', 'index.html')->absolute->stringify, "exportWriteFile does not write the file when it can't create the exportPath");
# let's go a level deeper
# but reset the exportPath first
@ -405,15 +428,15 @@ chmod 0755, $guidPath->stringify;
$unwritablePath->remove;
$session->http->setNoHeader(1);
eval { $gettingStarted->exportWriteFile() };
is($@, '', "exportWriteFile works for getting_started");
eval { $firstChild->exportWriteFile() };
is($@, '', "exportWriteFile works for first_child");
# ensure that the file was actually written
ok(-e $gettingStarted->exportGetUrlAsPath->absolute->stringify, "exportWriteFile actually writes the getting_started file");
ok(-e $firstChild->exportGetUrlAsPath->absolute->stringify, "exportWriteFile actually writes the first_child file");
# verify it has the correct contents
eval { $content = WebGUI::Test->getPage($gettingStarted, 'exportHtml_view') };
is(scalar $gettingStarted->exportGetUrlAsPath->absolute->slurp, $content, "exportWriteFile puts the correct contents in exported getting_started");
eval { $content = WebGUI::Test->getPage($firstChild, 'exportHtml_view') };
is(scalar $firstChild->exportGetUrlAsPath->absolute->slurp, $content, "exportWriteFile puts the correct contents in exported first_child");
# and one more level. remove the export path to ensure directory creation keeps
# working.
@ -455,26 +478,26 @@ $guidPath->rmtree;
# nothing actually in a stock WebGUI installation that any particular user
# isn't allowed to see. this means that we'll need to temporarily change the
# permissions on something.
$home->update( { groupIdView => 3 } ); # admins
$parent->update( { groupIdView => 3 } ); # admins
$session->http->setNoHeader(1);
eval { $home->exportWriteFile() };
eval { $parent->exportWriteFile() };
$e = Exception::Class->caught();
isa_ok($e, 'WebGUI::Error', "exportWriteFile throws when user can't view asset");
cmp_deeply(
$e,
methods(
error => "user can't view asset at " . $home->getUrl . " to export it",
error => "user can't view asset at " . $parent->getUrl . " to export it",
),
"exportWriteFile throws when user can't view asset"
);
# now that we're sure that it throws the correct exception, make sure there's
# no directory or file written
ok(!-e $home->exportGetUrlAsPath->absolute->stringify, "exportWriteFile doesn't write file when user can't view asset");
ok(!-e $home->exportGetUrlAsPath->absolute->parent, "exportWriteFile doesn't write directory when user can't view asset");
ok(!-e $parent->exportGetUrlAsPath->absolute->stringify, "exportWriteFile doesn't write file when user can't view asset");
ok(!-e $parent->exportGetUrlAsPath->absolute->parent, "exportWriteFile doesn't write directory when user can't view asset");
# undo our viewing changes
$home->update( { groupIdView => 7 } ); # everyone
$parent->update( { groupIdView => 7 } ); # everyone
$guidPath->rmtree;
#----------------------------------------------------------------------------
@ -588,21 +611,21 @@ cmp_deeply(
# it breaks when it's supposed to, so let's make sure it works when it's
# supposed to. first, leave out the index parameter to ensure it sets up the
# default correctly.
$home->exportWriteFile;
$parent->exportWriteFile;
my $symlinkedRoot = Path::Class::File->new($exportPath, 'index.html');
my $homePath = $home->exportGetUrlAsPath;
eval { WebGUI::Asset->exportSymlinkRoot($session, $home, '') };
my $parentPath = $parent->exportGetUrlAsPath;
eval { WebGUI::Asset->exportSymlinkRoot($session, $parent, '') };
is($@, '', 'exportSymlinkRoot works when it should');
ok(-e $symlinkedRoot->stringify, 'exportSymlinkRoot sets up link correctly and supplies default index');
is(readlink $symlinkedRoot->stringify, $homePath, 'exportSymlinkRoot sets up link correctly and supplies default index');
is(readlink $symlinkedRoot->stringify, $parentPath, 'exportSymlinkRoot sets up link correctly and supplies default index');
unlink $symlinkedRoot->stringify;
# give it an index and ensure it works
eval { WebGUI::Asset->exportSymlinkRoot($session, $home, 'index.html') };
eval { WebGUI::Asset->exportSymlinkRoot($session, $parent, 'index.html') };
is($@, '', 'exportSymlinkRoot works when it should');
ok(-e $symlinkedRoot->stringify, 'exportSymlinkRoot sets up link correctly and supplies default index');
is(readlink $symlinkedRoot->stringify, $homePath, 'exportSymlinkRoot sets up link correctly and supplies default index');
is(readlink $symlinkedRoot->stringify, $parentPath, 'exportSymlinkRoot sets up link correctly and supplies default index');
unlink $symlinkedRoot->stringify;
@ -618,23 +641,23 @@ $asset->purge;
$session->user( { userId => 1 } );
my $descendants;
# next, make sure that we get the right list of assets to export.
my $homeDescendants = $home->getLineage( ['self', 'descendants'], {
endingLineageLength => $home->getLineageLength + 99,
my $parentDescendants = $parent->getLineage( ['self', 'descendants'], {
endingLineageLength => $parent->getLineageLength + 99,
orderByClause => 'assetData.url DESC',
}
);
$descendants = $home->exportGetDescendants( WebGUI::User->new($session, 1), 99 );
$descendants = $parent->exportGetDescendants( WebGUI::User->new($session, 1), 99 );
cmp_deeply($descendants, $homeDescendants, "exportGetDescendants returns correct data for home");
cmp_deeply($descendants, $parentDescendants, "exportGetDescendants returns correct data for parent");
my $gsDescendants = $gettingStarted->getLineage( ['self', 'descendants'], {
endingLineageLength => $gettingStarted->getLineageLength + 99,
my $fcDescendants = $firstChild->getLineage( ['self', 'descendants'], {
endingLineageLength => $firstChild->getLineageLength + 99,
orderByClause => 'assetData.url DESC',
}
);
$descendants = $gettingStarted->exportGetDescendants( WebGUI::User->new($session, 1), 99 );
$descendants = $firstChild->exportGetDescendants( WebGUI::User->new($session, 1), 99 );
cmp_deeply($descendants, $gsDescendants, "exportGetDescendants returns correct data for getting-started");
cmp_deeply($descendants, $fcDescendants, "exportGetDescendants returns correct data for first_child");
my $gcDescendants = $grandChild->getLineage( ['self', 'descendants'], {
endingLineageLength => $grandChild->getLineageLength + 99,
@ -643,9 +666,9 @@ my $gcDescendants = $grandChild->getLineage( ['self', 'descendants'], {
);
$descendants = $grandChild->exportGetDescendants( WebGUI::User->new($session, 1), 99 );
cmp_deeply($descendants, $gcDescendants, "exportGetDescendants returns correct data for getting-started");
cmp_deeply($descendants, $gcDescendants, "exportGetDescendants returns correct data for grand_child");
eval { $home->exportGetDescendants };
eval { $parent->exportGetDescendants };
$e = Exception::Class->caught;
isa_ok($e, 'WebGUI::Error::InvalidParam', 'exportGetDescendants called without a depth throws');
cmp_deeply(
@ -681,80 +704,52 @@ $exportPath = Path::Class::Dir->new($session->config->get('exportPath'));
# default. exportAsHtml is supposed to catch exceptions, not throw them, so
# we'll be testing the return values rather than for an exception.
eval { $message = $home->exportAsHtml };
eval { $message = $parent->exportAsHtml };
is($@, "need a userId parameter", "exportAsHtml returns correct error when not given a userId");
# omitting the userId works, so let's give it a bogus userId
eval { $message = $home->exportAsHtml( { userId => '<rizen> perlDreamer is a 500 lb test mandating gorilla' } ) };
eval { $message = $parent->exportAsHtml( { userId => '<rizen> perlDreamer is a 500 lb test mandating gorilla' } ) };
is($@, "'<rizen> perlDreamer is a 500 lb test mandating gorilla' is not a valid userId", "exportAsHtml throws correct error when given a bogus (but nonetheless funny) userId");
# checking an autogenerated userId
my $randomUser = WebGUI::User->new($session, 'new');
eval { $message = $home->exportAsHtml( { userId => $randomUser->userId, depth => 99} ) };
eval { $message = $parent->exportAsHtml( { userId => $randomUser->userId, depth => 99} ) };
is($@, '', "exportAsHtml doesn't throw error when given a valid userId");
$randomUser->delete;
undef $randomUser;
# checking userId works, so check extrasUploadAction next.
eval { $message = $home->exportAsHtml( { userId => 3, depth => 99, extrasUploadAction => 'o hai' } ) };
eval { $message = $parent->exportAsHtml( { userId => 3, depth => 99, extrasUploadAction => 'o hai' } ) };
is($@, "'o hai' is not a valid extrasUploadAction", "exportAsHtml throws correct error when given bogus, memetic extrasUploadAction parameter");
# rootUrlAction
eval { $message = $home->exportAsHtml( { userId => 3, depth => 99, rootUrlAction => 'NO U' } ) };
eval { $message = $parent->exportAsHtml( { userId => 3, depth => 99, rootUrlAction => 'NO U' } ) };
is($@, "'NO U' is not a valid rootUrlAction", "exportAsHtml throws correct error when given bogus, memetic extrasUploadAction parameter");
# finally, depth
eval { $message = $home->exportAsHtml( { userId => 3 } ) };
eval { $message = $parent->exportAsHtml( { userId => 3 } ) };
is($@, "need a depth", "exportAsHtml throws correct error when not given a depth");
eval { $message = $home->exportAsHtml( { userId => 3, depth => 'orly? yarly!' } ) };
eval { $message = $parent->exportAsHtml( { userId => 3, depth => 'orly? yarly!' } ) };
is($@, "orly? yarly! is not a valid depth", "exportAsHtml throws correct error when given bogus, memetic depth");
# next, let's make sure some simple exports work. export 'home', but clean up
# next, let's make sure some simple exports work. export 'parent', but clean up
# the exportPath first to make sure there are no residuals from the tests
# above.
$exportPath->rmtree;
eval { $message = $home->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
is($@, '', "exportAsHtml on home does not throw an error"); ##Note, string comparison
eval { $message = $parent->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
is($@, '', "exportAsHtml on parent does not throw an error"); ##Note, string comparison
# list of files that should exist. obtained by running previous known working
# export function on a full stock asset tree
@createdFiles = (
[ qw/ getting_started getting-started index.html /],
[ qw/ getting_started getting-started-part2 index.html /],
[ qw/ getting_started index.html /],
[ qw/ home ad index.html /],
[ qw/ home ad2 index.html /],
[ qw/ home index.html /],
[ qw/ home key-benefits index.html /],
[ qw/ home welcome index.html /],
[ qw/ site_map index.html /],
[ qw/ site_map site_map index.html /],
[ qw/ tell_a_friend index.html /],
[ qw/ tell_a_friend tell_a_friend index.html /],
[ qw/ the_latest_news index.html /],
[ qw/ the_latest_news the_latest_news index.html /],
[ qw/ yns docs index.html /],
[ qw/ yns experts index.html /],
[ qw/ yns features index.html /],
[ qw/ yns hosting index.html /],
[ qw/ yns promotion index.html /],
[ qw/ yns style index.html /],
[ qw/ yns support index.html /],
[ qw/ yns translated index.html /],
[ qw/ your_next_step index.html /],
[ qw/ documentation index.html /],
[ qw/ documentation commercial-documentation index.html /],
[ qw/ documentation free-documentation index.html /],
[ qw/ first_child grand_child index.html /],
[ qw/ first_child index.html /],
[ qw/ parent index.html /],
);
my $numberCreatedAll = scalar @createdFiles;
like($message, qr/Exported $numberCreatedAll pages/, "exportAsHtml on home returns correct message");
push @createdFiles,
[ qw/ the_latest_news the_latest_news.atom /],
[ qw/ the_latest_news the_latest_news.rss /],
[ qw/ the_latest_news the_latest_news.rdf /],
;
like($message, qr/Exported $numberCreatedAll pages/, "exportAsHtml on parent returns correct message");
# turn them into Path::Class::File objects
@shouldExist = map { Path::Class::File->new($exportPath, @{$_})->absolute->stringify } @createdFiles;
@ -762,26 +757,24 @@ push @createdFiles,
# ensure that the files that should exist do exist
my @doExist;
$exportPath->recurse( callback => sub { my $o = shift; $o->is_dir ? return : push @doExist, $o->absolute->stringify } );
cmp_bag(\@doExist, \@shouldExist, "exportAsHtml on home writes correct files");
cmp_bag(\@doExist, \@shouldExist, "exportAsHtml on parent writes correct files");
$exportPath->rmtree;
@doExist = ();
# previous tests ensure that the contents of the exported files are right. so
# let's go a level deeper and ensure that the right files are present.
eval { ($message) = $gettingStarted->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
eval { ($message) = $firstChild->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
@createdFiles = (
[ qw/ getting_started getting-started index.html /],
[ qw/ getting_started getting-started-part2 index.html /],
[ qw/ getting_started index.html /],
[ qw/ home ad2 index.html /], # I have no idea why but ad2 is a descendant of getting-started
[ qw/ first_child grand_child index.html /],
[ qw/ first_child index.html /],
);
@shouldExist = map { Path::Class::File->new($exportPath, @{$_})->absolute->stringify } @createdFiles;
$exportPath->recurse( callback => sub { my $o = shift; $o->is_dir ? return : push @doExist, $o->absolute->stringify } );
is($@, '', 'exportAsHtml on getting-started page does not throw an exception');
is($@, '', 'exportAsHtml on first_child page does not throw an exception');
cmp_bag(\@doExist, \@shouldExist, "... writes correct files");
like($message, qr/Exported 4 pages/, "... returns correct message");
like($message, qr/Exported 2 pages/, "... returns correct message");
$exportPath->rmtree;
@doExist = ();
@ -789,7 +782,7 @@ $exportPath->rmtree;
# test the grandchild.
eval { ($message) = $grandChild->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
@createdFiles = (
[ qw/ getting_started getting-started index.html /],
[ qw/ first_child grand_child index.html /],
);
@shouldExist = map { Path::Class::File->new($exportPath, @{$_})->absolute->stringify } @createdFiles;
@ -804,16 +797,16 @@ $exportPath->rmtree;
# fiddle with the isExportable setting and make sure appropriate files are
# written
$home->update({ isExportable => 0 });
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
$parent->update({ isExportable => 0 });
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
@shouldExist = ();
is($@, '', 'exportAsHtml on nonexportable home does not throw an exception');
is($@, '', 'exportAsHtml on nonexportable parent does not throw an exception');
is(@shouldExist, @doExist, "... doesn't write anything");
like($message, qr/Exported 0 pages/, "... returns correct message");
# restore the original setting
$home->update({ isExportable => 1 });
$parent->update({ isExportable => 1 });
# go a level deeper
@ -821,53 +814,26 @@ $home->update({ isExportable => 1 });
$exportPath->rmtree;
@doExist = ();
$gettingStarted->update({ isExportable => 0 });
$firstChild->update({ isExportable => 0 });
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99, quiet => 1 } ) };
# since getting-started isn't exportable, it shouldn't be written. remove it
# since first_child isn't exportable, it shouldn't be written. remove it
# and its descendants from the list.
@createdFiles = (
[ qw/ home ad index.html /],
#[ qw/ home ad2 index.html /], # I have no idea why but ad2 is a descendant of getting-started
[ qw/ home index.html /],
[ qw/ home key-benefits index.html /],
[ qw/ home welcome index.html /],
[ qw/ site_map index.html /],
[ qw/ site_map site_map index.html /],
[ qw/ tell_a_friend index.html /],
[ qw/ tell_a_friend tell_a_friend index.html /],
[ qw/ the_latest_news index.html /],
[ qw/ the_latest_news the_latest_news index.html /],
[ qw/ yns docs index.html /],
[ qw/ yns experts index.html /],
[ qw/ yns features index.html /],
[ qw/ yns hosting index.html /],
[ qw/ yns promotion index.html /],
[ qw/ yns style index.html /],
[ qw/ yns support index.html /],
[ qw/ yns translated index.html /],
[ qw/ your_next_step index.html /],
[ qw/ documentation index.html /],
[ qw/ documentation commercial-documentation index.html /],
[ qw/ documentation free-documentation index.html /],
[ qw/ parent index.html /],
);
my $numberCreated = scalar @createdFiles;
push @createdFiles,
[ qw/ the_latest_news the_latest_news.atom /],
[ qw/ the_latest_news the_latest_news.rss /],
[ qw/ the_latest_news the_latest_news.rdf /],
;
@shouldExist = map { Path::Class::File->new($exportPath, @{$_})->absolute->stringify } @createdFiles;
$exportPath->recurse( callback => sub { my $o = shift; $o->is_dir ? return : push @doExist, $o->absolute->stringify } );
is($@, '', 'exportAsHtml on home with non-exportable getting-started writes correct files');
is($@, '', 'exportAsHtml on parent with non-exportable first_child writes correct files');
cmp_bag(\@doExist, \@shouldExist, "... writes correct files");
like($message, qr/Exported $numberCreated pages/, "... returns correct message");
# restore the original setting
$gettingStarted->update({ isExportable => 1 });
$firstChild->update({ isExportable => 1 });
$exportPath->rmtree;
@doExist = ();
@ -902,7 +868,7 @@ $exportPath->rmtree;
$config->delete('exportPath');
# undefined exportPath
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99 } ) };
is($@, 'exportPath must be defined and not ""', "exportAsHtml catches undefined exportPath exception");
SKIP: {
@ -913,14 +879,14 @@ SKIP: {
chmod 0000, $tempDirectory;
$config->set('exportPath', $inaccessibleDirectory->stringify);
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99 } ) };
is($@, "can't create exportPath " . $inaccessibleDirectory->stringify, "exportAsHtml catches inaccessible exportPath ");
}
# exportPath is a file, not a directory
$config->set('exportPath', $exportPathFile);
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99 } ) };
is($@, "$exportPathFile isn't a directory", "exportAsHtml catches exportPath is file exception");
$config->set('exportPath', $inaccessibleDirectory->stringify);
@ -931,20 +897,20 @@ SKIP: {
# can't create export path
chmod 0000, $tempDirectory;
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99 } ) };
is($@, "can't create exportPath $inaccessibleDirectory", "exportAsHtml catches uncreatable exportPath exception");
}
# user can't view asset
$home->update( { groupIdView => 3 } );
$parent->update( { groupIdView => 3 } );
$session->http->setNoHeader(1);
chmod 0755, $tempDirectory;
eval { ($message) = $home->exportAsHtml( { userId => 1, depth => 99 } ) };
is($@, "can't view asset at URL /home", "exportAsHtml catches unviewable asset exception");
eval { ($message) = $parent->exportAsHtml( { userId => 1, depth => 99 } ) };
is($@, "can't view asset at URL /parent", "exportAsHtml catches unviewable asset exception");
# fix viewing the asset
$home->update( { groupIdView => 7 } );
$parent->update( { groupIdView => 7 } );
# the "can't write file" exceptions for exportWriteFile are largely related to
# the exportPath being broken somehow. That's already been tested. next, let's
@ -961,7 +927,7 @@ $uploadsUrl = $config->get('uploadsURL');
$exportPath->rmtree;
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99, extrasUploadAction => 'symlink', quiet => 1 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99, extrasUploadAction => 'symlink', quiet => 1 } ) };
is($@, '', "exportAsHtml when linking extras and uploads does not throw an exception");
like($message, qr/Exported $numberCreatedAll pages/, "... returns correct message");
@ -970,38 +936,16 @@ $extrasSymlink = Path::Class::File->new($exportPath, $extrasUrl);
$uploadsSymlink = Path::Class::File->new($exportPath, $uploadsUrl);
ok(-e $extrasSymlink->absolute->stringify, "exportAsHtml writes extras symlink");
is($extrasPath, readlink $extrasSymlink->absolute->stringify, "exportAsHtml extras symlink points to right place");
is(readlink $extrasSymlink->absolute->stringify, $extrasPath, "exportAsHtml extras symlink points to right place");
ok(-e $uploadsSymlink->absolute->stringify, "exportAsHtml writes uploads symlink");
is($uploadsPath, readlink $uploadsSymlink->absolute->stringify, "exportAsHtml uploads symlink points to right place");
is(readlink $uploadsSymlink->absolute->stringify, $uploadsPath, "exportAsHtml uploads symlink points to right place");
# next, make sure the root URL symlinking works.
eval { ($message) = $home->exportAsHtml( { userId => 3, depth => 99, rootUrlAction => 'symlink', quiet => 1 } ) };
eval { ($message) = $parent->exportAsHtml( { userId => 3, depth => 99, rootUrlAction => 'symlink', quiet => 1 } ) };
my $rootUrlSymlink = Path::Class::File->new($exportPath, 'index.html');
is($@, '', 'exportAsHtml does not throw an error when linking root URL');
like($message, qr/Exported $numberCreatedAll pages/, "... returns correct message");
ok(-e $rootUrlSymlink->absolute->stringify, "... writes root URL symlink");
is($home->exportGetUrlAsPath->absolute->stringify, readlink $rootUrlSymlink->absolute->stringify, "... root URL symlink points to right place");
ok(-l $rootUrlSymlink->absolute->stringify, "... writes root URL symlink");
is(readlink $rootUrlSymlink->absolute->stringify, WebGUI::Asset->getDefault($session)->exportGetUrlAsPath->absolute->stringify, "... root URL symlink points to right place");
#----------------------------------------------------------------------------
# Cleanup
END {
# remove $tempDirectory since it now exists in the filesystem
rmtree($tempDirectory);
# restore the original exportPath setting, now that we're done testing
# exportCheckPath.
$session->config->set('exportPath', $originalExportPath);
# we created a couple of assets; roll them back so they don't stick around
$versionTag->rollback();
# make sure people can view /home
$home->update( { groupIdView => 7 } ); # everyone
# delete test user
if ($randomUser and ref $randomUser eq 'WebGUI::User') {
$randomUser->delete;
}
}

View file

@ -400,7 +400,8 @@ sub getPage {
my $oldRequest = $session->request;
my $request = WebGUI::PseudoRequest->new;
$request->setup_param($optionsRef->{formParams});
$session->{_request} = $request;
local $session->{_request} = $request;
local $session->output->{_handle};
# Fill the buffer
my $returnedContent;
@ -413,7 +414,7 @@ sub getPage {
else {
# Try using it as a subroutine
no strict 'refs';
$returnedContent = $actor->(@{$optionsRef->{args}});
$returnedContent = $actor->(@{$optionsRef->{args}});
}
if ($returnedContent && $returnedContent ne "chunked") {
@ -422,10 +423,9 @@ sub getPage {
# Restore the former user and request
$session->user({ user => $oldUser });
$session->{_request} = $oldRequest;
# Return the page's output
my $return = $request->get_output;
return $request->get_output;
}
#----------------------------------------------------------------------------