mirror of
https://github.com/silverstripe/silverstripe-docsviewer
synced 2024-10-22 09:05:56 +00:00
This major update changes the behaviour of the docviewer module to use a cached manifest rather than on demand. This allows us to simplify the URL matching and store 'nice' URL configuration rather than altering handleAction().
269 lines
11 KiB
PHP
Executable File
269 lines
11 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* Some of these tests are simply checking that pages load. They should not assume
|
|
* somethings working.
|
|
*
|
|
* @package docsviewer
|
|
* @subpackage tests
|
|
*/
|
|
|
|
class DocumentationViewerTest extends FunctionalTest {
|
|
|
|
protected $autoFollowRedirection = false;
|
|
|
|
public function setUpOnce() {
|
|
parent::setUpOnce();
|
|
|
|
$this->origEnabled = DocumentationService::automatic_registration_enabled();
|
|
DocumentationService::set_automatic_registration(false);
|
|
$this->origModules = DocumentationService::get_registered_entities();
|
|
|
|
$this->origLinkBase = Config::inst()->get('DocumentationViewer', 'link_base');
|
|
Config::inst()->update('DocumentationViewer', 'link_base', 'dev/docs/');
|
|
|
|
foreach($this->origModules as $module) {
|
|
DocumentationService::unregister($module->getFolder());
|
|
}
|
|
|
|
// We set 3.0 as current, and test most assertions against 2.4 - to avoid 'current' rewriting issues
|
|
DocumentationService::register("DocumentationViewerTests", DOCSVIEWER_PATH . "/tests/docs/", '2.3');
|
|
DocumentationService::register("DocumentationViewerTests", DOCSVIEWER_PATH . "/tests/docs-v2.4/", '2.4', 'Doc Test', true);
|
|
DocumentationService::register("DocumentationViewerTests", DOCSVIEWER_PATH . "/tests/docs-v3.0/", '3.0', 'Doc Test');
|
|
|
|
DocumentationService::register("DocumentationViewerAltModule1", DOCSVIEWER_PATH . "/tests/docs-parser/", '1.0');
|
|
DocumentationService::register("DocumentationViewerAltModule2", DOCSVIEWER_PATH . "/tests/docs-search/", '1.0');
|
|
}
|
|
|
|
public function tearDownOnce() {
|
|
parent::tearDownOnce();
|
|
|
|
DocumentationService::unregister("DocumentationViewerTests");
|
|
DocumentationService::set_automatic_registration($this->origEnabled);
|
|
|
|
Config::inst()->update('DocumentationViewer', 'link_base', $this->origLinkBase);
|
|
}
|
|
|
|
/**
|
|
* This tests that all the locations will exist if we access it via the urls.
|
|
*/
|
|
function testLocationsExists() {
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.3/subfolder');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing base folder');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing base folder');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4/');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing base folder');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.3/nonexistant-subfolder');
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Nonexistant subfolder');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.3/nonexistant-file.txt');
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Nonexistant file');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.3/test');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing file');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/empty?foo');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/empty.md');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/empty/');
|
|
$this->assertEquals($response->getStatusCode(), 200, 'Existing page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/test');
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Missing page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/test.md');
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Missing page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/3.0/test/');
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Missing page');
|
|
|
|
$response = $this->get('dev/docs/en');
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Must include a module');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/dk/');;
|
|
$this->assertEquals($response->getStatusCode(), 404, 'Access a language that doesn\'t exist');
|
|
}
|
|
|
|
function testRouting() {
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4');
|
|
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$this->assertContains('english test', $response->getBody(), 'Toplevel content page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4/');
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$this->assertContains('english test', $response->getBody(), 'Toplevel content page');
|
|
|
|
$response = $this->get('dev/docs/DocumentationViewerTests/en/2.4/index.md');
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$this->assertContains('english test', $response->getBody(), 'Toplevel content page');
|
|
}
|
|
|
|
function testGetModulePagesShort() {
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.3/subfolder/'), DataModel::inst());
|
|
$pages = $v->getEntityPages();
|
|
|
|
$this->assertEquals(
|
|
$pages->column('Title'),
|
|
array('Sort', 'Subfolder', 'Test')
|
|
);
|
|
}
|
|
|
|
function testGetEntityPages() {
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.3/subfolder/'), DataModel::inst());
|
|
$pages = $v->getEntityPages();
|
|
$this->assertEquals(
|
|
array('sort/', 'subfolder/', 'test.md'),
|
|
$pages->column('Filename')
|
|
);
|
|
$this->assertEquals(
|
|
array('link','current', 'link'),
|
|
$pages->column('LinkingMode')
|
|
);
|
|
|
|
foreach($pages as $page) {
|
|
$page->setVersion('2.3');
|
|
}
|
|
|
|
$links = $pages->column('Link');
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/2.3/sort/', $links[0]);
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/2.3/subfolder/', $links[1]);
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/2.3/test', $links[2]);
|
|
|
|
$pageSort = $pages->find('Title', 'Sort');
|
|
$this->assertFalse($pageSort->Children);
|
|
|
|
$pageSubfolder = $pages->find('Title', 'Subfolder');
|
|
$this->assertEquals(
|
|
array('subfolder/subpage.md', 'subfolder/subsubfolder/'),
|
|
$pageSubfolder->Children->column('Filename')
|
|
);
|
|
|
|
$children = $pageSubfolder->Children;
|
|
foreach($children as $child) {
|
|
$child->setVersion('2.3');
|
|
}
|
|
$child2Links = $children->column('Link');
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/2.3/subfolder/subpage', $child2Links[0]);
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/2.3/subfolder/subsubfolder/', $child2Links[1]);
|
|
}
|
|
|
|
function testUrlParsing() {
|
|
// Module index
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.3/test'), DataModel::inst());
|
|
$this->assertEquals('2.3', $v->getVersion());
|
|
$this->assertEquals('en', $v->getLang());
|
|
$this->assertEquals('DocumentationViewerTests', $v->getEntity()->getTitle());
|
|
$this->assertEquals(array('test'), $v->Remaining);
|
|
|
|
// Module index without version and language. Should pick up the defaults
|
|
$v2 = new DocumentationViewer();
|
|
$response = $v2->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/test'), DataModel::inst());
|
|
|
|
$this->assertEquals('2.4', $v2->getVersion());
|
|
$this->assertEquals('en', $v2->getLang());
|
|
$this->assertEquals('DocumentationViewerTests', $v2->getEntity()->getTitle());
|
|
$this->assertEquals(array('test'), $v2->Remaining);
|
|
|
|
// Overall index
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', ''), DataModel::inst());
|
|
$this->assertEquals('', $v->getVersion());
|
|
$this->assertEquals('en', $v->getLang());
|
|
$this->assertEquals('', $v->module);
|
|
$this->assertEquals(array(), $v->Remaining);
|
|
}
|
|
|
|
function testBreadcrumbs() {
|
|
// Module index
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.4'), DataModel::inst());
|
|
$crumbs = $v->getBreadcrumbs();
|
|
$this->assertEquals(1, $crumbs->Count());
|
|
|
|
// Subfolder index
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.4/subfolder/'), DataModel::inst());
|
|
$crumbs = $v->getBreadcrumbs();
|
|
$this->assertEquals(2, $crumbs->Count());
|
|
|
|
// Subfolder page
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.4/subfolder/subpage'), DataModel::inst());
|
|
$crumbs = $v->getBreadcrumbs();
|
|
$this->assertEquals(3, $crumbs->Count());
|
|
}
|
|
|
|
function testGetVersion() {
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.4'), DataModel::inst());
|
|
$this->assertEquals('2.4', $v->getVersion());
|
|
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/1'), DataModel::inst());
|
|
$this->assertEquals('1', $v->getVersion());
|
|
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/3.0'), DataModel::inst());
|
|
$this->assertEquals('3.0', $v->getVersion());
|
|
}
|
|
|
|
function testGetEntities() {
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.4'), DataModel::inst());
|
|
|
|
$pages = $v->getEntities();
|
|
|
|
$this->assertEquals(3, $pages->Count(), 'Registered 3 entities');
|
|
|
|
// check to see the links don't have version or pages in them
|
|
foreach($pages as $page) {
|
|
$expected = Controller::join_links('docs', $page->Title, 'en');
|
|
|
|
$this->assertStringEndsWith($expected, $page->Link);
|
|
}
|
|
}
|
|
|
|
function testVersionWarning() {
|
|
$v = new DocumentationViewer();
|
|
|
|
// the current version is set to 2.4, no notice should be shown on that page
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.4'), DataModel::inst());
|
|
$this->assertFalse($v->VersionWarning());
|
|
|
|
// 2.3 is an older release, hitting that should return us an outdated flag
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/2.3'), DataModel::inst());
|
|
$warn = $v->VersionWarning();
|
|
|
|
$this->assertTrue($warn->OutdatedRelease);
|
|
$this->assertNull($warn->FutureRelease);
|
|
|
|
// 3.0 is a future release
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/3.0'), DataModel::inst());
|
|
$warn = $v->VersionWarning();
|
|
|
|
$this->assertNull($warn->OutdatedRelease);
|
|
$this->assertTrue($warn->FutureRelease);
|
|
}
|
|
|
|
/**
|
|
* Test that the pages comes back sorted by filename
|
|
*/
|
|
function testGetEntityPagesSortedByFilename() {
|
|
$v = new DocumentationViewer();
|
|
$response = $v->handleRequest(new SS_HTTPRequest('GET', 'DocumentationViewerTests/en/3.0/'), DataModel::inst());
|
|
$pages = $v->getEntityPages();
|
|
$links = $pages->column('Link');
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/3.0/ChangeLog', $links[0]);
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/3.0/Tutorials', $links[1]);
|
|
$this->assertStringEndsWith('DocumentationViewerTests/en/3.0/empty', $links[2]);
|
|
}
|
|
} |