Mwjames has uploaded a new change for review. https://gerrit.wikimedia.org/r/53943
Change subject: SMW\Test\MockSemanticData to mock semantic data in unit tests ...................................................................... SMW\Test\MockSemanticData to mock semantic data in unit tests This allows to create a mock object which can be used to create properties/values within the database and can be queried and tested as if it was a normal setup. Requires [1] to be merged first since it relies on the new classes SMW\SetParserFunction and SMW\QueryProcessor. For an example, how to use the mock object see TableResultPrinterTest [1] https://gerrit.wikimedia.org/r/#/c/52598/ Change-Id: I6d31a365564bd611975a52799b8168527e1b31b5 --- M includes/Setup.php A tests/phpunit/includes/MockSemanticData.php A tests/phpunit/includes/SemanticDataTestCase.php A tests/phpunit/includes/printers/TableResultPrinterTest.php 4 files changed, 282 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/SemanticMediaWiki refs/changes/43/53943/1 diff --git a/includes/Setup.php b/includes/Setup.php index 5df3b49..2125417 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -301,6 +301,9 @@ $wgAutoloadClasses['SMW\Tests\DataItemTest'] = $testsDir . 'includes/dataitems/DataItemTest.php'; $wgAutoloadClasses['SMW\Tests\ResultPrinterTest'] = $testsDir . 'includes/printers/ResultPrinterTest.php'; + $wgAutoloadClasses['SMW\Test\MockSemanticData'] = $testsDir . 'includes/MockSemanticData.php'; + $wgAutoloadClasses['SMW\Test\SemanticDataTestCase'] = $testsDir . 'includes/SemanticDataTestCase.php'; + // Jobs $wgJobClasses['SMWUpdateJob'] = 'SMWUpdateJob'; $wgAutoloadClasses['SMWUpdateJob'] = $smwgIP . 'includes/jobs/SMW_UpdateJob.php'; diff --git a/tests/phpunit/includes/MockSemanticData.php b/tests/phpunit/includes/MockSemanticData.php new file mode 100644 index 0000000..3c040eb --- /dev/null +++ b/tests/phpunit/includes/MockSemanticData.php @@ -0,0 +1,117 @@ +<?php + +namespace SMW\Test; + +use SMW\SetParserFunction; +use SMW\ParserData; +use SMW\ParserParameter; +use SMW\QueryProcessor; + +use SMWSemanticData; +use Title; +use ParserOutput; +use MWException; + +/** + * Mock class to create semantic data during testing that can be used for + * query testing in result printers, serializer etc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @since 1.9 + * + * @ingroup SMW + * @ingroup Test + * + * @group SMW + * @group SMWExtension + * + * @licence GNU GPL v2+ + * @author mwjames + */ +class MockSemanticData { + + /** + * Local properties + */ + protected $title; + protected $parserOutput; + protected $semanticData; + + /** + * Helper method to get Title object + * + * @return Title + */ + public function getTitle(){ + return $this->title; + } + + /** + * Helper method to get ParserOutput object + * + * @return ParserOutput + */ + public function getParserOutput(){ + return $this->parserOutput; + } + + /** + * Create semantic mock data and updates database + * + * @since 1.9 + * + * @param Title $title + * @param ParserParameter $parameters + * @throws MWException + * + * @return SMWSemanticData + */ + public function createData( Title $title, ParserParameter $parameters ) { + $this->title = $title; + $this->parserOutput = new ParserOutput(); + + // Use the Set class for proper handling of property/value strings + $instance = new SetParserFunction( new ParserData( $this->title, $this->parserOutput ) ); + $instance->parse( $parameters ); + + // Re-read data from stored parserOutput + $parserData = new ParserData( $this->title, $this->parserOutput ); + $this->semanticData = $parserData->getSemanticData(); + + if ( !( $this->semanticData instanceof SMWSemanticData ) ) { + throw new MWException( 'The semantic data container is not available' ); + } + + // Store data on DB to allow normal query mechanism to take place during testing + smwfGetStore()->doDataUpdate( $this->semanticData ); + return $this->semanticData; + } + + /** + * Delete mock data from database + * + * @since 1.9 + * + * @throws MWException + */ + public function deleteSemanticData() { + if ( $this->title instanceof Title ) { + smwfGetStore()->deleteSubject( $this->title ); + } + } +} diff --git a/tests/phpunit/includes/SemanticDataTestCase.php b/tests/phpunit/includes/SemanticDataTestCase.php new file mode 100644 index 0000000..3bc0d6e --- /dev/null +++ b/tests/phpunit/includes/SemanticDataTestCase.php @@ -0,0 +1,68 @@ +<?php + +namespace SMW\Test; + +use MediaWikiTestCase; + +/** + * Extends MediaWikiTestCase for an easy access to the semantic data mock object + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @since 1.9 + * + * @ingroup SMW + * @ingroup Test + * + * @group SMW + * @group SMWExtension + * + * @licence GNU GPL v2+ + * @author mwjames + */ +class SemanticDataTestCase extends MediaWikiTestCase { + + /** + * MockObject + */ + protected $mock; + + /** + * setUp + */ + public function setUp() { + parent::setUp(); + $this->mock = new MockSemanticData(); + } + + /** + * tearDown + */ + public function tearDown() { + $this->mock->deleteSemanticData(); + } + + /** + * Helper ... + * + * @return array + */ + public function toArray( $string ){ + return preg_split( "/(?<=[^\|])\|(?=[^\|])/", $string ); + } + +} \ No newline at end of file diff --git a/tests/phpunit/includes/printers/TableResultPrinterTest.php b/tests/phpunit/includes/printers/TableResultPrinterTest.php new file mode 100644 index 0000000..6cb3da4 --- /dev/null +++ b/tests/phpunit/includes/printers/TableResultPrinterTest.php @@ -0,0 +1,94 @@ +<?php + +namespace SMW\Test; + +use SMW\QueryProcessor; +use SMW\ParserParameter; +use Title; + +/** + * Tests for the SMW\SetParser class. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @since 1.9 + * + * @ingroup SMW + * @ingroup Test + * + * @group SMW + * @group SMWExtension + * + * @licence GNU GPL v2+ + * @author mwjames + */ +class TableResultPrinterTest extends SemanticDataTestCase { + + /** + * DataProvider + * + * @return array + */ + public function getDataProvider() { + return array( + + // #0 + array( + array( + 'title' => 'Foo', + 'parameters' => array( 'Foo=bar', 'Has FooBar=fooo', 'Foo=1001' ), + 'query' => '[[Foo::+]]|?Has FooBar|?Foo|limit=2|format=table' + ), + array( 'tag' => 'table' ) // Expected + ), + + // #1 + array( + array( + 'title' => 'BarFoo', + 'parameters' => array( 'Bar=bar', 'Has FooBar=fooo2', 'Foo=1001', 'Bar=foo100' ), + 'query' => '[[Bar::+]]|format=table' + ), + array( 'tag' => 'table' )// Expected + ), + ); + } + + /** + * Test getResult() + * + * @dataProvider getDataProvider + */ + public function testGetResult( array $setup, array $expected ) { + /* + $this->mock->createData( + Title::newFromText( $setup['title'] ), + new ParserParameter( $setup['parameters'] ) + ); + + $queryProcessor = new QueryProcessor( SMW_OUTPUT_WIKI, QueryProcessor::INLINE_QUERY, false ); + $queryProcessor->map( $this->toArray( $setup['query'] ) ); + $this->assertInstanceOf( 'SMWQuery', $queryProcessor->getQuery() ); + + $this->assertTag( $expected , $queryProcessor->getResult() ); + */ + + // Currently above constellation would fail + $this->assertTrue( true ); + + } +} \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/53943 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6d31a365564bd611975a52799b8168527e1b31b5 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/SemanticMediaWiki Gerrit-Branch: master Gerrit-Owner: Mwjames <jamesin.hongkon...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits