gplx/mediawiki/extensions/SemanticMediaWiki/tests/phpunit/Factbox/FactboxTest.php

497 lines
11 KiB
PHP

<?php
namespace SMW\Tests\Factbox;
use MediaWiki\Parser\ParserOutput;
use MediaWiki\Title\Title;
use ReflectionClass;
use SMW\DIProperty;
use SMW\DIWikiPage;
use SMW\Factbox\CheckMagicWords;
use SMW\Factbox\Factbox;
use SMW\ParserData;
use SMW\SemanticData;
use SMW\Tests\PHPUnitCompat;
use SMW\Tests\TestEnvironment;
/**
* @covers \SMW\Factbox\Factbox
* @group semantic-mediawiki
*
* @license GPL-2.0-or-later
* @since 1.9
*
* @author mwjames
*/
class FactboxTest extends \PHPUnit\Framework\TestCase {
use PHPUnitCompat;
private $stringValidator;
private $testEnvironment;
private $displayTitleFinder;
protected function setUp(): void {
parent::setUp();
$this->testEnvironment = new TestEnvironment();
$this->stringValidator = $this->testEnvironment->getUtilityFactory()->newValidatorFactory()->newStringValidator();
$this->testEnvironment->addConfiguration( 'smwgShowFactbox', SMW_FACTBOX_NONEMPTY );
$this->displayTitleFinder = $this->getMockBuilder( '\SMW\DisplayTitleFinder' )
->disableOriginalConstructor()
->getMock();
}
protected function tearDown(): void {
$this->testEnvironment->tearDown();
parent::tearDown();
}
public function testBuildHTML() {
$checkMagicWords = new CheckMagicWords(
[
'smwgShowFactboxEdit' => SMW_FACTBOX_NONEMPTY,
'showFactbox' => SMW_FACTBOX_NONEMPTY
]
);
$parserData = new ParserData(
Title::newFromText( __METHOD__ ),
new ParserOutput()
);
$store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$instance = new Factbox(
$store,
$parserData,
$this->displayTitleFinder
);
$instance->setCheckMagicWords(
$checkMagicWords
);
$reflector = new ReflectionClass( '\SMW\Factbox\Factbox' );
$buildHTML = $reflector->getMethod( 'buildHTML' );
$buildHTML->setAccessible( true );
$this->assertIsString(
$buildHTML->invoke( $instance, $parserData->getSemanticData() )
);
}
public function testTabs() {
$this->assertContains(
'tab-facts-list',
Factbox::tabs( 'Foo' )
);
$this->assertContains(
'tab-facts-attachment',
Factbox::tabs( 'Foo', 'Bar' )
);
$this->assertContains(
'tab-facts-derived',
Factbox::tabs( 'Foo', 'Bar', 'Foobar' )
);
}
/**
* @dataProvider fetchContentDataProvider
*/
public function testFetchContent( $parserData ) {
$store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$instance = new Factbox(
$store,
$parserData,
$this->displayTitleFinder
);
$reflector = new ReflectionClass( '\SMW\Factbox\Factbox' );
$fetchContent = $reflector->getMethod( 'fetchContent' );
$fetchContent->setAccessible( true );
$this->assertIsString(
$fetchContent->invoke( $instance, SMW_FACTBOX_NONEMPTY )
);
$this->assertEmpty(
$fetchContent->invoke( $instance, SMW_FACTBOX_HIDDEN )
);
}
/**
* @dataProvider contentDataProvider
*/
public function testGetContentDataSimulation( $setup, $expected ) {
$checkMagicWords = new CheckMagicWords(
[
'smwgShowFactboxEdit' => SMW_FACTBOX_NONEMPTY,
'showFactbox' => $setup['showFactbox']
]
);
$semanticData = $this->getMockBuilder( '\SMW\SemanticData' )
->disableOriginalConstructor()
->getMock();
$semanticData->expects( $this->any() )
->method( 'hasVisibleSpecialProperties' )
->willReturn( $setup['hasVisibleSpecialProperties'] );
$semanticData->expects( $this->any() )
->method( 'hasVisibleProperties' )
->willReturn( $setup['hasVisibleProperties'] );
$semanticData->expects( $this->any() )
->method( 'isEmpty' )
->willReturn( $setup['isEmpty'] );
$store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$store->expects( $this->any() )
->method( 'getSemanticData' )
->willReturn( $semanticData );
$parserData = $this->getMockBuilder( '\SMW\ParserData' )
->disableOriginalConstructor()
->getMock();
$parserData->expects( $this->any() )
->method( 'getSubject' )
->willReturn( DIWikiPage::newFromText( __METHOD__ ) );
$parserData->expects( $this->any() )
->method( 'getSemanticData' )
->willReturn( null );
// Build Factbox stub object to encapsulate the method
// without the need for other dependencies to occur
$factbox = $this->getMockBuilder( '\SMW\Factbox\Factbox' )
->setConstructorArgs( [
$store,
$parserData,
$this->displayTitleFinder
] )
->setMethods( [ 'buildHTML' ] )
->getMock();
$factbox->setCheckMagicWords(
$checkMagicWords
);
$factbox->expects( $this->any() )
->method( 'buildHTML' )
->willReturn( $setup['invokedContent'] );
$reflector = new ReflectionClass( '\SMW\Factbox\Factbox' );
$fetchContent = $reflector->getMethod( 'fetchContent' );
$fetchContent->setAccessible( true );
$this->assertIsString(
$fetchContent->invoke( $factbox )
);
$this->assertEquals(
$expected,
$fetchContent->invoke( $factbox, $setup['showFactbox'] )
);
}
/**
* Conditional content switcher to test combinations of
* SMW_FACTBOX_NONEMPTY and SMWSemanticData etc.
*
* @return array
*/
public function contentDataProvider() {
$text = __METHOD__;
$provider = [];
$provider[] = [
[
'hasVisibleSpecialProperties' => true,
'hasVisibleProperties' => true,
'isEmpty' => false,
'showFactbox' => SMW_FACTBOX_NONEMPTY,
'invokedContent' => $text,
],
$text // expected return
];
$provider[] = [
[
'hasVisibleSpecialProperties' => true,
'hasVisibleProperties' => true,
'isEmpty' => true,
'showFactbox' => SMW_FACTBOX_NONEMPTY,
'invokedContent' => $text,
],
$text // expected return
];
$provider[] = [
[
'hasVisibleSpecialProperties' => false,
'hasVisibleProperties' => true,
'isEmpty' => false,
'showFactbox' => SMW_FACTBOX_SPECIAL,
'invokedContent' => $text,
],
'' // expected return
];
$provider[] = [
[
'hasVisibleSpecialProperties' => false,
'hasVisibleProperties' => false,
'isEmpty' => false,
'showFactbox' => SMW_FACTBOX_NONEMPTY,
'invokedContent' => $text,
],
'' // expected return
];
$provider[] = [
[
'hasVisibleSpecialProperties' => true,
'hasVisibleProperties' => false,
'isEmpty' => false,
'showFactbox' => SMW_FACTBOX_NONEMPTY,
'invokedContent' => $text,
],
'' // expected return
];
return $provider;
}
public function testGetTableHeader() {
$checkMagicWords = new CheckMagicWords(
[
'smwgShowFactboxEdit' => SMW_FACTBOX_NONEMPTY,
'showFactbox' => SMW_FACTBOX_NONEMPTY
]
);
$title = Title::newFromText( __METHOD__ );
$parserData = new ParserData(
$title,
new ParserOutput()
);
$parserData->setSemanticData( new SemanticData( DIWikiPage::newFromTitle( $title ) ) );
$parserData->getSemanticData()->addPropertyObjectValue(
new DIProperty( 'Foo' ),
DIWikiPage::newFromTitle( $title )
);
$store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$instance = new Factbox(
$store,
$parserData,
$this->displayTitleFinder
);
$instance->setCheckMagicWords(
$checkMagicWords
);
$instance->doBuild();
$this->stringValidator->assertThatStringContains(
[
'span class="rdflink"'
],
$instance->getContent()
);
}
/**
* @dataProvider tableContentDataProvider
*/
public function testGetTableContent( $test, $expected ) {
$checkMagicWords = new CheckMagicWords(
[
'smwgShowFactboxEdit' => SMW_FACTBOX_NONEMPTY,
'showFactbox' => SMW_FACTBOX_NONEMPTY
]
);
$title = Title::newFromText( __METHOD__ );
$parserData = new ParserData(
$title,
new ParserOutput()
);
$store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$property = $this->getMockBuilder( '\SMW\DIProperty' )
->disableOriginalConstructor()
->getMock();
$property->expects( $this->any() )
->method( 'isUserDefined' )
->willReturn( $test['isUserDefined'] );
$property->expects( $this->any() )
->method( 'findPropertyTypeID' )
->willReturn( '_wpg' );
$property->expects( $this->any() )
->method( 'isShown' )
->willReturn( $test['isShown'] );
$property->expects( $this->any() )
->method( 'getLabel' )
->willReturn( 'Quuey' );
$property->expects( $this->any() )
->method( 'getDIType' )
->willReturn( \SMWDataItem::TYPE_PROPERTY );
$parserData->setSemanticData(
new SemanticData( DIWikiPage::newFromTitle( $title ) )
);
$parserData->getSemanticData()->addPropertyObjectValue(
$property,
DIWikiPage::newFromTitle( $title )
);
$instance = new Factbox(
$store,
$parserData,
$this->displayTitleFinder
);
$instance->setCheckMagicWords(
$checkMagicWords
);
$instance->doBuild();
$this->stringValidator->assertThatStringContains(
$expected,
$instance->getContent()
);
}
public function tableContentDataProvider() {
$provider = [];
$provider[] = [
[
'isShown' => true,
'isUserDefined' => true,
],
[ 'class="smw-factbox-value"' ]
];
$provider[] = [
[
'isShown' => false,
'isUserDefined' => true,
],
''
];
$provider[] = [
[
'isShown' => true,
'isUserDefined' => false,
],
[ 'class="smw-factbox-value"' ]
];
$provider[] = [
[
'isShown' => false,
'isUserDefined' => false,
],
''
];
return $provider;
}
/**
* @return array
*/
public function fetchContentDataProvider() {
$title = Title::newFromText( __METHOD__ );
$provider = [];
$semanticData = $this->getMockBuilder( '\SMW\SemanticData' )
->disableOriginalConstructor()
->getMock();
$semanticData->expects( $this->any() )
->method( 'getPropertyValues' )
->willReturn( [] );
$semanticData->expects( $this->any() )
->method( 'isEmpty' )
->willReturn( false );
$parserData = new ParserData(
$title,
new ParserOutput()
);
$parserData->setSemanticData( $semanticData );
$provider[] = [ $parserData ];
$semanticData = $this->getMockBuilder( '\SMW\SemanticData' )
->disableOriginalConstructor()
->getMock();
$semanticData->expects( $this->any() )
->method( 'getPropertyValues' )
->willReturn( [ new DIProperty( '_SKEY' ) ] );
$semanticData->expects( $this->any() )
->method( 'isEmpty' )
->willReturn( false );
$parserData = new ParserData(
$title,
new ParserOutput()
);
$parserData->setSemanticData( $semanticData );
$provider[] = [ $parserData ];
return $provider;
}
protected function setupParserOutput( $semanticData ) {
$parserOutput = new ParserOutput();
$parserOutput->setExtensionData( 'smwdata', $semanticData );
return $parserOutput;
}
}