setExpectedException( 'InvalidArgumentException' ); new SiteExporter( 'Foo' ); } public function testExportSites() { $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/' ); $tmp = tmpfile(); $exporter = new SiteExporter( $tmp ); $exporter->exportSites( array( $foo, $acme ) ); fseek( $tmp, 0 ); $xml = fread( $tmp, 16*1024 ); $this->assertContains( 'assertContains( '', $xml ); $this->assertContains( 'Foo', $xml ); $this->assertContains( '', $xml ); $this->assertContains( 'acme.com', $xml ); $this->assertContains( 'Test', $xml ); $this->assertContains( 'acme', $xml ); $this->assertContains( 'http://acme.com/', $xml ); $this->assertContains( '', $xml ); // NOTE: HHVM (at least on wmf Jenkins) doesn't like file URLs. $xsdFile = __DIR__ . '/../../../../docs/sitelist-1.0.xsd'; $xsdData = file_get_contents( $xsdFile ); $document = new DOMDocument(); $document->loadXML( $xml, LIBXML_NONET ); $document->schemaValidateSource( $xsdData ); } private function newSiteStore( SiteList $sites ) { $store = $this->getMock( 'SiteStore' ); $store->expects( $this->once() ) ->method( 'saveSites' ) ->will( $this->returnCallback( function ( $moreSites ) use ( $sites ) { foreach ( $moreSites as $site ) { $sites->setSite( $site ); } } ) ); $store->expects( $this->any() ) ->method( 'getSites' ) ->will( $this->returnValue( new SiteList() ) ); return $store; } public function provideRoundTrip() { $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( new SiteList() ), 'some' => array( new SiteList( array( $foo, $acme, $dewiki ) ), ), ); } /** * @dataProvider provideRoundTrip() */ public function testRoundTrip( SiteList $sites ) { $tmp = tmpfile(); $exporter = new SiteExporter( $tmp ); $exporter->exportSites( $sites ); fseek( $tmp, 0 ); $xml = fread( $tmp, 16*1024 ); $actualSites = new SiteList(); $store = $this->newSiteStore( $actualSites ); $importer = new SiteImporter( $store ); $importer->importFromXML( $xml ); $this->assertEquals( $sites, $actualSites ); } }