diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/JSONScript/SpecialPageTestCaseProcessor.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/JSONScript/SpecialPageTestCaseProcessor.php | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/JSONScript/SpecialPageTestCaseProcessor.php b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/JSONScript/SpecialPageTestCaseProcessor.php new file mode 100644 index 00000000..60c4e694 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/JSONScript/SpecialPageTestCaseProcessor.php @@ -0,0 +1,199 @@ +<?php + +namespace SMW\Tests\Integration\JSONScript; + +use FauxRequest; +use Language; +use OutputPage; +use RequestContext; +use SMW\Tests\Utils\File\ContentsReader; +use SMW\Tests\Utils\Mock\MockSuperUser; +use SpecialPage; +use SpecialPageFactory; + +/** + * @group semantic-mediawiki + * @group medium + * + * @license GNU GPL v2+ + * @since 2.4 + * + * @author mwjames + */ +class SpecialPageTestCaseProcessor extends \PHPUnit_Framework_TestCase { + + /** + * @var Store + */ + private $store; + + /** + * @var StringValidator + */ + private $stringValidator; + + /** + * @var boolean + */ + private $debug = false; + + /** + * @var string + */ + private $testCaseLocation = ''; + + /** + * @param Store + * @param StringValidator + */ + public function __construct( $store, $stringValidator ) { + $this->store = $store; + $this->stringValidator = $stringValidator; + } + + /** + * @since 2.4 + */ + public function setDebugMode( $debugMode ) { + $this->debug = $debugMode; + } + + /** + * @since 3.0 + * + * @param string $testCaseLocation + */ + public function setTestCaseLocation( $testCaseLocation ) { + $this->testCaseLocation = $testCaseLocation; + } + + /** + * @since 2.4 + * + * @param array $case + */ + public function process( array $case ) { + + if ( !isset( $case['special-page'] ) ) { + return; + } + + if ( isset( $case['special-page']['query-parameters'] ) ) { + $queryParameters = $case['special-page']['query-parameters']; + } else { + $queryParameters = []; + } + + $text = $this->getTextForRequestBy( + SpecialPageFactory::getPage( $case['special-page']['page'] ), + new FauxRequest( $case['special-page']['request-parameters'] ), + $queryParameters + ); + + $this->assertOutputForCase( $case, $text ); + } + + private function getTextForRequestBy( $page, $request, $queryParameters ) { + $response = $request->response(); + + $page->setContext( $this->makeRequestContext( + $request, + new MockSuperUser, + $this->getTitle( $page ) + ) ); + + $out = $page->getOutput(); + + ob_start(); + $page->execute( $queryParameters ); + + if ( $out->getRedirect() !== '' ) { + $out->output(); + $text = ob_get_contents(); + } elseif ( $out->isDisabled() ) { + $text = ob_get_contents(); + } else { + $text = $out->getHTML(); + } + + ob_end_clean(); + + $code = $response->getStatusCode(); + + if ( $code > 0 ) { + $response->header( "Status: " . $code . ' ' . \HttpStatus::getMessage( $code ) ); + } + + return $text; + } + + private function assertOutputForCase( $case, $text ) { + + // Avoid issue with \r carriage return and \n new line + $text = str_replace( "\r\n", "\n", $text ); + + if ( isset( $case['assert-output']['to-contain'] ) ) { + + if ( isset( $case['assert-output']['to-contain']['contents-file'] ) ) { + $contents = ContentsReader::readContentsFrom( + $this->testCaseLocation . $case['assert-output']['to-contain']['contents-file'] + ); + } else { + $contents = $case['assert-output']['to-contain']; + } + + $this->stringValidator->assertThatStringContains( + $contents, + $text, + $case['about'] + ); + } + + if ( isset( $case['assert-output']['not-contain'] ) ) { + + if ( isset( $case['assert-output']['not-contain']['contents-file'] ) ) { + $contents = ContentsReader::readContentsFrom( + $this->testCaseLocation . $case['assert-output']['not-contain']['contents-file'] + ); + } else { + $contents = $case['assert-output']['not-contain']; + } + + $this->stringValidator->assertThatStringNotContains( + $contents, + $text, + $case['about'] + ); + } + } + + /** + * @return RequestContext + */ + private function makeRequestContext( \WebRequest $request, $user, $title ) { + + $context = new RequestContext(); + $context->setRequest( $request ); + + $out = new OutputPage( $context ); + $out->setTitle( $title ); + + $context->setOutput( $out ); + $context->setLanguage( Language::factory( $GLOBALS['wgLanguageCode'] ) ); + + $user = $user === null ? new MockSuperUser() : $user; + $context->setUser( $user ); + + return $context; + } + + /** + * Deprecated: Use of SpecialPage::getTitle was deprecated in MediaWiki 1.23 + * + * @return Title + */ + private function getTitle( SpecialPage $page ) { + return method_exists( $page, 'getPageTitle') ? $page->getPageTitle() : $page->getTitle(); + } + +} |