checkApiSetup(); $this->setFlickrBlacklistPage( self::BLACKLIST_PAGE ); $this->editPage( self::BLACKLIST_PAGE, self::PASFAM_NSID ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_STATIC, ] ); $this->assertBlacklistMatch( $response ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_PHOTO, ] ); $this->assertBlacklistMatch( $response ); } public function testBlacklistMatchByUsername() { $this->checkApiSetup(); $this->setFlickrBlacklistPage( self::BLACKLIST_PAGE ); $this->editPage( self::BLACKLIST_PAGE, self::PASFAM_USERNAME ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_STATIC, ] ); $this->assertBlacklistMatch( $response ); } public function testBlacklistMatchWithMultipleItems() { $this->checkApiSetup(); $this->setFlickrBlacklistPage( self::BLACKLIST_PAGE ); $this->editPage( self::BLACKLIST_PAGE, 'foo bar ' . self::PASFAM_NSID . ' baz' ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_STATIC, ] ); $this->assertBlacklistMatch( $response ); } public function testBlacklistNoMatch() { $this->checkApiSetup(); $this->setFlickrBlacklistPage( self::BLACKLIST_PAGE ); $this->editPage( self::BLACKLIST_PAGE, self::FAKE_NSID ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_STATIC, ] ); $this->assertNotBlacklistMatch( $response ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_PHOTO, ] ); $this->assertNotBlacklistMatch( $response ); } /** * Lines starting with # are comments. */ public function testBlacklistComment() { $this->checkApiSetup(); $this->setFlickrBlacklistPage( self::BLACKLIST_PAGE ); $this->editPage( self::BLACKLIST_PAGE, '# ' . self::PASFAM_NSID ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_STATIC, ] ); $this->assertNotBlacklistMatch( $response ); } public function testGetFullBlacklist() { $this->checkApiSetup(); $this->setFlickrBlacklistPage( self::BLACKLIST_PAGE ); $this->editPage( self::BLACKLIST_PAGE, '26011645@N00' ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'list' => 1, ] ); $this->assertArrayHasKey( 'flickrblacklist', $response ); $this->assertArrayHasKey( 'list', $response['flickrblacklist'] ); $this->assertContains( self::PASFAM_NSID, $response['flickrblacklist']['list'] ); } /** * When the blacklist page does not exist, things should not break. * This is the last test, to make sure that the blacklist cache (which is a static property so * changes to it survive between tests) is left empty. */ public function testNoBlacklist() { $this->checkApiSetup(); $this->setFlickrBlacklistPage( 'TestFlickrBlacklistPageDoesNotExist' ); list( $response, , ) = $this->doApiRequest( [ 'action' => 'flickrblacklist', 'url' => self::PASFAM_IMAGE_STATIC, ] ); $this->assertNotBlacklistMatch( $response ); // there should be no API call to Flickr; we have no good way of asserting that } protected function checkApiSetup() { // this is needed to initialize the global $wgUploadWizardConfig $wgUploadWizardConfig = UploadWizardConfig::getConfig(); if ( !isset( $wgUploadWizardConfig['flickrApiKey'] ) ) { $this->markTestSkipped( 'This test needs a Flickr API key to work' ); } if ( !isset( $wgUploadWizardConfig['flickrApiUrl'] ) || Http::get( $wgUploadWizardConfig['flickrApiUrl'] ) === false ) { // Http::get returns false if the server is unreachable. // Sometimes unit tests may be run in places without network access. $this->markTestSkipped( $wgUploadWizardConfig['flickrApiUrl'] . ' is unreachable.' ); } } /** * Changes global parameter for blacklist page in such a way that the change can be * unrolled after the test. Also clears the cache for the blacklist. * @param string $page */ protected function setFlickrBlacklistPage( $page ) { global $wgUploadWizardConfig; $this->setMwGlobals( [ 'wgUploadWizardConfig' => array_merge( $wgUploadWizardConfig, [ 'flickrBlacklistPage' => $page, ] ), ] ); // clear blacklist cache $reflection = new ReflectionClass( 'UploadWizardFlickrBlacklist' ); $property = $reflection->getProperty( 'blacklist' ); $property->setAccessible( true ); $property->setValue( null, null ); } /** * @param array $result api call result * @param string $message */ protected function assertBlacklistMatch( $result, $message = '' ) { $this->assertArrayHasKey( 'flickrblacklist', $result, $message ?: 'API result missing' ); $this->assertArrayHasKey( 'result', $result['flickrblacklist'], $message ?: 'API result missing' ); $this->assertEquals( 'bad', $result['flickrblacklist']['result'], $message ?: 'blacklist does not match' ); } /** * @param array $result api call result * @param string $message */ protected function assertNotBlacklistMatch( $result, $message = '' ) { $this->assertArrayHasKey( 'flickrblacklist', $result, $message ?: 'API result missing' ); $this->assertArrayHasKey( 'result', $result['flickrblacklist'], $message ?: 'API result missing' ); $this->assertEquals( 'ok', $result['flickrblacklist']['result'], $message ?: 'blacklist does match' ); } }