1<?php
2
3class data_dummy_renderer extends Doku_Renderer_xhtml{
4
5    function internallink($id, $title = '', $ignored=null, $ignored2=false, $linktype = 'content') {
6        return "link: $id $title";
7    }
8
9}
10
11/**
12 * @group plugin_data
13 * @group plugins
14 */
15class helper_plugin_data_test extends DokuWikiTest {
16
17    protected $pluginsEnabled = array('data', 'sqlite');
18
19    public static function setUpBeforeClass(){
20        parent::setUpBeforeClass();
21        // copy our own config files to the test directory
22        TestUtils::rcopy(dirname(DOKU_CONF), dirname(__FILE__).'/conf');
23    }
24
25    function testCleanData() {
26
27        $helper = new helper_plugin_data();
28
29        $this->assertEquals('', $helper->_cleanData('   ', ''));
30        $this->assertEquals('', $helper->_cleanData('', ''));
31        $this->assertEquals('', $helper->_cleanData(null, ''));
32        $this->assertEquals('', $helper->_cleanData(false, ''));
33
34        $this->assertEquals('', $helper->_cleanData('', 'dt'));
35        $this->assertEquals('', $helper->_cleanData('this is not a date', 'dt'));
36        $this->assertEquals('1234-01-01', $helper->_cleanData('1234-1-1', 'dt'));
37        $this->assertEquals('1234-01-01', $helper->_cleanData('1234-01-01', 'dt'));
38        $this->assertEquals('%now%', $helper->_cleanData('%now%', 'dt'));
39        $this->assertEquals('', $helper->_cleanData('1234-01-011', 'dt'));
40
41        $this->assertEquals('http://bla', $helper->_cleanData('bla', 'url'));
42        $this->assertEquals('http://bla', $helper->_cleanData('http://bla', 'url'));
43        $this->assertEquals('https://bla', $helper->_cleanData('https://bla', 'url'));
44        $this->assertEquals('tell://bla', $helper->_cleanData('tell://bla', 'url'));
45
46        $this->assertEquals('bla@bla.de', $helper->_cleanData('bla@bla.de', 'mail'));
47        $this->assertEquals('bla@bla.de bla', $helper->_cleanData('bla@bla.de bla', 'mail'));
48        $this->assertEquals('bla@bla.de bla word', $helper->_cleanData('bla@bla.de bla word', 'mail'));
49        $this->assertEquals('bla@bla.de bla bla word', $helper->_cleanData('bla bla@bla.de bla word', 'mail'));
50        $this->assertEquals('bla@bla.de bla bla word', $helper->_cleanData(' bla bla@bla.de bla word ', 'mail'));
51
52        $this->assertEquals('123', $helper->_cleanData('123', 'page'));
53        $this->assertEquals('123_123', $helper->_cleanData('123 123', 'page'));
54        $this->assertEquals('123', $helper->_cleanData('123', 'nspage'));
55
56        $this->assertEquals('test', $helper->_cleanData('test', ''));
57
58        $this->assertEquals('test', $helper->_cleanData('test', array('type' => '')));
59        $this->assertEquals('', $helper->_cleanData('test', array('type' => '', 'enum' => 'some other')));
60    }
61
62    function testColumn() {
63        global $conf;
64        $helper = new helper_plugin_data();
65
66        $this->assertEquals($this->createColumnEntry('type', false, 'type',  'type', 'type', ''), $helper->_column('type'));
67        $this->assertEquals($this->createColumnEntry('types', true, 'type',  'type', 'type', ''), $helper->_column('types'));
68        $this->assertEquals($this->createColumnEntry('', false, '', '', '', ''), $helper->_column(''));
69        $this->assertEquals($this->createColumnEntry('type_url', false, 'type', 'type', 'type', 'url'), $helper->_column('type_url'));
70        $this->assertEquals($this->createColumnEntry('type_urls', true, 'type', 'type', 'type', 'url'), $helper->_column('type_urls'));
71
72        $this->assertEquals($this->createColumnEntry('type_hidden', false, 'type', 'type', 'type', 'hidden'), $helper->_column('type_hidden'));
73        $this->assertEquals($this->createColumnEntry('type_hiddens', true, 'type', 'type', 'type', 'hidden'), $helper->_column('type_hiddens'));
74
75        $this->assertEquals($this->createColumnEntry('%title%', false, '%title%', '%title%', 'Page', 'title'), $helper->_column('%title%'));
76        $this->assertEquals($this->createColumnEntry('%pageid%', false, '%pageid%', '%pageid%','Title', 'page'), $helper->_column('%pageid%'));
77        $this->assertEquals($this->createColumnEntry('%class%', false, '%class%', '%class%', 'Page Class', ''), $helper->_column('%class%'));
78        $this->assertEquals($this->createColumnEntry('%lastmod%', false, '%lastmod%', '%lastmod%', 'Last Modified', 'timestamp'), $helper->_column('%lastmod%'));
79
80        $this->assertEquals($this->createColumnEntry('Type', false, 'type', 'Type', 'Type', ''), $helper->_column('Type'));
81
82
83        // test translated key name
84        $this->assertEquals($this->createColumnEntry('trans_urls', true, 'trans', 'trans', 'Translated Title', 'url'), $helper->_column('trans_urls'));
85        // retry in different language
86        $conf['lang'] = 'de';
87        $helper = new helper_plugin_data();
88        $this->assertEquals($this->createColumnEntry('trans_urls', true, 'trans', 'trans', 'Übersetzter Titel', 'url'), $helper->_column('trans_urls'));
89    }
90
91    function testAddPrePostFixes() {
92        global $conf;
93        $helper = new helper_plugin_data();
94
95        $this->assertEquals('value', $helper->_addPrePostFixes('', 'value'));
96        $this->assertEquals('prevaluepost', $helper->_addPrePostFixes('', 'value', 'pre', 'post'));
97        $this->assertEquals('valuepost', $helper->_addPrePostFixes('', 'value', '', 'post'));
98        $this->assertEquals('prevalue', $helper->_addPrePostFixes('', 'value', 'pre'));
99        $this->assertEquals('prevaluepost', $helper->_addPrePostFixes(array('prefix' => 'pre', 'postfix' => 'post'), 'value'));
100
101        $conf['lang'] = 'en';
102        $this->assertEquals('envalue', $helper->_addPrePostFixes(array('prefix' => '%lang%'), 'value'));
103
104        $this->assertEquals('value', $helper->_addPrePostFixes(array('prefix' => '%trans%'), 'value'));
105
106        $plugininstalled = in_array('translation', plugin_list('helper',$all=true));
107        if (!$plugininstalled) $this->markTestSkipped('Pre-condition not satisfied: translation plugin must be installed');
108
109        if ($plugininstalled && plugin_enable('translation')) {
110            global $ID;
111            $conf['plugin']['translation']['translations'] = 'de';
112            $ID = 'de:somepage';
113            $this->assertEquals('de:value', $helper->_addPrePostFixes(array('prefix' => '%trans%:'), 'value'));
114        }
115
116    }
117
118    function testResolveData() {
119        $helper = new helper_plugin_data();
120
121        $this->assertEquals('tom', $helper->_resolveData('tom', 'name'));
122        $this->assertEquals('jerry', $helper->_resolveData('jerry', 'name'));
123
124        $this->assertEquals('wiki:syntax Formatting Syntax', $helper->_resolveData('wiki:syntax', 'name_title'));
125        $this->assertEquals('none:existing ', $helper->_resolveData('none:existing', 'name_title'));
126    }
127
128    function testFormatData() {
129        global $conf;
130        global $ID;
131        $ID = '';
132
133        $helper = new helper_plugin_data();
134        $renderer = new data_dummy_renderer();
135
136        $this->assertEquals('value1, value2, val',
137            $helper->_formatData(array('type' => ''), "value1\n value2\n val", $renderer));
138
139        $this->assertEquals('link: :page ',
140            $helper->_formatData(array('type' => 'page'), "page", $renderer));
141
142        $this->assertEquals('link: :page title',
143            $helper->_formatData(array('type' => 'title'), "page|title", $renderer));
144
145        $this->assertEquals('link: page title',
146            $helper->_formatData(array('type' => 'pageid'), "page|title", $renderer));
147
148        $this->assertEquals('link: :key:page ',
149            $helper->_formatData(array('type' => 'nspage', 'key' => 'key'), "page", $renderer));
150
151        $conf['mailguard'] = '';
152        $this->assertEquals('<a href="mailto:pa:ge" class="mail" title="pa:ge">pa:ge</a>',
153            $helper->_formatData(array('type' => 'mail'), "pa:ge", $renderer));
154
155        $this->assertEquals('<a href="mailto:pa:ge" class="mail" title="pa:ge">some user</a>',
156            $helper->_formatData(array('type' => 'mail'), "pa:ge some user", $renderer));
157
158        $conf['mailguard'] = 'visible';
159        $this->assertEquals('<a href="mailto:pa%3Age" class="mail" title="pa%3Age">pa:ge</a>',
160            $helper->_formatData(array('type' => 'mail'), "pa:ge", $renderer));
161
162        $this->assertEquals('<a href="mailto:pa%3Age" class="mail" title="pa%3Age">some user</a>',
163            $helper->_formatData(array('type' => 'mail'), "pa:ge some user", $renderer));
164
165        $this->assertEquals('<a href=\'url\' class=\'urlextern\' rel="nofollow">url</a>',
166            $helper->_formatData(array('type' => 'url'), "url", $renderer));
167
168        $this->assertEquals('<a href="' . wl('start', array('dataflt[0]'=>'_=value')) . '" title="Show pages matching \'value\'" class="wikilink1">value</a>',
169            $helper->_formatData(array('type' => 'tag'), "value", $renderer));
170
171        $this->assertEquals(strftime('%Y/%m/%d %H:%M', 1234567),
172            $helper->_formatData(array('type' => 'timestamp'), "1234567", $renderer));
173
174        $this->assertEquals('<strong>bla</strong>',
175            $helper->_formatData(array('type' => 'wiki'), '|**bla**', $renderer));
176
177
178        $this->assertEquals('<a rel="lightbox" href="'.ml('wiki:dokuwiki-128.png', array('cache' => null)).'" class="media" title="wiki:dokuwiki-128.png"><img src="'.ml('wiki:dokuwiki-128.png', array('w' => 300, 'cache' => null)).'" class="media" title=": dokuwiki-128.png" alt=": dokuwiki-128.png" width="300" /></a>',
179            $helper->_formatData(array('type' => 'img300'), 'wiki:dokuwiki-128.png', $renderer));
180    }
181
182    function testReplacePlaceholdersInSQL() {
183        global $USERINFO;
184        $helper = new helper_plugin_data();
185
186        $data = array('sql' => '%user%');
187        $_SERVER['REMOTE_USER'] = 'test';
188        $helper->_replacePlaceholdersInSQL($data);
189        $this->assertEquals('test', $data['sql']);
190
191        $data = array('sql' => '%groups%');
192        $USERINFO['grps'] = array('test','admin');
193        $helper->_replacePlaceholdersInSQL($data);
194        $this->assertEquals("test','admin", $data['sql']);
195
196        $data = array('sql' => '%now%');
197        $helper->_replacePlaceholdersInSQL($data);
198        $this->assertRegExp('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $data['sql']);
199
200        $data = array('sql' => '%lang%');
201        $helper->_replacePlaceholdersInSQL($data);
202        $this->assertEquals('en', $data['sql']);
203    }
204
205    protected function createColumnEntry($name, $multi, $key, $origkey, $title, $type) {
206        return array(
207            'colname' => $name,
208            'multi' => $multi,
209            'key' => $key,
210            'origkey' => $origkey,
211            'title' => $title,
212            'type' => $type
213        );
214    }
215
216    public function testNoSqlPlugin() {
217        $helper = new helper_plugin_data();
218        plugin_disable('sqlite');
219        $this->assertFalse($helper->_getDB());
220    }
221
222    public function testParseFilter() {
223        $helper = new helper_plugin_data();
224
225        $this->assertEquals($this->createFilterArray('name', 'tom', '=', 'name_some', 'some')
226            , $helper->_parse_filter('name_some = tom'));
227
228        $this->assertEquals($this->createFilterArray('name', 'tom', '=', 'name', '')
229            , $helper->_parse_filter('name = tom'));
230
231        $this->assertEquals($this->createFilterArray('name', 'tom', '!=', 'name', '')
232            , $helper->_parse_filter('name != tom'));
233
234        $this->assertEquals($this->createFilterArray('name', 'tom', '!=', 'name', '')
235            , $helper->_parse_filter('name <> tom'));
236
237        $this->assertEquals($this->createFilterArray('name', 'tom', '<', 'name', '')
238            , $helper->_parse_filter('name < tom'));
239
240        $this->assertEquals($this->createFilterArray('name', 'tom', '>', 'name', '')
241            , $helper->_parse_filter('name > tom'));
242
243        $this->assertEquals($this->createFilterArray('name', 'tom', '<=', 'name', '')
244            , $helper->_parse_filter('name <= tom'));
245
246        $this->assertEquals($this->createFilterArray('name', 'tom', '>=', 'name', '')
247            , $helper->_parse_filter('name >= tom'));
248
249        $this->assertEquals($this->createFilterArray('name', 'tom', 'LIKE', 'name', '')
250            , $helper->_parse_filter('name ~ tom'));
251
252        $this->assertEquals($this->createFilterArray('name', '%tom%', 'LIKE', 'name', '')
253            , $helper->_parse_filter('name *~ tom'));
254
255        $this->assertEquals($this->createFilterArray('name', 'tom', 'NOT LIKE', 'name', '')
256            , $helper->_parse_filter('name !~ tom'));
257
258        $this->assertEquals($this->createFilterArray('name', '%tom', 'LIKE', 'name', '')
259            , $helper->_parse_filter('name ~ *tom'));
260
261        $this->assertEquals($this->createFilterArray('name', 'tom%', 'LIKE', 'name', '')
262            , $helper->_parse_filter('name ~ tom*'));
263
264        $this->assertEquals($this->createFilterArray('name', '%tom%', 'LIKE', 'name', '')
265            , $helper->_parse_filter('name ~ *tom*'));
266
267        $this->assertEquals($this->createFilterArray('name', 'tom', 'IN(', 'name', '')
268            , $helper->_parse_filter('name ~~ tom'));
269
270        $this->assertEquals($this->createFilterArray('name', "t''om','john*", 'IN(', 'name', '')
271            , $helper->_parse_filter("name ~~ t'om,john*"));
272
273        $this->assertEquals(false, $helper->_parse_filter('name is *tom*'));
274        $this->assertEquals(false, $helper->_parse_filter(''));
275    }
276
277    protected function createFilterArray($key, $value, $compare, $colname, $type) {
278        return array(
279            'key' => $key,
280            'value' => $value,
281            'compare' => $compare,
282            'colname' => $colname,
283            'type' => $type
284        );
285    }
286
287    public function testGetFilters() {
288        $helper = new helper_plugin_data();
289
290        $this->assertEquals(array(), $helper->_get_filters());
291
292        $_REQUEST['dataflt'] = 'name = tom';
293        $this->assertEquals(array($this->createFilterArrayListEntry('name', 'tom', '=', 'name', '', 'AND')),
294            $helper->_get_filters());
295
296        $_REQUEST['dataflt'] = array();
297        $_REQUEST['dataflt'][] = 'name = tom';
298        $this->assertEquals(array($this->createFilterArrayListEntry('name', 'tom', '=', 'name', '', 'AND')),
299            $helper->_get_filters());
300
301        $_REQUEST['dataflt'] = array();
302        $_REQUEST['dataflt'][] = 'name = tom';
303        $_REQUEST['dataflt'][] = 'unit_url = dokuwiki.org';
304        $this->assertEquals(
305            array(
306                $this->createFilterArrayListEntry('name', 'tom', '=', 'name', '', 'AND'),
307                $this->createFilterArrayListEntry('unit', 'http://dokuwiki.org', '=', 'unit_url', 'url', 'AND')
308            ),
309            $helper->_get_filters());
310    }
311
312    private function createFilterArrayListEntry($key, $value, $compare, $colname, $type, $logic) {
313        $item =  $this->createFilterArray($key, $value, $compare, $colname, $type);
314        $item['logic'] = $logic;
315        return $item;
316    }
317
318    public function testA2UA() {
319        $helper = new helper_plugin_data();
320
321        $array = array(
322            'id' => '1',
323            'name' => 'tom'
324        );
325
326        $result = array(
327            'table[id]' => '1',
328            'table[name]' => 'tom'
329        );
330
331        $this->assertEquals($result, $helper->_a2ua('table', $array));
332    }
333
334    public function testMakeTranslationReplacement() {
335        $helper = new helper_plugin_data();
336
337        $this->assertEquals('en', $helper->makeTranslationReplacement('%lang%'));
338        $this->assertEquals('', $helper->makeTranslationReplacement('%trans%'));
339
340        $plugininstalled = in_array('translation', plugin_list('helper',$all=true));
341        if (!$plugininstalled) $this->markTestSkipped('Pre-condition not satisfied: translation plugin must be installed');
342
343        if ($plugininstalled && plugin_enable('translation')) {
344            global $conf;
345            global $ID;
346            $conf['plugin']['translation']['translations'] = 'de';
347            $ID = 'de:somepage';
348            $this->assertEquals('en', $helper->makeTranslationReplacement('%lang%'));
349            $this->assertEquals('de', $helper->makeTranslationReplacement('%trans%'));
350        }
351    }
352}
353