headerTest.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. declare(strict_types=1);
  3. use PHPUnit\Framework\Attributes\DataProvider;
  4. use PHPUnit\Framework\Attributes\PreserveGlobalState;
  5. use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
  6. #[RunTestsInSeparateProcesses]
  7. #[PreserveGlobalState(false)]
  8. final class headerTest extends \PHPUnit\Framework\TestCase {
  9. /** @return Traversable<string,array{?string,?string}> */
  10. public static function provideSearchSorts(): Traversable {
  11. foreach (['id', 'c.name', 'date', 'f.name', 'lastUserModified', 'length', 'link', 'title', 'rand'] as $sort) {
  12. yield $sort => [$sort, $sort];
  13. }
  14. yield 'no override' => [null, null];
  15. yield 'empty override' => ['', null];
  16. yield 'invalid override' => ['" onfocus="alert(1)', null];
  17. }
  18. #[DataProvider('provideSearchSorts')]
  19. public function testSearchPreservesSort(?string $requestedSort, ?string $expectedSort): void {
  20. FreshRSS_Context::initSystem();
  21. FreshRSS_Context::systemConf()->allow_anonymous = true;
  22. Minz_User::change(FreshRSS_Context::systemConf()->default_user);
  23. FreshRSS_Context::setUserConf(clone FreshRSS_UserConfiguration::default());
  24. Minz_Translate::init('en');
  25. Minz_Request::_params($requestedSort === null ? [] : ['sort' => $requestedSort]);
  26. // The context has already validated the requested sort before rendering the header.
  27. FreshRSS_Context::$sort = match ($expectedSort) {
  28. 'c.name', 'date', 'f.name', 'lastUserModified', 'length', 'link', 'title', 'rand' => $expectedSort,
  29. default => 'id',
  30. };
  31. FreshRSS_Context::$search = new FreshRSS_BooleanSearch('needle');
  32. $view = new FreshRSS_View();
  33. $view->_path('../layout/header.phtml');
  34. $view->html_url = 'https://example.net/';
  35. $html = new DOMDocument();
  36. self::assertTrue($html->loadHTML($view->renderToString(), LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING));
  37. $inputs = (new DOMXPath($html))->query('//form[.//input[@name="search"]]/input[@name="sort"]');
  38. self::assertNotFalse($inputs);
  39. self::assertSame($expectedSort === null ? 0 : 1, $inputs->length);
  40. if ($expectedSort !== null) {
  41. $input = $inputs->item(0);
  42. self::assertInstanceOf(DOMElement::class, $input);
  43. self::assertSame('hidden', $input->getAttribute('type'));
  44. self::assertSame($expectedSort, $input->getAttribute('value'));
  45. }
  46. }
  47. }