xref: /plugin/struct/_test/SearchConfigParameterTest.php (revision 850ad33e349567a75f310427bcb4c8bac9898406)
18fed17f3SAndreas Gohr<?php
28fed17f3SAndreas Gohr
38fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test;
48fed17f3SAndreas Gohr
58fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta;
6*850ad33eSAndreas Gohruse DOMWrap\Document;
78fed17f3SAndreas Gohr
88fed17f3SAndreas Gohr/**
98fed17f3SAndreas Gohr * Tests handling dynamic search parameters
108fed17f3SAndreas Gohr *
118fed17f3SAndreas Gohr * @group plugin_struct
128fed17f3SAndreas Gohr * @group plugins
138fed17f3SAndreas Gohr *
148fed17f3SAndreas Gohr */
158fed17f3SAndreas Gohrclass SearchConfigParameterTest extends StructTest
168fed17f3SAndreas Gohr{
178fed17f3SAndreas Gohr
188fed17f3SAndreas Gohr    public function setUp(): void
198fed17f3SAndreas Gohr    {
208fed17f3SAndreas Gohr        parent::setUp();
218fed17f3SAndreas Gohr
228fed17f3SAndreas Gohr        $this->loadSchemaJSON('schema1');
238fed17f3SAndreas Gohr        $this->loadSchemaJSON('schema2');
248fed17f3SAndreas Gohr
258fed17f3SAndreas Gohr        $as = mock\Assignments::getInstance();
268fed17f3SAndreas Gohr
278fed17f3SAndreas Gohr        $as->assignPageSchema('page01', 'schema1');
288fed17f3SAndreas Gohr        $this->saveData(
298fed17f3SAndreas Gohr            'page01',
308fed17f3SAndreas Gohr            'schema1',
318fed17f3SAndreas Gohr            [
328fed17f3SAndreas Gohr                'first' => 'first data',
338fed17f3SAndreas Gohr                'second' => ['second data', 'more data', 'even more'],
348fed17f3SAndreas Gohr                'third' => 'third data',
358fed17f3SAndreas Gohr                'fourth' => 'fourth data'
368fed17f3SAndreas Gohr            ],
378fed17f3SAndreas Gohr            time()
388fed17f3SAndreas Gohr        );
398fed17f3SAndreas Gohr
408fed17f3SAndreas Gohr        $as->assignPageSchema('page01', 'schema2');
418fed17f3SAndreas Gohr        $this->saveData(
428fed17f3SAndreas Gohr            'page01',
438fed17f3SAndreas Gohr            'schema2',
448fed17f3SAndreas Gohr            [
458fed17f3SAndreas Gohr                'afirst' => 'first data',
468fed17f3SAndreas Gohr                'asecond' => ['second data', 'more data', 'even more'],
478fed17f3SAndreas Gohr                'athird' => 'third data',
488fed17f3SAndreas Gohr                'afourth' => 'fourth data'
498fed17f3SAndreas Gohr            ],
508fed17f3SAndreas Gohr            time()
518fed17f3SAndreas Gohr        );
528fed17f3SAndreas Gohr
538fed17f3SAndreas Gohr        for ($i = 10; $i <= 20; $i++) {
548fed17f3SAndreas Gohr            $as->assignPageSchema("page$i", 'schema2');
558fed17f3SAndreas Gohr            $this->saveData(
568fed17f3SAndreas Gohr                "page$i",
578fed17f3SAndreas Gohr                'schema2',
588fed17f3SAndreas Gohr                [
598fed17f3SAndreas Gohr                    'afirst' => "page$i first data",
608fed17f3SAndreas Gohr                    'asecond' => ["page$i second data"],
618fed17f3SAndreas Gohr                    'athird' => "page$i third data",
628fed17f3SAndreas Gohr                    'afourth' => "page$i fourth data"
638fed17f3SAndreas Gohr                ],
648fed17f3SAndreas Gohr                time()
658fed17f3SAndreas Gohr            );
668fed17f3SAndreas Gohr        }
678fed17f3SAndreas Gohr    }
688fed17f3SAndreas Gohr
698fed17f3SAndreas Gohr    public function test_constructor()
708fed17f3SAndreas Gohr    {
718fed17f3SAndreas Gohr        global $INPUT;
728fed17f3SAndreas Gohr
738fed17f3SAndreas Gohr        $data = [
748fed17f3SAndreas Gohr            'schemas' => [
758fed17f3SAndreas Gohr                ['schema1', 'alias1'],
768fed17f3SAndreas Gohr                ['schema2', 'alias2'],
778fed17f3SAndreas Gohr            ],
788fed17f3SAndreas Gohr            'cols' => [
798fed17f3SAndreas Gohr                '%pageid%',
808fed17f3SAndreas Gohr                'first', 'second', 'third', 'fourth',
818fed17f3SAndreas Gohr                'afirst', 'asecond', 'athird', 'afourth',
828fed17f3SAndreas Gohr            ]
838fed17f3SAndreas Gohr        ];
848fed17f3SAndreas Gohr
858fed17f3SAndreas Gohr        // init with no parameters
868fed17f3SAndreas Gohr        $expect = $data;
878fed17f3SAndreas Gohr        $params = [];
888fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
898fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
908fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
918fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
928fed17f3SAndreas Gohr
938fed17f3SAndreas Gohr        // init with sort
948fed17f3SAndreas Gohr        $INPUT->set(meta\SearchConfigParameters::$PARAM_SORT, '^alias2.athird');
958fed17f3SAndreas Gohr        $expect['sort'] = [['schema2.athird', false]];
968fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_SORT] = '^schema2.athird';
978fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
988fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
998fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
1008fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
1018fed17f3SAndreas Gohr
1028fed17f3SAndreas Gohr        // init with offset
1038fed17f3SAndreas Gohr        $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 25);
1048fed17f3SAndreas Gohr        $expect['offset'] = 25;
1058fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25;
1068fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1078fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1088fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
1098fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
1108fed17f3SAndreas Gohr
1118fed17f3SAndreas Gohr        // init with filters
1128fed17f3SAndreas Gohr        $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['alias1.first*~'] = 'test';
1138fed17f3SAndreas Gohr        $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['afirst='] = 'test2';
1148fed17f3SAndreas Gohr        $expect['filter'] = [
1158fed17f3SAndreas Gohr            ['schema1.first', '*~', 'test', 'AND'],
1168fed17f3SAndreas Gohr            ['schema2.afirst', '=', 'test2', 'AND']
1178fed17f3SAndreas Gohr        ];
1188fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema1.first*~]'] = 'test';
1198fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema2.afirst=]'] = 'test2';
1208fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1218fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1228fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
1238fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
1248fed17f3SAndreas Gohr    }
1258fed17f3SAndreas Gohr
1268fed17f3SAndreas Gohr    public function test_filter()
1278fed17f3SAndreas Gohr    {
1288fed17f3SAndreas Gohr        $data = [
1298fed17f3SAndreas Gohr            'schemas' => [
1308fed17f3SAndreas Gohr                ['schema1', 'alias1'],
1318fed17f3SAndreas Gohr                ['schema2', 'alias2'],
1328fed17f3SAndreas Gohr            ],
1338fed17f3SAndreas Gohr            'cols' => [
1348fed17f3SAndreas Gohr                '%pageid%',
1358fed17f3SAndreas Gohr                'first', 'second', 'third', 'fourth',
1368fed17f3SAndreas Gohr                'afirst', 'asecond', 'athird', 'afourth',
1378fed17f3SAndreas Gohr            ]
1388fed17f3SAndreas Gohr        ];
1398fed17f3SAndreas Gohr
1408fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1418fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1428fed17f3SAndreas Gohr        $expect = [];
1438fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1448fed17f3SAndreas Gohr
1458fed17f3SAndreas Gohr        $dynamic->addFilter('first', '*~', 'test');
1468fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1478fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1488fed17f3SAndreas Gohr
1498fed17f3SAndreas Gohr        $dynamic->addFilter('asecond', '*~', 'test2');
1508fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'test2']];
1518fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1528fed17f3SAndreas Gohr
1538fed17f3SAndreas Gohr        // overwrite a filter
1548fed17f3SAndreas Gohr        $dynamic->addFilter('asecond', '*~', 'foobar');
1558fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'foobar']];
1568fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1578fed17f3SAndreas Gohr
1588fed17f3SAndreas Gohr        // overwrite a filter with blank removes
1598fed17f3SAndreas Gohr        $dynamic->addFilter('asecond', '*~', '');
1608fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1618fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1628fed17f3SAndreas Gohr
1638fed17f3SAndreas Gohr        // adding unknown filter does nothing
1648fed17f3SAndreas Gohr        $dynamic->addFilter('nope', '*~', 'foobar');
1658fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1668fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1678fed17f3SAndreas Gohr
1688fed17f3SAndreas Gohr        // removing unknown column does nothing
1698fed17f3SAndreas Gohr        $dynamic->removeFilter('nope');
1708fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1718fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1728fed17f3SAndreas Gohr
1738fed17f3SAndreas Gohr        $dynamic->removeFilter('first');
1748fed17f3SAndreas Gohr        $expect = [];
1758fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1768fed17f3SAndreas Gohr    }
1778fed17f3SAndreas Gohr
1788fed17f3SAndreas Gohr    public function test_sort()
1798fed17f3SAndreas Gohr    {
1808fed17f3SAndreas Gohr        $data = [
1818fed17f3SAndreas Gohr            'schemas' => [
1828fed17f3SAndreas Gohr                ['schema1', 'alias1'],
1838fed17f3SAndreas Gohr                ['schema2', 'alias2'],
1848fed17f3SAndreas Gohr            ],
1858fed17f3SAndreas Gohr            'cols' => [
1868fed17f3SAndreas Gohr                '%pageid%',
1878fed17f3SAndreas Gohr                'first', 'second', 'third', 'fourth',
1888fed17f3SAndreas Gohr                'afirst', 'asecond', 'athird', 'afourth',
1898fed17f3SAndreas Gohr            ]
1908fed17f3SAndreas Gohr        ];
1918fed17f3SAndreas Gohr
1928fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1938fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1948fed17f3SAndreas Gohr
195*850ad33eSAndreas Gohr        $dynamic->setSort('%pageid%');
1968fed17f3SAndreas Gohr        $conf = $dynamic->updateConfig($data);
1978fed17f3SAndreas Gohr        $param = $dynamic->getURLParameters();
1988fed17f3SAndreas Gohr        $this->assertEquals([['%pageid%', true]], $conf['sort']);
1998fed17f3SAndreas Gohr        $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
2008fed17f3SAndreas Gohr        $this->assertEquals('%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]);
2018fed17f3SAndreas Gohr
2028fed17f3SAndreas Gohr        $dynamic->setSort('%pageid%', false);
2038fed17f3SAndreas Gohr        $conf = $dynamic->updateConfig($data);
2048fed17f3SAndreas Gohr        $param = $dynamic->getURLParameters();
2058fed17f3SAndreas Gohr        $this->assertEquals([['%pageid%', false]], $conf['sort']);
2068fed17f3SAndreas Gohr        $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
2078fed17f3SAndreas Gohr        $this->assertEquals('^%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]);
2088fed17f3SAndreas Gohr
2098fed17f3SAndreas Gohr        $dynamic->removeSort();
2108fed17f3SAndreas Gohr        $conf = $dynamic->updateConfig($data);
2118fed17f3SAndreas Gohr        $param = $dynamic->getURLParameters();
2128fed17f3SAndreas Gohr        $this->assertArrayNotHasKey('sort', $conf);
2138fed17f3SAndreas Gohr        $this->assertArrayNotHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
2148fed17f3SAndreas Gohr    }
2158fed17f3SAndreas Gohr
2168fed17f3SAndreas Gohr    public function test_pagination()
2178fed17f3SAndreas Gohr    {
2188fed17f3SAndreas Gohr        global $INPUT;
2198fed17f3SAndreas Gohr
2208fed17f3SAndreas Gohr        $data = [
2218fed17f3SAndreas Gohr            'schemas' => [
2228fed17f3SAndreas Gohr                ['schema2', 'alias2'],
2238fed17f3SAndreas Gohr            ],
2248fed17f3SAndreas Gohr            'cols' => [
2258fed17f3SAndreas Gohr                'afirst'
2268fed17f3SAndreas Gohr            ],
2278fed17f3SAndreas Gohr            'rownumbers' => '1',
2288fed17f3SAndreas Gohr            'limit' => '5',
2298fed17f3SAndreas Gohr        ];
2308fed17f3SAndreas Gohr
2318fed17f3SAndreas Gohr        $R = new \Doku_Renderer_xhtml();
2328fed17f3SAndreas Gohr        // init with offset
2338fed17f3SAndreas Gohr        $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 5);
2348fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
2358fed17f3SAndreas Gohr        $aggregationTable = new meta\AggregationTable('test_pagination', 'xhtml', $R, $searchConfig);
2368fed17f3SAndreas Gohr        $aggregationTable->render();
2378fed17f3SAndreas Gohr
2388fed17f3SAndreas Gohr        $rev = time();
2398fed17f3SAndreas Gohr
240*850ad33eSAndreas Gohr        $doc = new Document();
241*850ad33eSAndreas Gohr        $doc->loadHTML($R->doc);
242*850ad33eSAndreas Gohr        $table = $doc->find('div.structaggregation');
243*850ad33eSAndreas Gohr
244*850ad33eSAndreas Gohr        $tr1 = $table->find(".row1");
2458fed17f3SAndreas Gohr        $this->assertEquals('6page14 first data', trim($tr1->text()));
2468fed17f3SAndreas Gohr        $this->assertEquals('page14', $tr1->attr('data-pid'));
2478fed17f3SAndreas Gohr        $this->assertEquals('0', $tr1->attr('data-rid'));
2488fed17f3SAndreas Gohr        $this->assertEquals($rev, $tr1->attr('data-rev'));
2498fed17f3SAndreas Gohr
250*850ad33eSAndreas Gohr        $tr6aPrev = $table->find(".row6 a.prev");
2518fed17f3SAndreas Gohr        $this->assertEquals('/./doku.php?id=test_pagination', $tr6aPrev->attr('href'));
2528fed17f3SAndreas Gohr
2538fed17f3SAndreas Gohr    }
2548fed17f3SAndreas Gohr}
255