getMockBuilder( SiteStore::class )->getMock(); $store->expects( $this->once() ) ->method( 'saveSites' ) ->will( $this->returnCallback( function ( $sites ) use ( $expectedSites ) { $this->assertSitesEqual( $expectedSites, $sites ); } ) ); $store->expects( $this->any() ) ->method( 'getSites' ) ->will( $this->returnValue( new SiteList() ) ); $errorHandler = $this->getMockBuilder( Psr\Log\LoggerInterface::class )->getMock(); $errorHandler->expects( $this->exactly( $errorCount ) ) ->method( 'error' ); $importer = new SiteImporter( $store ); $importer->setExceptionCallback( [ $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 [ 'empty' => [ '', [], ], 'no sites' => [ 'FooBla', [], ], 'minimal' => [ '' . 'Foo' . '', [ $foo ], ], 'full' => [ '' . '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/' . '' . '', [ $foo, $acme, $dewiki ], ], 'skip' => [ '' . 'Foo' . 'Foo' . '' . 'acme.com' . 'acme' . 'boop!' . 'Test' . 'http://acme.com/' . '' . '', [ $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->expectException( Exception::class ); $store = $this->getMockBuilder( SiteStore::class )->getMock(); $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( [ $foo, $acme, $dewiki ], 0 ); $file = __DIR__ . '/SiteImporterTest.xml'; $importer->importFromFile( $file ); } /** * @param Site[] $sites * * @return array[] */ private function getSerializedSiteList( $sites ) { $serialized = []; foreach ( $sites as $site ) { $key = $site->getGlobalId(); $data = unserialize( $site->serialize() ); $serialized[$key] = $data; } return $serialized; } }