diff --git a/_test/tests/inc/parserutils_set_metadata.test.php b/_test/tests/inc/parserutils_set_metadata.test.php new file mode 100644 index 0000000000000000000000000000000000000000..e184a5d2e293b9d9646f7e6deed1203b21555221 --- /dev/null +++ b/_test/tests/inc/parserutils_set_metadata.test.php @@ -0,0 +1,75 @@ +<?php +/** + * Unit Test for inc/common.php - pageinfo() + * + * @author Christopher Smith <chris@jalakai.co.uk> + */ +class parserutils_set_metadata_test extends DokuWikiTest { + // the id used for this test case + private $id; + + function helper_prepare_users($id = 1){ + global $INFO, $USERINFO; + $_SERVER['REMOTE_ADDR'] = '1.2.3.4'; + if($id == 2){ + $USERINFO = array( + 'pass' => '179ad45c6ce2cb97cf1029e212046e81', + 'name' => 'Tester2', + 'mail' => 'tester2@example.com', + 'grps' => array ('user'), + ); + $INFO['userinfo'] = $USERINFO; + $_SERVER['REMOTE_USER'] = 'tester2'; + }else{ + global $USERINFO, $INFO; + $USERINFO = array( + 'pass' => '179ad45c6ce2cb97cf1029e212046e81', + 'name' => 'Tester1', + 'mail' => 'tester1@example.com', + 'grps' => array ('admin','user'), + ); + $INFO['userinfo'] = $USERINFO; + $_SERVER['REMOTE_USER'] = '1'; + } + } + /** + * test array merge, including contributors with numeric keys and array data overwritting + */ + function test_array_replace(){ + // prepare user + $this->helper_prepare_users(1); + + // prepare page + $this->id = 'test:set_metadata_array_replace'; + saveWikiText($this->id, 'Test', 'Test data setup'); + $meta = p_get_metadata($this->id); + + $this->assertEquals('1', $meta['user'], 'Initial page has wrong user ID'); + // $this->assertEquals(empty($meta['contributor']), true, 'Initial page should have no contributors'); + + // first revision with numeric user + saveWikiText($this->id, 'Test1', 'Test first edit'); + $meta = p_get_metadata($this->id); + + $last_edit_date = $meta['date']['modified']; + $this->assertEquals(array('1'=>'Tester1'), $meta['contributor'], 'First edit contributors error'); + + // second revision with alphabetic user + sleep(1); // To generate a different timestamp + $this->helper_prepare_users(2); + saveWikiText($this->id, 'Test2', 'Test second edit'); + $meta = p_get_metadata($this->id); + + $this->assertNotEquals($last_edit_date, $meta['date']['modified'], 'First edit date merge error'); + $this->assertEquals(array('tester2'=>'Tester2', '1'=>'Tester1'), $meta['contributor'], 'Second edit contributors error'); + + // third revision with the first user + $this->helper_prepare_users(1); + saveWikiText($this->id, 'Test3', 'Test third edit'); + $meta = p_get_metadata($this->id); + + $this->assertEquals(array('tester2'=>'Tester2', '1'=>'Tester1'), $meta['contributor'], 'Third edit contributors error'); + } +} + +//Setup VIM: ex: et ts=4 : diff --git a/inc/parserutils.php b/inc/parserutils.php index 92a5047730f31784be497484bf8b6df6e1ff9503..648b182602e13860543bbde0b3d82bb368658040 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -337,13 +337,13 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){ foreach ($value as $subkey => $subvalue){ if(isset($meta['current'][$key][$subkey]) && is_array($meta['current'][$key][$subkey])) { - $meta['current'][$key][$subkey] = array_merge($meta['current'][$key][$subkey], (array)$subvalue); + $meta['current'][$key][$subkey] = array_replace($meta['current'][$key][$subkey], (array)$subvalue); } else { $meta['current'][$key][$subkey] = $subvalue; } if($persistent) { if(isset($meta['persistent'][$key][$subkey]) && is_array($meta['persistent'][$key][$subkey])) { - $meta['persistent'][$key][$subkey] = array_merge($meta['persistent'][$key][$subkey], (array)$subvalue); + $meta['persistent'][$key][$subkey] = array_replace($meta['persistent'][$key][$subkey], (array)$subvalue); } else { $meta['persistent'][$key][$subkey] = $subvalue; } @@ -355,10 +355,10 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){ // these keys, must have subkeys - a legitimate value must be an array if (is_array($value)) { - $meta['current'][$key] = !empty($meta['current'][$key]) ? array_merge((array)$meta['current'][$key],$value) : $value; + $meta['current'][$key] = !empty($meta['current'][$key]) ? array_replace((array)$meta['current'][$key],$value) : $value; if ($persistent) { - $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ? array_merge((array)$meta['persistent'][$key],$value) : $value; + $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ? array_replace((array)$meta['persistent'][$key],$value) : $value; } }