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