xref: /plugin/struct/_test/SearchConfigParameterTest.php (revision 76e537bf11e7df9e4e85793633e4ec17a0379b83)
1<?php
2
3namespace dokuwiki\plugin\struct\test;
4
5use dokuwiki\plugin\struct\meta;
6use DOMWrap\Document;
7
8/**
9 * Tests handling dynamic search parameters
10 *
11 * @group plugin_struct
12 * @group plugins
13 *
14 */
15class SearchConfigParameterTest extends StructTest
16{
17
18    public function setUp(): void
19    {
20        parent::setUp();
21
22        $this->loadSchemaJSON('schema1');
23        $this->loadSchemaJSON('schema2');
24
25        $as = mock\Assignments::getInstance();
26
27        $as->assignPageSchema('page01', 'schema1');
28        $this->saveData(
29            'page01',
30            'schema1',
31            [
32                'first' => 'first data',
33                'second' => ['second data', 'more data', 'even more'],
34                'third' => 'third data',
35                'fourth' => 'fourth data'
36            ],
37            time()
38        );
39
40        $as->assignPageSchema('page01', 'schema2');
41        $this->saveData(
42            'page01',
43            'schema2',
44            [
45                'afirst' => 'first data',
46                'asecond' => ['second data', 'more data', 'even more'],
47                'athird' => 'third data',
48                'afourth' => 'fourth data'
49            ],
50            time()
51        );
52
53        for ($i = 10; $i <= 20; $i++) {
54            $as->assignPageSchema("page$i", 'schema2');
55            $this->saveData(
56                "page$i",
57                'schema2',
58                [
59                    'afirst' => "page$i first data",
60                    'asecond' => ["page$i second data"],
61                    'athird' => "page$i third data",
62                    'afourth' => "page$i fourth data"
63                ],
64                time()
65            );
66        }
67    }
68
69    public function test_constructor()
70    {
71        global $INPUT;
72
73        $data = [
74            'schemas' => [
75                ['schema1', 'alias1'],
76                ['schema2', 'alias2'],
77            ],
78            'cols' => [
79                '%pageid%',
80                'first', 'second', 'third', 'fourth',
81                'afirst', 'asecond', 'athird', 'afourth',
82            ]
83        ];
84
85        // init with no parameters
86        $expect = $data;
87        $params = [];
88        $searchConfig = new meta\SearchConfig($data);
89        $dynamic = $searchConfig->getDynamicParameters();
90        $this->assertEquals($expect, $searchConfig->getConf());
91        $this->assertEquals($params, $dynamic->getURLParameters());
92
93        // init with sort
94        $INPUT->set(meta\SearchConfigParameters::$PARAM_SORT, '^alias2.athird');
95        $expect['sort'] = [['schema2.athird', false]];
96        $params[meta\SearchConfigParameters::$PARAM_SORT] = '^schema2.athird';
97        $searchConfig = new meta\SearchConfig($data);
98        $dynamic = $searchConfig->getDynamicParameters();
99        $this->assertEquals($expect, $searchConfig->getConf());
100        $this->assertEquals($params, $dynamic->getURLParameters());
101
102        // init with offset
103        $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 25);
104        $expect['offset'] = 25;
105        $params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25;
106        $searchConfig = new meta\SearchConfig($data);
107        $dynamic = $searchConfig->getDynamicParameters();
108        $this->assertEquals($expect, $searchConfig->getConf());
109        $this->assertEquals($params, $dynamic->getURLParameters());
110
111        // init with filters
112        $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['alias1.first*~'] = 'test';
113        $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['afirst='] = 'test2';
114        $expect['filter'] = [
115            ['schema1.first', '*~', 'test', 'AND'],
116            ['schema2.afirst', '=', 'test2', 'AND']
117        ];
118        $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema1.first*~]'] = 'test';
119        $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema2.afirst=]'] = 'test2';
120        $searchConfig = new meta\SearchConfig($data);
121        $dynamic = $searchConfig->getDynamicParameters();
122        $this->assertEquals($expect, $searchConfig->getConf());
123        $this->assertEquals($params, $dynamic->getURLParameters());
124    }
125
126    public function test_filter()
127    {
128        $data = [
129            'schemas' => [
130                ['schema1', 'alias1'],
131                ['schema2', 'alias2'],
132            ],
133            'cols' => [
134                '%pageid%',
135                'first', 'second', 'third', 'fourth',
136                'afirst', 'asecond', 'athird', 'afourth',
137            ]
138        ];
139
140        $searchConfig = new meta\SearchConfig($data);
141        $dynamic = $searchConfig->getDynamicParameters();
142        $expect = [];
143        $this->assertEquals($expect, $dynamic->getFilters());
144
145        $dynamic->addFilter('first', '*~', 'test');
146        $expect = ['schema1.first' => ['*~', 'test']];
147        $this->assertEquals($expect, $dynamic->getFilters());
148
149        $dynamic->addFilter('asecond', '*~', 'test2');
150        $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'test2']];
151        $this->assertEquals($expect, $dynamic->getFilters());
152
153        // overwrite a filter
154        $dynamic->addFilter('asecond', '*~', 'foobar');
155        $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'foobar']];
156        $this->assertEquals($expect, $dynamic->getFilters());
157
158        // overwrite a filter with blank removes
159        $dynamic->addFilter('asecond', '*~', '');
160        $expect = ['schema1.first' => ['*~', 'test']];
161        $this->assertEquals($expect, $dynamic->getFilters());
162
163        // adding unknown filter does nothing
164        $dynamic->addFilter('nope', '*~', 'foobar');
165        $expect = ['schema1.first' => ['*~', 'test']];
166        $this->assertEquals($expect, $dynamic->getFilters());
167
168        // removing unknown column does nothing
169        $dynamic->removeFilter('nope');
170        $expect = ['schema1.first' => ['*~', 'test']];
171        $this->assertEquals($expect, $dynamic->getFilters());
172
173        $dynamic->removeFilter('first');
174        $expect = [];
175        $this->assertEquals($expect, $dynamic->getFilters());
176    }
177
178    public function test_sort()
179    {
180        $data = [
181            'schemas' => [
182                ['schema1', 'alias1'],
183                ['schema2', 'alias2'],
184            ],
185            'cols' => [
186                '%pageid%',
187                'first', 'second', 'third', 'fourth',
188                'afirst', 'asecond', 'athird', 'afourth',
189            ]
190        ];
191
192        $searchConfig = new meta\SearchConfig($data);
193        $dynamic = $searchConfig->getDynamicParameters();
194
195        $dynamic->setSort('%pageid%');
196        $conf = $dynamic->updateConfig($data);
197        $param = $dynamic->getURLParameters();
198        $this->assertEquals([['%pageid%', true]], $conf['sort']);
199        $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
200        $this->assertEquals('%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]);
201
202        $dynamic->setSort('%pageid%', false);
203        $conf = $dynamic->updateConfig($data);
204        $param = $dynamic->getURLParameters();
205        $this->assertEquals([['%pageid%', false]], $conf['sort']);
206        $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
207        $this->assertEquals('^%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]);
208
209        $dynamic->removeSort();
210        $conf = $dynamic->updateConfig($data);
211        $param = $dynamic->getURLParameters();
212        $this->assertArrayNotHasKey('sort', $conf);
213        $this->assertArrayNotHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
214    }
215
216    public function test_pagination()
217    {
218        global $INPUT;
219
220        $data = [
221            'schemas' => [
222                ['schema2', 'alias2'],
223            ],
224            'cols' => [
225                'afirst'
226            ],
227            'rownumbers' => '1',
228            'limit' => '5',
229        ];
230
231        $R = new \Doku_Renderer_xhtml();
232        // init with offset
233        $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 5);
234        $searchConfig = new meta\SearchConfig($data);
235        $aggregationTable = new meta\AggregationTable('test_pagination', 'xhtml', $R, $searchConfig);
236        $aggregationTable->render();
237
238        $rev = time();
239
240        $doc = new Document();
241        $doc->html($R->doc);
242        $table = $doc->find('div.structaggregation');
243
244        $tr1 = $table->find(".row1");
245        $this->assertEquals('6page14 first data', trim($tr1->text()));
246        $this->assertEquals('page14', $tr1->attr('data-pid'));
247        $this->assertEquals('0', $tr1->attr('data-rid'));
248        $this->assertEquals($rev, $tr1->attr('data-rev'));
249
250        $tr6aPrev = $table->find(".row6 a.prev");
251        $this->assertEquals('/./doku.php?id=test_pagination', $tr6aPrev->attr('href'));
252
253    }
254}
255