getMock( 'SiteStore' ); $that = $this; $store->expects( $this->once() ) ->method( 'saveSites' ) ->will( $this->returnCallback( function ( $sites ) use ( $expectedSites, $that ) { $that->assertSitesEqual( $expectedSites, $sites ); } ) ); $store->expects( $this->any() ) ->method( 'getSites' ) ->will( $this->returnValue( new SiteList() ) ); $errorHandler = $this->getMock( 'Psr\Log\LoggerInterface' ); $errorHandler->expects( $this->exactly( $errorCount ) ) ->method( 'error' ); $importer = new SiteImporter( $store ); $importer->setExceptionCallback( array( $errorHandler, 'error' ) ); return $importer; } public function assertSitesEqual( $expected, $actual, $message = '' ) { $this->assertEquals( $this->getSerializedSiteList( $expected ), $this->getSerializedSiteList( $actual ), $message ); } public function provideImportFromXML() { $foo = Site::newForType( Site::TYPE_UNKNOWN ); $foo->setGlobalId( 'Foo' ); $acme = Site::newForType( Site::TYPE_UNKNOWN ); $acme->setGlobalId( 'acme.com' ); $acme->setGroup( 'Test' ); $acme->addLocalId( Site::ID_INTERWIKI, 'acme' ); $acme->setPath( Site::PATH_LINK, 'http://acme.com/' ); $dewiki = Site::newForType( Site::TYPE_MEDIAWIKI ); $dewiki->setGlobalId( 'dewiki' ); $dewiki->setGroup( 'wikipedia' ); $dewiki->setForward( true ); $dewiki->addLocalId( Site::ID_INTERWIKI, 'wikipedia' ); $dewiki->addLocalId( Site::ID_EQUIVALENT, 'de' ); $dewiki->setPath( Site::PATH_LINK, 'http://de.wikipedia.org/w/' ); $dewiki->setPath( MediaWikiSite::PATH_PAGE, 'http://de.wikipedia.org/wiki/' ); $dewiki->setSource( 'meta.wikimedia.org' ); return array( 'empty' => array( '', array(), ), 'no sites' => array( 'FooBla', array(), ), 'minimal' => array( '' . 'Foo' . '', array( $foo ), ), 'full' => array( '' . 'Foo' . '' . 'acme.com' . 'acme' . 'Test' . 'http://acme.com/' . '' . '' . 'meta.wikimedia.org' . 'dewiki' . 'wikipedia' . 'de' . 'wikipedia' . '' . 'http://de.wikipedia.org/w/' . 'http://de.wikipedia.org/wiki/' . '' . '', array( $foo, $acme, $dewiki ), ), 'skip' => array( '' . 'Foo' . 'Foo' . '' . 'acme.com' . 'acme' . 'boop!' . 'Test' . 'http://acme.com/' . '' . '', array( $foo, $acme ), 1 ), ); } /** * @dataProvider provideImportFromXML */ public function testImportFromXML( $xml, array $expectedSites, $errorCount = 0 ) { $importer = $this->newSiteImporter( $expectedSites, $errorCount ); $importer->importFromXML( $xml ); } public function testImportFromXML_malformed() { $this->setExpectedException( 'Exception' ); $store = $this->getMock( 'SiteStore' ); $importer = new SiteImporter( $store ); $importer->importFromXML( 'THIS IS NOT XML' ); } public function testImportFromFile() { $foo = Site::newForType( Site::TYPE_UNKNOWN ); $foo->setGlobalId( 'Foo' ); $acme = Site::newForType( Site::TYPE_UNKNOWN ); $acme->setGlobalId( 'acme.com' ); $acme->setGroup( 'Test' ); $acme->addLocalId( Site::ID_INTERWIKI, 'acme' ); $acme->setPath( Site::PATH_LINK, 'http://acme.com/' ); $dewiki = Site::newForType( Site::TYPE_MEDIAWIKI ); $dewiki->setGlobalId( 'dewiki' ); $dewiki->setGroup( 'wikipedia' ); $dewiki->setForward( true ); $dewiki->addLocalId( Site::ID_INTERWIKI, 'wikipedia' ); $dewiki->addLocalId( Site::ID_EQUIVALENT, 'de' ); $dewiki->setPath( Site::PATH_LINK, 'http://de.wikipedia.org/w/' ); $dewiki->setPath( MediaWikiSite::PATH_PAGE, 'http://de.wikipedia.org/wiki/' ); $dewiki->setSource( 'meta.wikimedia.org' ); $importer = $this->newSiteImporter( array( $foo, $acme, $dewiki ), 0 ); $file = __DIR__ . '/SiteImporterTest.xml'; $importer->importFromFile( $file ); } /** * @param Site[] $sites * * @return array[] */ private function getSerializedSiteList( $sites ) { $serialized = array(); foreach ( $sites as $site ) { $key = $site->getGlobalId(); $data = unserialize( $site->serialize() ); $serialized[$key] = $data; } return $serialized; } }