Files
docset-viewer/tests/smoke.php
T

55 lines
2.4 KiB
PHP

<?php
chdir(__DIR__.'/..');
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['REQUEST_URI'] = '/docset-viewer/';
$_SERVER['PHP_SELF'] = '/docset-viewer/index.php';
require_once 'config/settings.php';
require_once 'lib/ulib.php';
require_once 'lib/components.php';
require_once 'lib/theme_helpers.php';
require_once 'lib/docset_repository.php';
require_once 'lib/docset_renderer.php';
function assert_true($condition, string $message): void
{
if(!$condition)
{
fwrite(STDERR, "FAIL: $message\n");
exit(1);
}
}
assert_true(class_exists('SQLite3'), 'SQLite3 extension is available');
assert_true(class_exists('SimpleXMLElement'), 'SimpleXML extension is available');
assert_true(class_exists('DOMDocument'), 'DOM extension is available');
URL::MakeRoute('/docsets');
assert_true(URL::$route['page'] === 'docsets', 'route parsing finds docsets page');
$repo = new DocsetRepository();
$docsets = $repo->listDocsets();
assert_true(is_array($docsets), 'docset list returns an array');
$sanitized = DocsetRenderer::renderInlineHtml('<main><a href="javascript:alert(1)" onclick="alert(2)">bad link</a></main>', $repo, 'PHP', '.');
assert_true(!str_contains(strtolower($sanitized), 'javascript:'), 'inline renderer blocks javascript URLs from docset HTML');
assert_true(!str_contains(strtolower($sanitized), 'onclick='), 'inline renderer strips event handler attributes from docset HTML');
assert_true(str_contains($sanitized, '#blocked-unsafe-url'), 'inline renderer keeps unsafe links inert and visible');
$phpDocset = $repo->getDocset('PHP');
if($phpDocset)
{
assert_true($phpDocset['entry_count'] > 1000, 'PHP docset has indexed entries');
$results = $repo->search('array_map', 'PHP', 5);
assert_true(count($results) > 0, 'PHP docset search returns results');
assert_true(isset($results[0]['href']), 'search result contains view URL');
$doc = $repo->resolveDocumentPath('PHP', 'www.php.net/manual/en/function.array-map.html');
assert_true($doc !== null, 'PHP docset document resolves');
$html = DocsetRenderer::renderInlineHtml((string)file_get_contents($doc['file']), $repo, 'PHP', dirname($doc['relative']));
assert_true(str_contains($html, 'array_map'), 'inline renderer includes document content');
$rewrittenLink = str_replace('&', '&amp;', URL::Link('view', array('docset' => 'PHP', 'path' => 'www.php.net/manual/en/language.types.array.html')));
assert_true(str_contains($html, $rewrittenLink), 'inline renderer rewrites doc links to view routes');
}
echo "Smoke tests passed\n";