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