summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/PagePropsTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/PagePropsTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/PagePropsTest.php303
1 files changed, 303 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/PagePropsTest.php b/www/wiki/tests/phpunit/includes/PagePropsTest.php
new file mode 100644
index 00000000..f602cdab
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/PagePropsTest.php
@@ -0,0 +1,303 @@
+<?php
+
+/**
+ * @covers PageProps
+ *
+ * @group Database
+ * ^--- tell jenkins this test needs the database
+ *
+ * @group medium
+ * ^--- tell phpunit that these test cases may take longer than 2 seconds.
+ */
+class PagePropsTest extends MediaWikiLangTestCase {
+
+ /**
+ * @var Title $title1
+ */
+ private $title1;
+
+ /**
+ * @var Title $title2
+ */
+ private $title2;
+
+ /**
+ * @var array $the_properties
+ */
+ private $the_properties;
+
+ protected function setUp() {
+ global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+ parent::setUp();
+
+ $wgExtraNamespaces[12312] = 'Dummy';
+ $wgExtraNamespaces[12313] = 'Dummy_talk';
+
+ $wgNamespaceContentModels[12312] = 'DUMMY';
+ $wgContentHandlers['DUMMY'] = 'DummyContentHandlerForTesting';
+
+ MWNamespace::clearCaches();
+ $wgContLang->resetNamespaces(); # reset namespace cache
+
+ if ( !$this->the_properties ) {
+ $this->the_properties = [
+ "property1" => "value1",
+ "property2" => "value2",
+ "property3" => "value3",
+ "property4" => "value4"
+ ];
+ }
+
+ if ( !$this->title1 ) {
+ $page = $this->createPage(
+ 'PagePropsTest_page_1',
+ "just a dummy page",
+ CONTENT_MODEL_WIKITEXT
+ );
+ $this->title1 = $page->getTitle();
+ $page1ID = $this->title1->getArticleID();
+ $this->setProperties( $page1ID, $this->the_properties );
+ }
+
+ if ( !$this->title2 ) {
+ $page = $this->createPage(
+ 'PagePropsTest_page_2',
+ "just a dummy page",
+ CONTENT_MODEL_WIKITEXT
+ );
+ $this->title2 = $page->getTitle();
+ $page2ID = $this->title2->getArticleID();
+ $this->setProperties( $page2ID, $this->the_properties );
+ }
+ }
+
+ protected function tearDown() {
+ global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+ parent::tearDown();
+
+ unset( $wgExtraNamespaces[12312] );
+ unset( $wgExtraNamespaces[12313] );
+
+ unset( $wgNamespaceContentModels[12312] );
+ unset( $wgContentHandlers['DUMMY'] );
+
+ MWNamespace::clearCaches();
+ $wgContLang->resetNamespaces(); # reset namespace cache
+ }
+
+ /**
+ * Test getting a single property from a single page. The property was
+ * set in setUp().
+ */
+ public function testGetSingleProperty() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $result = $pageProps->getProperties( $this->title1, "property1" );
+ $this->assertArrayHasKey( $page1ID, $result, "Found property" );
+ $this->assertEquals( $result[$page1ID], "value1", "Get property" );
+ }
+
+ /**
+ * Test getting a single property from multiple pages. The property was
+ * set in setUp().
+ */
+ public function testGetSinglePropertyMultiplePages() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $page2ID = $this->title2->getArticleID();
+ $titles = [
+ $this->title1,
+ $this->title2
+ ];
+ $result = $pageProps->getProperties( $titles, "property1" );
+ $this->assertArrayHasKey( $page1ID, $result, "Found page 1 property" );
+ $this->assertArrayHasKey( $page2ID, $result, "Found page 2 property" );
+ $this->assertEquals( $result[$page1ID], "value1", "Get property page 1" );
+ $this->assertEquals( $result[$page2ID], "value1", "Get property page 2" );
+ }
+
+ /**
+ * Test getting multiple properties from multiple pages. The properties
+ * were set in setUp().
+ */
+ public function testGetMultiplePropertiesMultiplePages() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $page2ID = $this->title2->getArticleID();
+ $titles = [
+ $this->title1,
+ $this->title2
+ ];
+ $properties = [
+ "property1",
+ "property2"
+ ];
+ $result = $pageProps->getProperties( $titles, $properties );
+ $this->assertArrayHasKey( $page1ID, $result, "Found page 1 property" );
+ $this->assertArrayHasKey( "property1", $result[$page1ID], "Found page 1 property 1" );
+ $this->assertArrayHasKey( "property2", $result[$page1ID], "Found page 1 property 2" );
+ $this->assertArrayHasKey( $page2ID, $result, "Found page 2 property" );
+ $this->assertArrayHasKey( "property1", $result[$page2ID], "Found page 2 property 1" );
+ $this->assertArrayHasKey( "property2", $result[$page2ID], "Found page 2 property 2" );
+ $this->assertEquals( $result[$page1ID]["property1"], "value1", "Get page 1 property 1" );
+ $this->assertEquals( $result[$page1ID]["property2"], "value2", "Get page 1 property 2" );
+ $this->assertEquals( $result[$page2ID]["property1"], "value1", "Get page 2 property 1" );
+ $this->assertEquals( $result[$page2ID]["property2"], "value2", "Get page 2 property 2" );
+ }
+
+ /**
+ * Test getting all properties from a single page. The properties were
+ * set in setUp(). The properties retrieved from the page may include
+ * additional properties not set in the test case that are added by
+ * other extensions. Therefore, rather than checking to see if the
+ * properties that were set in the test case exactly match the
+ * retrieved properties, we need to check to see if they are a
+ * subset of the retrieved properties. Since this version of PHPUnit
+ * does not yet include assertArraySubset(), we needed to code the
+ * equivalent functionality.
+ */
+ public function testGetAllProperties() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $result = $pageProps->getAllProperties( $this->title1 );
+ $this->assertArrayHasKey( $page1ID, $result, "Found properties" );
+ $properties = $result[$page1ID];
+ $patched = array_replace_recursive( $properties, $this->the_properties );
+ $this->assertEquals( $patched, $properties, "Get all properties" );
+ }
+
+ /**
+ * Test getting all properties from multiple pages. The properties were
+ * set in setUp(). See getAllProperties() above for more information.
+ */
+ public function testGetAllPropertiesMultiplePages() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $page2ID = $this->title2->getArticleID();
+ $titles = [
+ $this->title1,
+ $this->title2
+ ];
+ $result = $pageProps->getAllProperties( $titles );
+ $this->assertArrayHasKey( $page1ID, $result, "Found page 1 properties" );
+ $this->assertArrayHasKey( $page2ID, $result, "Found page 2 properties" );
+ $properties1 = $result[$page1ID];
+ $patched = array_replace_recursive( $properties1, $this->the_properties );
+ $this->assertEquals( $patched, $properties1, "Get all properties page 1" );
+ $properties2 = $result[$page2ID];
+ $patched = array_replace_recursive( $properties2, $this->the_properties );
+ $this->assertEquals( $patched, $properties2, "Get all properties page 2" );
+ }
+
+ /**
+ * Test caching when retrieving single properties by getting a property,
+ * saving a new value for the property, then getting the property
+ * again. The cached value for the property rather than the new value
+ * of the property should be returned.
+ */
+ public function testSingleCache() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $value1 = $pageProps->getProperties( $this->title1, "property1" );
+ $this->setProperty( $page1ID, "property1", "another value" );
+ $value2 = $pageProps->getProperties( $this->title1, "property1" );
+ $this->assertEquals( $value1, $value2, "Single cache" );
+ }
+
+ /**
+ * Test caching when retrieving all properties by getting all
+ * properties, saving a new value for a property, then getting all
+ * properties again. The cached value for the properties rather than the
+ * new value of the properties should be returned.
+ */
+ public function testMultiCache() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $properties1 = $pageProps->getAllProperties( $this->title1 );
+ $this->setProperty( $page1ID, "property1", "another value" );
+ $properties2 = $pageProps->getAllProperties( $this->title1 );
+ $this->assertEquals( $properties1, $properties2, "Multi Cache" );
+ }
+
+ /**
+ * Test that getting all properties clears the single properties
+ * that have been cached by getting a property, saving a new value for
+ * the property, getting all properties (which clears the cached single
+ * properties), then getting the property again. The new value for the
+ * property rather than the cached value of the property should be
+ * returned.
+ */
+ public function testClearCache() {
+ $pageProps = PageProps::getInstance();
+ $page1ID = $this->title1->getArticleID();
+ $pageProps->getProperties( $this->title1, "property1" );
+ $new_value = "another value";
+ $this->setProperty( $page1ID, "property1", $new_value );
+ $pageProps->getAllProperties( $this->title1 );
+ $result = $pageProps->getProperties( $this->title1, "property1" );
+ $this->assertArrayHasKey( $page1ID, $result, "Found property" );
+ $this->assertEquals( $result[$page1ID], "another value", "Clear cache" );
+ }
+
+ protected function createPage( $page, $text, $model = null ) {
+ if ( is_string( $page ) ) {
+ if ( !preg_match( '/:/', $page ) &&
+ ( $model === null || $model === CONTENT_MODEL_WIKITEXT )
+ ) {
+ $ns = $this->getDefaultWikitextNS();
+ $page = MWNamespace::getCanonicalName( $ns ) . ':' . $page;
+ }
+
+ $page = Title::newFromText( $page );
+ }
+
+ if ( $page instanceof Title ) {
+ $page = new WikiPage( $page );
+ }
+
+ if ( $page->exists() ) {
+ $page->doDeleteArticle( "done" );
+ }
+
+ $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
+ $page->doEditContent( $content, "testing", EDIT_NEW );
+
+ return $page;
+ }
+
+ protected function setProperties( $pageID, $properties ) {
+ $rows = [];
+
+ foreach ( $properties as $propertyName => $propertyValue ) {
+ $row = [
+ 'pp_page' => $pageID,
+ 'pp_propname' => $propertyName,
+ 'pp_value' => $propertyValue
+ ];
+
+ $rows[] = $row;
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace(
+ 'page_props',
+ [
+ [
+ 'pp_page',
+ 'pp_propname'
+ ]
+ ],
+ $rows,
+ __METHOD__
+ );
+ }
+
+ protected function setProperty( $pageID, $propertyName, $propertyValue ) {
+ $properties = [];
+ $properties[$propertyName] = $propertyValue;
+
+ $this->setProperties( $pageID, $properties );
+ }
+}