| Current File : /home/jvzmxxx/wiki/extensions/Wikibase/repo/tests/phpunit/maintenance/dumpRdfTest.php |
<?php
namespace Wikibase\Test;
use DataValues\StringValue;
use HashSiteStore;
use MediaWikiLangTestCase;
use TestSites;
use Wikibase\DataModel\Entity\EntityDocument;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Entity\Property;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\DataModel\Reference;
use Wikibase\DataModel\ReferenceList;
use Wikibase\DataModel\Services\Entity\NullEntityPrefetcher;
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookupException;
use Wikibase\DataModel\SiteLink;
use Wikibase\DataModel\SiteLinkList;
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\DataModel\Snak\SnakList;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\DataModel\Statement\StatementList;
use Wikibase\DataModel\Term\AliasGroup;
use Wikibase\DataModel\Term\AliasGroupList;
use Wikibase\DataModel\Term\Fingerprint;
use Wikibase\DataModel\Term\Term;
use Wikibase\DataModel\Term\TermList;
use Wikibase\DumpRdf;
use Wikibase\Lib\Tests\MockRepository;
use Wikibase\Rdf\RdfVocabulary;
use Wikibase\Repo\Tests\MockEntityPerPage;
use Wikibase\Repo\WikibaseRepo;
/**
* @covers Wikibase\DumpRdf
*
* @group WikibaseRepo
* @group Wikibase
*
* @license GPL-2.0+
* @author Addshore
*/
class DumpRdfTest extends MediaWikiLangTestCase {
public function testScript() {
$dumpScript = new DumpRdf();
$mockRepo = new MockRepository();
$mockEntityPerPage = new MockEntityPerPage();
$snakList = new SnakList();
$snakList->addSnak( new PropertySomeValueSnak( new PropertyId( 'P12' ) ) );
$snakList->addSnak( new PropertyValueSnak( new PropertyId( 'P12' ), new StringValue( 'stringVal' ) ) );
/** @var EntityDocument[] $testEntities */
$testEntities = array(
new Item( new ItemId( 'Q1' ) ),
new Property( new PropertyId( 'P1' ), null, 'string' ),
new Property(
new PropertyId( 'P12' ),
null,
'string',
new StatementList( array(
new Statement(
// P999 is non existent thus the datatype will not be present
new PropertySomeValueSnak( new PropertyId( 'P999' ) ),
null,
null,
'GUID1'
)
) )
),
new Item(
new ItemId( 'Q2' ),
new Fingerprint(
new TermList( array(
new Term( 'en', 'en-label' ),
new Term( 'de', 'de-label' ),
) ),
new TermList( array(
new Term( 'fr', 'en-desc' ),
new Term( 'de', 'de-desc' ),
) ),
new AliasGroupList( array(
new AliasGroup( 'en', array( 'ali1', 'ali2' ) ),
new AliasGroup( 'dv', array( 'ali11', 'ali22' ) )
) )
),
new SiteLinkList( array(
new SiteLink( 'enwiki', 'Berlin' ),
new SiteLink( 'dewiki', 'England', array( new ItemId( 'Q1' ) ) )
) ),
new StatementList( array(
new Statement(
new PropertySomeValueSnak( new PropertyId( 'P12' ) ),
null,
null,
'GUID1'
),
new Statement(
new PropertySomeValueSnak( new PropertyId( 'P12' ) ),
$snakList,
new ReferenceList( array(
new Reference( array(
new PropertyValueSnak( new PropertyId( 'P12' ), new StringValue( 'refSnakVal' ) ),
new PropertyNoValueSnak( new PropertyId( 'P12' ) ),
) ),
) ),
'GUID2'
)
) )
),
new Item(
new ItemId( 'Q4' ),
null,
new SiteLinkList( array(
new SiteLink( 'enwiki', 'San Jose' ),
new SiteLink( 'dewiki', 'USA' )
) ),
null
),
);
foreach ( $testEntities as $key => $testEntity ) {
$mockRepo->putEntity( $testEntity, $key, '20000101000000' );
$mockEntityPerPage->addEntityPage( $testEntity->getId(), $key );
}
// Note: We are testing with the actual RDF bindings, so we can check for actual RDF output.
$rdfBuilder = WikibaseRepo::getDefaultInstance()->getValueSnakRdfBuilderFactory();
$dumpScript->setServices(
$mockEntityPerPage,
new NullEntityPrefetcher(),
new HashSiteStore( TestSites::getSites() ),
$this->getMockPropertyDataTypeLookup(),
$rdfBuilder,
$mockRepo,
new RdfVocabulary( 'fooUri/', 'acme/EntityData/' )
);
$logFileName = tempnam( sys_get_temp_dir(), "Wikibase-DumpRdfTest" );
$outFileName = tempnam( sys_get_temp_dir(), "Wikibase-DumpRdfTest" );
$dumpScript->loadParamsAndArgs(
null,
array(
'log' => $logFileName,
'output' => $outFileName,
'format' => 'n-triples',
)
);
$dumpScript->execute();
$expectedLog = file_get_contents( __DIR__ . '/../data/maintenance/dumpRdf-log.txt' );
$expectedOut = file_get_contents( __DIR__ . '/../data/maintenance/dumpRdf-out.txt' );
$actualOut = file_get_contents( $outFileName );
$actualOut = preg_replace(
'/<http:\/\/wikiba.se\/ontology-beta#Dump> <http:\/\/schema.org\/dateModified> "[^"]+"/',
"<http://wikiba.se/ontology-beta#Dump> <http://schema.org/dateModified> \"2015-01-01T00:00:00Z\"",
$actualOut
);
$this->assertEquals(
$this->fixLineEndings( $expectedLog ),
$this->fixLineEndings( file_get_contents( $logFileName ) )
);
$this->assertEquals(
$this->fixLineEndings( $expectedOut ),
$this->fixLineEndings( $actualOut )
);
}
/**
* @return PropertyDataTypeLookup
*/
private function getMockPropertyDataTypeLookup() {
$mockDataTypeLookup = $this->getMock( PropertyDataTypeLookup::class );
$mockDataTypeLookup->expects( $this->any() )
->method( 'getDataTypeIdForProperty' )
->will( $this->returnCallback( function( PropertyId $id ) {
if ( $id->getSerialization() === 'P999' ) {
throw new PropertyDataTypeLookupException( $id );
}
return 'string';
} ) );
return $mockDataTypeLookup;
}
private function fixLineEndings( $string ) {
return preg_replace( '~(*BSR_ANYCRLF)\R~', "\n", $string );
}
}