diff --git a/_test/db.test.php b/_test/db.test.php new file mode 100644 index 0000000..ea6c2d4 --- /dev/null +++ b/_test/db.test.php @@ -0,0 +1,149 @@ +get(array(),'/doku.php?id=foo'); + + + saveWikiText('testpage',"---- dataentry Testentry ----\n" + . "test1_title: foo|bar\n" + . "----\n",'summary'); + //trigger save to db + $req = new TestRequest(); + $req->get(array(),'/doku.php?id=testpage'); + } + + function test_title_input_id () { + + $test_table = "---- datatable Testtable ----\n" + . "cols: %pageid%, test1\n" + . "filter: test1~ *foo*\n"; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_table'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_table, 0, 0, $handler); + $renderer = new Doku_Renderer_xhtml(); + $plugin->render('xhtml',$renderer,$data); + + $result = $renderer->doc; + + $actual_value = substr($result,strpos($result,'')+24); + $actual_value = substr($actual_value,0,strpos($actual_value,'')); + $expected_value = 'foo|bar'; + $this->assertSame($expected_value,$actual_value); + + $actual_link = substr($result,strpos($result,'')+25); + $actual_link = substr($actual_link,strpos($actual_link,'doku.php')); + $actual_link = substr($actual_link,0,strpos($actual_link,'')); + + $this->assertSame('doku.php?id=testpage" class="wikilink1" title="testpage">testpage',$actual_link); + + } + + function test_title_input_title () { + + $test_table = "---- datatable Testtable ----\n" + . "cols: %pageid%, test1\n" + . "filter: test1~ *bar*\n"; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_table'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_table, 0, 0, $handler); + $renderer = new Doku_Renderer_xhtml(); + $plugin->render('xhtml',$renderer,$data); + + $result = $renderer->doc; + + $actual_value = substr($result,strpos($result,'')+24); + $actual_value = substr($actual_value,0,strpos($actual_value,'')); + $expected_value = 'foo|bar'; + $this->assertSame($expected_value,$actual_value); + + $actual_link = substr($result,strpos($result,'')+25); + $actual_link = substr($actual_link,strpos($actual_link,'doku.php')); + $actual_link = substr($actual_link,0,strpos($actual_link,'')); + + $this->assertSame('doku.php?id=testpage" class="wikilink1" title="testpage">testpage',$actual_link); + } + + function test_title_input_Heading () { + + $test_table = "---- datatable Testtable ----\n" + . "cols: %pageid%, test1\n" + . "filter: test1_title~ *Heading*\n"; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_table'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_table, 0, 0, $handler); + $renderer = new Doku_Renderer_xhtml(); + $plugin->render('xhtml',$renderer,$data); + + $result = $renderer->doc; + + $actual_value = substr($result,strpos($result,'')+24); + $actual_value = substr($actual_value,0,strpos($actual_value,'')); + $expected_value = 'foo|bar'; + $this->assertSame($expected_value,$actual_value); + + $actual_link = substr($result,strpos($result,'')+25); + $actual_link = substr($actual_link,strpos($actual_link,'doku.php')); + $actual_link = substr($actual_link,0,strpos($actual_link,'')); + + $this->assertSame('doku.php?id=testpage" class="wikilink1" title="testpage">testpage',$actual_link); + } + + function test_title_input_stackns () { + + $test_table = "---- datatable Testtable ----\n" + . "cols: %pageid%, test1\n"; + + global $ID; + $ID = 'foo:bar:start'; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_table'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_table, 0, 0, $handler); + $renderer = new Doku_Renderer_xhtml(); + $plugin->render('xhtml',$renderer,$data); + + $result = $renderer->doc; + + $actual_value = substr($result,strpos($result,'')+24); + $actual_value = substr($actual_value,0,strpos($actual_value,'')); + $expected_value = 'foo|bar'; + $this->assertSame($expected_value,$actual_value); + + $actual_link = substr($result,strpos($result,'')+25); + $actual_link = substr($actual_link,strpos($actual_link,'doku.php')); + $actual_link = substr($actual_link,0,strpos($actual_link,'')); + + $this->assertSame('doku.php?id=testpage" class="wikilink1" title="testpage">testpage',$actual_link); + } + +} diff --git a/_test/helper.test.php b/_test/helper.test.php index 939b652..c85c59e 100644 --- a/_test/helper.test.php +++ b/_test/helper.test.php @@ -136,10 +136,10 @@ function testFormatData() { $this->assertEquals('value1, value2, val', $helper->_formatData(array('type' => ''), "value1\n value2\n val", $renderer)); - $this->assertEquals('link: page ', + $this->assertEquals('link: :page ', $helper->_formatData(array('type' => 'page'), "page", $renderer)); - $this->assertEquals('link: page title', + $this->assertEquals('link: :page title', $helper->_formatData(array('type' => 'title'), "page|title", $renderer)); $this->assertEquals('link: page title', diff --git a/_test/syntax_plugin_data_entry.test.php b/_test/syntax_plugin_data_entry.test.php index b1aee65..0b70ef2 100644 --- a/_test/syntax_plugin_data_entry.test.php +++ b/_test/syntax_plugin_data_entry.test.php @@ -2,6 +2,20 @@ require_once DOKU_INC . 'inc/parser/xhtml.php'; +class Doku_Renderer_xhtml_mock extends Doku_Renderer_xhtml { + + function internallink($id, $name = null, $search = null, $returnonly = false, $linktype = 'content') { + $inputvalues = array( + 'id' => $id, + 'name' => $name, + 'search' => $search, + 'returnonly' => $returnonly, + 'linktype' => $linktype + ); + return "" . serialize($inputvalues) . ""; + } +} + /** * @group plugin_data * @group plugins @@ -12,6 +26,10 @@ class syntax_plugin_data_entry_test extends DokuWikiTest { private $exampleEntry; + public function setUp() { + parent::setUp(); + } + function __construct() { $this->exampleEntry = "---- dataentry projects ----\n" . "type : web development\n" @@ -65,36 +83,131 @@ function testHandle() { $this->assertEquals($cols, $result['cols'], 'Cols array corrupted'); } + function test_pageEntry_noTitle() { + $test_entry = '---- dataentry ---- + test1_page: foo + ----'; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_entry'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_entry, 0, 10, $handler); + $renderer = new Doku_Renderer_xhtml_mock(); + $plugin->render('xhtml',$renderer,$data); + $result = $renderer->doc; + $result = substr($result,0,strpos($result,'')); + $result = substr($result,strpos($result,'')+14); + $result = unserialize($result); + + $this->assertSame(':foo',$result['id']); + $this->assertSame(null,$result['name'], 'page does not accept a title. useheading decides'); + } + + function test_pageEntry_withTitle() { + $test_entry = '---- dataentry ---- + test1_page: foo|bar + ----'; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_entry'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_entry, 0, 10, $handler); + $renderer = new Doku_Renderer_xhtml_mock(); + $plugin->render('xhtml',$renderer,$data); + $result = $renderer->doc; + $result = substr($result,0,strpos($result,'')); + $result = substr($result,strpos($result,'')+14); + $result = unserialize($result); + + $this->assertSame(':foo_bar',$result['id'], 'for type page a title becomes part of the id'); + $this->assertSame(null,$result['name'], 'page never accepts a title. useheading decides'); + } + + function test_pageidEntry_noTitle() { + $test_entry = '---- dataentry ---- + test1_pageid: foo + ----'; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_entry'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_entry, 0, 10, $handler); + $renderer = new Doku_Renderer_xhtml_mock(); + $plugin->render('xhtml',$renderer,$data); + $result = $renderer->doc; + $result = substr($result,0,strpos($result,'')); + $result = substr($result,strpos($result,'')+14); + $result = unserialize($result); + + $this->assertSame('foo',$result['id']); + $this->assertSame('foo',$result['name'], 'pageid: use the pageid as title if no title is provided.'); + } + + function test_pageidEntry_withTitle() { + $test_entry = '---- dataentry ---- + test1_pageid: foo|bar + ----'; + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_entry'); + + $handler = new Doku_Handler(); + $data = $plugin->handle($test_entry, 0, 10, $handler); + $renderer = new Doku_Renderer_xhtml_mock(); + $plugin->render('xhtml',$renderer,$data); + $result = $renderer->doc; + $result = substr($result,0,strpos($result,'')); + $result = substr($result,strpos($result,'')+14); + $result = unserialize($result); + + $this->assertSame('foo',$result['id'], "wrong id handed to internal link"); + $this->assertSame('bar',$result['name'], 'pageid: use the provided title'); + } + function test_titleEntry_noTitle() { $test_entry = '---- dataentry ---- - test_title: bar + test1_title: foo ----'; - $plugin = new syntax_plugin_data_entry(); + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_entry'); $handler = new Doku_Handler(); $data = $plugin->handle($test_entry, 0, 10, $handler); - $renderer = new Doku_Renderer_xhtml(); + $renderer = new Doku_Renderer_xhtml_mock(); $plugin->render('xhtml',$renderer,$data); $result = $renderer->doc; - $result = substr($result,0,strpos($result,'')+4); - $result = substr($result,strpos($result,'assertSame('bar',$result); + $result = substr($result,0,strpos($result,'')); + $result = substr($result,strpos($result,'')+14); + $result = unserialize($result); + + $this->assertSame(':foo',$result['id']); + $this->assertSame(null,$result['name'], 'no title should be given to internal link. Let useheading decide.'); } + function test_titleEntry_withTitle() { $test_entry = '---- dataentry ---- - test_title: link:to:page|TitleOfPage + test3_title: link:to:page|TitleOfPage ----'; - $plugin = new syntax_plugin_data_entry(); + + /** @var syntax_plugin_data_entry $plugin */ + $plugin = plugin_load('syntax','data_entry'); $handler = new Doku_Handler(); $data = $plugin->handle($test_entry, 0, 10, $handler); - $renderer = new Doku_Renderer_xhtml(); + $renderer = new Doku_Renderer_xhtml_mock(); $plugin->render('xhtml',$renderer,$data); $result = $renderer->doc; - $result = substr($result,0,strpos($result,'')+4); - $result = substr($result,strpos($result,'assertSame('TitleOfPage',$result); + $result = substr($result,0,strpos($result,'')); + $result = substr($result,strpos($result,'')+14); + $result = unserialize($result); + + $this->assertSame(':link:to:page',$result['id']); + $this->assertSame('TitleOfPage',$result['name'], 'The Title provided should be the title shown.'); } function test_editToWiki() { diff --git a/helper.php b/helper.php index 5d6c4e4..51752b8 100644 --- a/helper.php +++ b/helper.php @@ -205,6 +205,13 @@ function _resolveData($value, $colname) { return $value; } + public function ensureAbsoluteId($id) { + if (substr($id,0,1) !== ':') { + $id = ':' . $id; + } + return $id; + } + /** * Return XHTML formated data, depending on column type * @@ -232,9 +239,15 @@ function _formatData($column, $value, Doku_Renderer_xhtml $R) { switch($type) { case 'page': $val = $this->_addPrePostFixes($column['type'], $val); + $val = $this->ensureAbsoluteId($val); $outs[] = $R->internallink($val, null, null, true); break; case 'title': + list($id, $title) = explode('|', $val, 2); + $id = $this->_addPrePostFixes($column['type'], $id); + $id = $this->ensureAbsoluteId($id); + $outs[] = $R->internallink($id, $title, null, true); + break; case 'pageid': list($id, $title) = explode('|', $val, 2); @@ -249,6 +262,7 @@ function _formatData($column, $value, Doku_Renderer_xhtml $R) { } $id = $this->_addPrePostFixes($column['type'], $id); + $outs[] = $R->internallink($id, $title, null, true); break; case 'nspage':