Files
xxx/tests/php/Unit/NavigationTest.php
T
tim ed959888b4 Add PHP unit tests and page tests.
Run "composer install", then "composer test".
2026-09-26 03:48:09 +02:00

86 lines
3.8 KiB
PHP

<?php
namespace Xxx\Tests\Unit;
use Xxx\Tests\Support\SiteData;
use Xxx\Tests\Support\TestCase;
// sort_options() and get_pager() in navigation.lib.php
class NavigationTest extends TestCase {
protected function setUp(): void {
parent::setUp();
$rows = array();
for ($i = 1; $i <= 12; $i++)
$rows[] = array('id' => $i, 'title' => "Story $i", 'date' => sprintf('2020-01-%02d 10:00:00', $i));
SiteData::install(array('xxx' => $rows));
$GLOBALS['num_stories'] = 5;
open_db('open');
}
public function testSortOptionsLinkEveryOtherSort(): void {
$html = sort_options('/article');
$this->assertStringStartsWith('<div class="options">Sort by: ', $html);
// Newest first is the current sort, so it is not a link
$this->assertStringContainsString('<span>date descending</span> <span class="bar">|</span>', $html);
$this->assertStringNotContainsString('order=desc">' . '<span>date descending', $html);
$this->assertStringContainsString('<a href="/article?sort=date&amp;order=asc"><span>date</span></a>', $html);
$this->assertStringContainsString('<a href="/article?sort=author&amp;order=desc"><span>author z-a</span></a>', $html);
$this->assertStringContainsString('<a href="/article?sort=title&amp;order=asc"><span>title</span></a>', $html);
$this->assertSame(5, substr_count($html, '<a href='));
}
public function testSortOptionsKeepTheOtherArgumentsSafely(): void {
$this->request(array('queue' => '"><script>', 'search' => 'a b&c"<', 'start' => '5x', 'show' => '10', 'sort' => 'title'));
$html = sort_options('/article');
$this->assertStringContainsString('&amp;queue=0&amp;search=a+b%26c%22%3C&amp;start=0&amp;show=10"', $html);
$this->assertStringNotContainsString('<script>', $html);
}
public function testFirstPageHasOnlyAPreviousLink(): void {
$html = get_pager();
$this->assertStringContainsString('<span class="next"></span>', $html);
$this->assertStringContainsString('<a href="/article?start=5">Previous five articles &raquo;</a>', $html);
}
public function testMiddlePageHasBothLinks(): void {
$this->request(array('start' => '5'));
$html = get_pager();
$this->assertStringContainsString('<a href="/article?start=0">&laquo; Next five articles</a>', $html);
$this->assertStringContainsString('<a href="/article?start=10">Previous five articles &raquo;</a>', $html);
}
public function testLastPageHasOnlyANextLink(): void {
$this->request(array('start' => '10'));
$html = get_pager();
$this->assertStringContainsString('&laquo; Next five articles', $html);
$this->assertStringContainsString("<span class=\"prev\"></span>", $html);
}
public function testNextNeverGoesBelowZero(): void {
$this->request(array('start' => '2'));
$this->assertStringContainsString('<a href="/article?start=0">', get_pager());
}
public function testOneArticleIsSingular(): void {
$this->request(array('show' => '1'));
$this->assertStringContainsString('Previous article &raquo;', get_pager());
}
public function testPageSizeInWords(): void {
$this->request(array('show' => '3', 'start' => '3'));
$html = get_pager();
$this->assertStringContainsString('&laquo; Next three articles', $html);
$this->assertStringContainsString('Previous three articles &raquo;', $html);
}
public function testPagerKeepsTheOtherArgumentsSafely(): void {
$this->request(array('start' => '5', 'show' => '5', 'search' => 'Story "1', 'queue' => 'x', 'sort' => 'bad', 'order' => 'bad'));
$html = get_pager();
$this->assertStringContainsString('href="/article?start=0&amp;queue=0&amp;search=Story+%221&amp;show=5&amp;sort=date&amp;order=desc"', $html);
}
public function testEditablePagerStaysOnThePage(): void {
$GLOBALS['editable'] = TRUE;
$this->assertStringContainsString('<a href="?start=5">', get_pager());
}
}