jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/337857 )

Change subject: Retreive Info for file from API
......................................................................


Retreive Info for file from API

Change-Id: I2a9c9c7fe04b6940ec76d8cdfe0938826114dedc
---
M extension.json
M src/Generic/DispatchingImporter.php
A src/Generic/Exceptions/HttpRequestException.php
A src/Generic/Exceptions/ImportException.php
A src/Generic/Exceptions/ImportTargetException.php
A src/Generic/HttpRequestExecutor.php
D src/Generic/ImportTargetException.php
M src/Generic/Importer.php
A src/MediaWiki/ApiImporter.php
D src/MediaWiki/HostBasedSiteTableLookup.php
A src/MediaWiki/HttpApiLookup.php
D src/MediaWiki/MediaWikiImporter.php
A src/MediaWiki/SiteTableSiteLookup.php
M src/ServiceWiring.php
A tests/Generic/HttpRequestExecutorTest.php
R tests/MediaWiki/SiteTableSiteLookupTest.php
16 files changed, 518 insertions(+), 120 deletions(-)

Approvals:
  WMDE-Fisch: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/extension.json b/extension.json
index 345c4b3..3830ed0 100644
--- a/extension.json
+++ b/extension.json
@@ -20,13 +20,17 @@
        },
        "AutoloadClasses": {
                "FileImporter\\Generic\\DispatchingImporter": 
"src/Generic/DispatchingImporter.php",
+               "FileImporter\\Generic\\Exceptions\\HttpRequestException": 
"src/Generic/Exceptions/HttpRequestException.php",
+               "FileImporter\\Generic\\Exceptions\\ImportException": 
"src/Generic/Exceptions/ImportException.php",
+               "FileImporter\\Generic\\Exceptions\\ImportTargetException": 
"src/Generic/Exceptions/ImportTargetException.php",
                "FileImporter\\Generic\\ImportAdjustments": 
"src/Generic/ImportAdjustments.php",
                "FileImporter\\Generic\\ImportDetails": 
"src/Generic/ImportDetails.php",
                "FileImporter\\Generic\\Importer": "src/Generic/Importer.php",
-               "FileImporter\\Generic\\ImportTargetException": 
"src/Generic/ImportTargetException.php",
+               "FileImporter\\Generic\\HttpRequestExecutor": 
"src/Generic/HttpRequestExecutor.php",
                "FileImporter\\Generic\\TargetUrl": "src/Generic/TargetUrl.php",
-               "FileImporter\\MediaWiki\\HostBasedSiteTableLookup": 
"src/MediaWiki/HostBasedSiteTableLookup.php",
-               "FileImporter\\MediaWiki\\MediaWikiImporter": 
"src/MediaWiki/MediaWikiImporter.php",
+               "FileImporter\\MediaWiki\\ApiImporter": 
"src/MediaWiki/ApiImporter.php",
+               "FileImporter\\MediaWiki\\HttpApiLookup": 
"src/MediaWiki/HttpApiLookup.php",
+               "FileImporter\\MediaWiki\\SiteTableSiteLookup": 
"src/MediaWiki/SiteTableSiteLookup.php",
                "FileImporter\\FileImporterHooks": "src/FileImporterHooks.php",
                "FileImporter\\SpecialImportFile": "src/SpecialImportFile.php"
        },
@@ -35,7 +39,7 @@
        ],
        "config": {
                "FileImporterImporterServices": [
-                       "FileImporterMediaWikiImporter"
+                       "FileImporterMediaWikiApiImporter"
                ]
        },
        "ResourceModules": {
diff --git a/src/Generic/DispatchingImporter.php 
b/src/Generic/DispatchingImporter.php
index 453cc78..a75764d 100644
--- a/src/Generic/DispatchingImporter.php
+++ b/src/Generic/DispatchingImporter.php
@@ -2,6 +2,8 @@
 
 namespace FileImporter\Generic;
 
+use FileImporter\Generic\Exceptions\ImportTargetException;
+
 class DispatchingImporter implements Importer {
 
        /**
diff --git a/src/Generic/Exceptions/HttpRequestException.php 
b/src/Generic/Exceptions/HttpRequestException.php
new file mode 100644
index 0000000..b965ee6
--- /dev/null
+++ b/src/Generic/Exceptions/HttpRequestException.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace FileImporter\Generic\Exceptions;
+
+class HttpRequestException extends ImportException {
+
+}
diff --git a/src/Generic/Exceptions/ImportException.php 
b/src/Generic/Exceptions/ImportException.php
new file mode 100644
index 0000000..a8700af
--- /dev/null
+++ b/src/Generic/Exceptions/ImportException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace FileImporter\Generic\Exceptions;
+
+use RuntimeException;
+
+/**
+ * Generic Import exception
+ */
+class ImportException extends RuntimeException{
+
+}
diff --git a/src/Generic/Exceptions/ImportTargetException.php 
b/src/Generic/Exceptions/ImportTargetException.php
new file mode 100644
index 0000000..5e857fb
--- /dev/null
+++ b/src/Generic/Exceptions/ImportTargetException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace FileImporter\Generic\Exceptions;
+
+use RuntimeException;
+
+/**
+ * Thrown in cases that the ImportTarget is not deemed to be acceptable
+ */
+class ImportTargetException extends ImportException{
+
+}
diff --git a/src/Generic/HttpRequestExecutor.php 
b/src/Generic/HttpRequestExecutor.php
new file mode 100644
index 0000000..d6b8d9a
--- /dev/null
+++ b/src/Generic/HttpRequestExecutor.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace FileImporter\Generic;
+
+use FileImporter\Generic\Exceptions\HttpRequestException;
+use MWException;
+use MWHttpRequest;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+class HttpRequestExecutor implements LoggerAwareInterface {
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       /**
+        * @var callable
+        */
+       private $requestFactoryCallable;
+
+       public function __construct() {
+               $this->requestFactoryCallable = [ MWHttpRequest::class, 
'factory' ];
+               $this->logger = new NullLogger();
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       public function overrideRequestFactory( callable $callable ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException(
+                               'Cannot override MWHttpRequest::factory 
callback in operation.'
+                       );
+               }
+               $this->requestFactoryCallable = $callable;
+       }
+
+       /**
+        * @param string $url
+        *
+        * @return MWHttpRequest
+        * @throws HttpRequestException
+        */
+       public function execute( $url ) {
+               /** @var MWHttpRequest $request */
+               $request = call_user_func(
+                       $this->requestFactoryCallable,
+                       $url,
+                       [
+                               'logger' => $this->logger,
+                               'followRedirects' => true,
+                       ],
+                       __METHOD__
+               );
+
+               $status = $request->execute();
+               if ( !$status->isOK() ) {
+                       throw new HttpRequestException();
+               }
+
+               return $request;
+       }
+
+}
diff --git a/src/Generic/ImportTargetException.php 
b/src/Generic/ImportTargetException.php
deleted file mode 100644
index ce93391..0000000
--- a/src/Generic/ImportTargetException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace FileImporter\Generic;
-
-use RuntimeException;
-
-class ImportTargetException extends RuntimeException{
-
-}
diff --git a/src/Generic/Importer.php b/src/Generic/Importer.php
index e012c43..f5fe74b 100644
--- a/src/Generic/Importer.php
+++ b/src/Generic/Importer.php
@@ -2,6 +2,8 @@
 
 namespace FileImporter\Generic;
 
+use FileImporter\Generic\Exceptions\ImportTargetException;
+
 interface Importer {
 
        /**
diff --git a/src/MediaWiki/ApiImporter.php b/src/MediaWiki/ApiImporter.php
new file mode 100644
index 0000000..e41ec00
--- /dev/null
+++ b/src/MediaWiki/ApiImporter.php
@@ -0,0 +1,145 @@
+<?php
+
+namespace FileImporter\MediaWiki;
+
+use FileImporter\Generic\HttpRequestExecutor;
+use FileImporter\Generic\ImportAdjustments;
+use FileImporter\Generic\ImportDetails;
+use FileImporter\Generic\Importer;
+use FileImporter\Generic\TargetUrl;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+class ApiImporter implements Importer, LoggerAwareInterface {
+
+       /**
+        * @var SiteTableSiteLookup
+        */
+       private $siteTableSiteLookup;
+
+       /**
+        * @var HttpApiLookup
+        */
+       private $httpApiLookup;
+
+       /**
+        * @var HttpRequestExecutor
+        */
+       private $httpRequestExecutor;
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       public function __construct(
+               SiteTableSiteLookup $siteTableSiteLookup,
+               HttpApiLookup $httpApiLookup,
+               HttpRequestExecutor $httpRequestExecutor
+       ) {
+               $this->siteTableSiteLookup = $siteTableSiteLookup;
+               $this->httpApiLookup = $httpApiLookup;
+               $this->httpRequestExecutor = $httpRequestExecutor;
+               $this->logger = new NullLogger();
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * @param TargetUrl $targetUrl
+        *
+        * @return bool
+        */
+       public function canImport( TargetUrl $targetUrl ) {
+               return $this->siteTableSiteLookup->getSite( 
$targetUrl->getParsedUrl()['host'] ) !== null;
+       }
+
+       /**
+        * @param TargetUrl $targetUrl
+        *
+        * @return ImportDetails
+        */
+       public function getImportDetails( TargetUrl $targetUrl ) {
+               $apiUrl = $this->httpApiLookup->getApiUrl( $targetUrl );
+
+               // TODO catch and do something with exceptions?
+               $imageInfoRequest = $this->httpRequestExecutor->execute(
+                       $apiUrl . '?' . http_build_query( 
$this->getImageInfoParams( $targetUrl ) )
+               );
+               $imageInfoData = json_decode( $imageInfoRequest->getContent(), 
true );
+
+               if ( count( $imageInfoData['query']['pages'] ) !== 1 ) {
+                       // TODO log and exception
+                       die( 'unexpected number of pages returned?' );
+               }
+
+               $pageInfoData = array_pop( $imageInfoData['query']['pages'] );
+               $normalizationData = array_pop( 
$imageInfoData['query']['normalized'] );
+               $latestImageData = array_pop( $pageInfoData['imageinfo'] );
+
+               $importDetails = new ImportDetails(
+                       $targetUrl,
+                       $normalizationData['to'],
+                       $latestImageData['thumburl']
+               );
+
+               return $importDetails;
+       }
+
+       private function getImageInfoParams( TargetUrl $targetUrl ) {
+               $parsed = $targetUrl->getParsedUrl();
+               // TODO what if the url is title=XXX?
+               $bits = explode( '/', $parsed['path'] );
+               $fullTitle = array_pop( $bits );
+
+               return [
+                       'action' => 'query',
+                       'format' => 'json',
+                       'prop' => 'imageinfo',
+                       'titles' => $fullTitle,
+                       'iilimit' => '500',
+                       'iiurlwidth' => '500',
+                       'iiprop' => implode(
+                               '|',
+                               [
+                                       // TODO are all of these actually 
needed?
+                                       'timestamp',
+                                       'user',
+                                       'userid',
+                                       'comment',
+                                       'parsedcomment',
+                                       'canonicaltitle',
+                                       'url',
+                                       'size',
+                                       'dimensions',
+                                       'sha1',
+                                       'mime',
+                                       'thumbmime',
+                                       'mediatype',
+                                       'metadata',
+                                       'commonmetadata',
+                                       'extmetadata',
+                                       'archivename',
+                                       'bitdepth',
+                                       'uploadwarning',
+                                       'badfile',
+                               ]
+                       ),
+               ];
+       }
+
+       /**
+        * @param TargetUrl $targetUrl
+        * @param ImportAdjustments $importAdjustments
+        *
+        * @return bool success
+        */
+       public function import( TargetUrl $targetUrl, ImportAdjustments 
$importAdjustments ) {
+               // TODO implement
+               return false;
+       }
+
+}
diff --git a/src/MediaWiki/HostBasedSiteTableLookup.php 
b/src/MediaWiki/HostBasedSiteTableLookup.php
deleted file mode 100644
index 01c32cc..0000000
--- a/src/MediaWiki/HostBasedSiteTableLookup.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-namespace FileImporter\MediaWiki;
-
-use Site;
-use SiteLookup;
-
-class HostBasedSiteTableLookup {
-
-       /**
-        * @var SiteLookup
-        */
-       private $siteLookup;
-
-       public function __construct( SiteLookup $siteLookup ) {
-               $this->siteLookup = $siteLookup;
-       }
-
-       /**
-        * @param string $host e.g. en.wikipedia.org or commons.wikimedia.org
-        *
-        * @return Site|null
-        */
-       public function getSite( $host ) {
-               /** @var Site[] $sites */
-               $sites = $this->siteLookup->getSites();
-               foreach ( $sites as $site ) {
-                       if ( $site->getDomain() === $host ) {
-                               return $site;
-                       }
-               }
-
-               return null;
-       }
-
-}
diff --git a/src/MediaWiki/HttpApiLookup.php b/src/MediaWiki/HttpApiLookup.php
new file mode 100644
index 0000000..d556b4c
--- /dev/null
+++ b/src/MediaWiki/HttpApiLookup.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace FileImporter\MediaWiki;
+
+use DOMDocument;
+use DOMElement;
+use FileImporter\Generic\Exceptions\ImportException;
+use FileImporter\Generic\HttpRequestExecutor;
+use FileImporter\Generic\TargetUrl;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+class HttpApiLookup implements LoggerAwareInterface{
+
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       /**
+        * @var HttpRequestExecutor
+        */
+       private $httpRequestExecutor;
+
+       public function __construct( HttpRequestExecutor $httpRequestExecutor ) 
{
+               $this->httpRequestExecutor = $httpRequestExecutor;
+               $this->logger = new NullLogger();
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * @param string $message
+        * @throws ImportException
+        */
+       private function logAndException( $message ) {
+               $this->logger->error( 'Request to get MediaWiki API from 
TargetUrl failed' );
+               throw new ImportException( 'Request to get MediaWiki API from 
TargetUrl failed' );
+       }
+
+       /**
+        * @param TargetUrl $targetUrl
+        * @return string URL of api.php or null
+        */
+       public function getApiUrl( TargetUrl $targetUrl ) {
+               // TODO catch exceptions and do something
+               $req = $this->httpRequestExecutor->execute( 
$targetUrl->getUrl() );
+
+               $document = new DOMDocument();
+
+               libxml_use_internal_errors( true );
+               $document->loadHTML( $req->getContent() );
+               libxml_clear_errors();
+
+               $elements = $document->getElementsByTagName( 'link' );
+               foreach ( $elements as $element ) {
+                       /** @var DOMElement $element */
+                       if ( $element->getAttribute( 'rel' ) === 'EditURI' ) {
+                               $editUri = $element->getAttribute( 'href' );
+                               return str_replace( '?action=rsd', '', $editUri 
);
+                       }
+               }
+
+               $this->logAndException( 'Failed to get MediaWiki API from 
TargetUrl' );
+               return null; // never reached
+       }
+
+}
diff --git a/src/MediaWiki/MediaWikiImporter.php 
b/src/MediaWiki/MediaWikiImporter.php
deleted file mode 100644
index e3ffda4..0000000
--- a/src/MediaWiki/MediaWikiImporter.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-namespace FileImporter\MediaWiki;
-
-use FileImporter\Generic\ImportAdjustments;
-use FileImporter\Generic\ImportDetails;
-use FileImporter\Generic\Importer;
-use FileImporter\Generic\TargetUrl;
-use MediaWiki\MediaWikiServices;
-use NaiveForeignTitleFactory;
-
-class MediaWikiImporter implements Importer {
-
-       /**
-        * @param TargetUrl $targetUrl
-        *
-        * @return bool
-        */
-       public function canImport( TargetUrl $targetUrl ) {
-               // TODO inject
-               /** @var HostBasedSiteTableLookup $lookup */
-               $lookup = MediaWikiServices::getInstance()->getService( 
'FileImporterUrlBasedSiteLookup' );
-               return $lookup->getSite( $targetUrl->getParsedUrl()['host'] ) 
!== null;
-       }
-
-       /**
-        * @param TargetUrl $targetUrl
-        *
-        * @return ImportDetails
-        */
-       public function getImportDetails( TargetUrl $targetUrl ) {
-
-               $parsed = $targetUrl->getParsedUrl();
-               $bits = explode( '/', $parsed['path'] );
-               $fullTitle = array_pop( $bits );
-
-               // TODO inject?
-               // TODO use NamespaceAwareForeignTitleFactory using api /db of 
the foreign / local site
-               $titleFactory = new NaiveForeignTitleFactory();
-               $foreignTitle = $titleFactory->createForeignTitle( $fullTitle, 
NS_FILE );
-
-               return new ImportDetails(
-                       $targetUrl,
-                       $foreignTitle->getText(),
-                       // TODO actually get real file url
-                       
'https://upload.wikimedia.org/wikipedia/commons/5/52/Berlin_Montage_4.jpg'
-               );
-       }
-
-       /**
-        * @param TargetUrl $targetUrl
-        * @param ImportAdjustments $importAdjustments
-        *
-        * @return bool success
-        */
-       public function import( TargetUrl $targetUrl, ImportAdjustments 
$importAdjustments ) {
-               // TODO implement
-               return false;
-       }
-
-}
diff --git a/src/MediaWiki/SiteTableSiteLookup.php 
b/src/MediaWiki/SiteTableSiteLookup.php
new file mode 100644
index 0000000..b934e05
--- /dev/null
+++ b/src/MediaWiki/SiteTableSiteLookup.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace FileImporter\MediaWiki;
+
+use Site;
+use SiteLookup;
+
+class SiteTableSiteLookup {
+
+       /**
+        * @var SiteLookup
+        */
+       private $siteLookup;
+
+       /**
+        * @var array
+        */
+       private $hostGlobalIdMap = [];
+
+       public function __construct( SiteLookup $siteLookup ) {
+               $this->siteLookup = $siteLookup;
+       }
+
+       /**
+        * @param string $host e.g. en.wikipedia.org or commons.wikimedia.org
+        *
+        * @return Site|null
+        */
+       public function getSite( $host ) {
+               $site = $this->getSiteFromHostMap( $host );
+               if ( !$site ) {
+                       $site = $this->getSiteFromSitesLoop( $host );
+               }
+
+               return $site;
+       }
+
+       /**
+        * @param string $host
+        *
+        * @return Site|null
+        */
+       private function getSiteFromSitesLoop( $host ) {
+               /** @var Site[] $sites */
+               $sites = $this->siteLookup->getSites();
+               foreach ( $sites as $site ) {
+                       if ( $site->getDomain() === $host ) {
+                               $this->addSiteToHostMap( $site, $host );
+                               return $site;
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * @param string $host
+        *
+        * @return Site|null
+        */
+       private function getSiteFromHostMap( $host ) {
+               if ( array_key_exists( $host, $this->hostGlobalIdMap ) ) {
+                       return $this->siteLookup->getSite( 
$this->hostGlobalIdMap[$host] );
+               }
+
+               return null;
+       }
+
+       /**
+        * @param Site $site
+        * @param string $host
+        */
+       private function addSiteToHostMap( Site $site, $host ) {
+               if ( $site->getGlobalId() ) {
+                       $this->hostGlobalIdMap[$host] = $site->getGlobalId();
+               }
+       }
+
+}
diff --git a/src/ServiceWiring.php b/src/ServiceWiring.php
index cd34dff..ae408c1 100644
--- a/src/ServiceWiring.php
+++ b/src/ServiceWiring.php
@@ -3,16 +3,14 @@
 namespace FileImporter;
 
 use FileImporter\Generic\DispatchingImporter;
-use FileImporter\MediaWiki\MediaWikiImporter;
-use FileImporter\MediaWiki\HostBasedSiteTableLookup;
+use FileImporter\Generic\HttpRequestExecutor;
+use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;
 
 return [
 
-       'FileImporterUrlBasedSiteLookup' => function( MediaWikiServices 
$services ) {
-               return new HostBasedSiteTableLookup( $services->getSiteLookup() 
);
-       },
+       // Generic
 
        'FileImporterDispatchingImporter' => function( MediaWikiServices 
$services ) {
                $config = $services->getMainConfig();
@@ -25,8 +23,49 @@
                return new DispatchingImporter( $importers );
        },
 
-       'FileImporterMediaWikiImporter' => function( MediaWikiServices 
$services ) {
-               return new MediaWikiImporter();
+       'FileImporterHttpRequestExecutor' => function( MediaWikiServices 
$services ) {
+               $service = new HttpRequestExecutor();
+               $service->setLogger( LoggerFactory::getInstance( 'FileImporter' 
) );
+               return $service;
+       },
+
+       // MediaWiki
+
+       'FileImporterMediaWikiHttpApiLookup' => function( MediaWikiServices 
$services ) {
+               /** @var HttpRequestExecutor $httpRequestExecutor */
+               $httpRequestExecutor = $services->getService( 
'FileImporterHttpRequestExecutor' );
+
+               $service = new \FileImporter\MediaWiki\HttpApiLookup(
+                       $httpRequestExecutor
+               );
+               $service->setLogger( LoggerFactory::getInstance( 'FileImporter' 
) );
+               return $service;
+       },
+
+       'FileImporterMediaWikiSiteTableSiteLookup' => function( 
MediaWikiServices $services ) {
+               return new \FileImporter\MediaWiki\SiteTableSiteLookup( 
$services->getSiteLookup() );
+       },
+
+       // Importers
+
+       'FileImporterMediaWikiApiImporter' => function( MediaWikiServices 
$services ) {
+               /**
+                * @var \FileImporter\MediaWiki\SiteTableSiteLookup 
$siteTableSiteLookup
+                * @var \FileImporter\MediaWiki\HttpApiLookup $httpApiLookup
+                * @var HttpRequestExecutor $httpRequestExecutor
+                */
+               $siteTableSiteLookup = $services->getService( 
'FileImporterMediaWikiSiteTableSiteLookup' );
+               $httpApiLookup = $services->getService( 
'FileImporterMediaWikiHttpApiLookup' );
+               $httpRequestExecutor = $services->getService( 
'FileImporterHttpRequestExecutor' );
+
+               $service = new \FileImporter\MediaWiki\ApiImporter(
+                       $siteTableSiteLookup,
+                       $httpApiLookup,
+                       $httpRequestExecutor
+               );
+               $service->setLogger( LoggerFactory::getInstance( 'FileImporter' 
) );
+
+               return $service;
        }
 
 ];
diff --git a/tests/Generic/HttpRequestExecutorTest.php 
b/tests/Generic/HttpRequestExecutorTest.php
new file mode 100644
index 0000000..966e315
--- /dev/null
+++ b/tests/Generic/HttpRequestExecutorTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace FileImporter\Generic\Test;
+
+use FileImporter\Generic\Exceptions\HttpRequestException;
+use FileImporter\Generic\HttpRequestExecutor;
+use MWHttpRequest;
+use PHPUnit_Framework_TestCase;
+use Psr\Log\LoggerInterface;
+use Status;
+
+class HttpRequestExecutorTest extends PHPUnit_Framework_TestCase {
+
+       public function provideTestExecute() {
+               return [
+                       [ 'http://example.com', false ],
+                       [ 'http://example.com', 'Some Real Content' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideTestExecute
+        */
+       public function testExecute( $testUrl, $expectedResult ) {
+               $executor = new HttpRequestExecutor();
+               $factoryOverride = function ( $url, $options = null, $caller = 
__METHOD__ )
+                       use ( $testUrl, $expectedResult ) {
+
+                       $this->assertEquals( $testUrl, $url );
+                       $this->assertArrayHasKey( 'logger', $options );
+                       $this->assertArrayHasKey( 'followRedirects', $options );
+                       $this->assertInstanceOf( LoggerInterface::class, 
$options['logger'] );
+                       $this->assertTrue( $options['followRedirects'] );
+                       $this->assertEquals( $caller, 
HttpRequestExecutor::class . '::execute' );
+
+                       $request = $this->getMockBuilder( MWHttpRequest::class )
+                               ->disableOriginalConstructor()
+                               ->getMock();
+                       $status = Status::newGood();
+                       if ( !$expectedResult ) {
+                               $status->fatal( 'SomeFatal' );
+                       } else {
+                               $request->expects( $this->any() )
+                                       ->method( 'getContent' )
+                                       ->will( $this->returnValue( 
$expectedResult ) );
+                       }
+                       $request->expects( $this->any() )
+                               ->method( 'execute' )
+                               ->will( $this->returnValue( $status ) );
+
+                       return $request;
+               };
+               $executor->overrideRequestFactory( $factoryOverride );
+
+               if ( !$expectedResult ) {
+                       $this->setExpectedException( 
HttpRequestException::class );
+               }
+
+               $request = $executor->execute( $testUrl );
+               $this->assertEquals( $expectedResult, $request->getContent() );
+       }
+
+}
diff --git a/tests/MediaWiki/HostBasedSiteTableLookupTest.php 
b/tests/MediaWiki/SiteTableSiteLookupTest.php
similarity index 88%
rename from tests/MediaWiki/HostBasedSiteTableLookupTest.php
rename to tests/MediaWiki/SiteTableSiteLookupTest.php
index 0ad1cf2..9b86023 100644
--- a/tests/MediaWiki/HostBasedSiteTableLookupTest.php
+++ b/tests/MediaWiki/SiteTableSiteLookupTest.php
@@ -2,13 +2,13 @@
 
 namespace FileImporter\MediaWiki\Test;
 
-use FileImporter\MediaWiki\HostBasedSiteTableLookup;
+use FileImporter\MediaWiki\SiteTableSiteLookup;
 use HashSiteStore;
 use MediaWikiSite;
 use PHPUnit_Framework_TestCase;
 use Site;
 
-class HostBasedSiteTableLookupTest extends PHPUnit_Framework_TestCase {
+class SiteTableSiteLookupTest extends PHPUnit_Framework_TestCase {
 
        private function getSite( $globalId, $domain ) {
                $mockSite = $this->getMock( Site::class );
@@ -44,7 +44,7 @@
                        $this->getSite( 'commonswiki', 'commons.wikimedia.org' 
),
                ] );
 
-               $lookup = new HostBasedSiteTableLookup( $hashSiteStore );
+               $lookup = new SiteTableSiteLookup( $hashSiteStore );
 
                $result = $lookup->getSite( $host );
                if ( $expected === null ) {

-- 
To view, visit https://gerrit.wikimedia.org/r/337857
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I2a9c9c7fe04b6940ec76d8cdfe0938826114dedc
Gerrit-PatchSet: 9
Gerrit-Project: mediawiki/extensions/FileImporter
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
Gerrit-Reviewer: Andrew-WMDE <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: WMDE-Fisch <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to