xref: /plugin/struct/_test/SearchConfigParameterTest.php (revision af0ce8d2fb493ed201ed374daddbc04d257baa9c)
18fed17f3SAndreas Gohr<?php
28fed17f3SAndreas Gohr
38fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test;
48fed17f3SAndreas Gohr
58fed17f3SAndreas Gohruse dokuwiki\plugin\struct\meta;
6850ad33eSAndreas 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{
173ff5da8aSAndreas Gohr    /** @var int fixed revision timestamp */
183ff5da8aSAndreas Gohr    protected $fixedrev;
198fed17f3SAndreas Gohr
208fed17f3SAndreas Gohr    public function setUp(): void
218fed17f3SAndreas Gohr    {
228fed17f3SAndreas Gohr        parent::setUp();
238fed17f3SAndreas Gohr
248fed17f3SAndreas Gohr        $this->loadSchemaJSON('schema1');
258fed17f3SAndreas Gohr        $this->loadSchemaJSON('schema2');
268fed17f3SAndreas Gohr
278fed17f3SAndreas Gohr        $as = mock\Assignments::getInstance();
288fed17f3SAndreas Gohr
293ff5da8aSAndreas Gohr        // save all data with the same fake revision
303ff5da8aSAndreas Gohr        $this->fixedrev = time();
313ff5da8aSAndreas Gohr
328fed17f3SAndreas Gohr        $as->assignPageSchema('page01', 'schema1');
338fed17f3SAndreas Gohr        $this->saveData(
348fed17f3SAndreas Gohr            'page01',
358fed17f3SAndreas Gohr            'schema1',
368fed17f3SAndreas Gohr            [
378fed17f3SAndreas Gohr                'first' => 'first data',
388fed17f3SAndreas Gohr                'second' => ['second data', 'more data', 'even more'],
398fed17f3SAndreas Gohr                'third' => 'third data',
408fed17f3SAndreas Gohr                'fourth' => 'fourth data'
418fed17f3SAndreas Gohr            ],
423ff5da8aSAndreas Gohr            $this->fixedrev
438fed17f3SAndreas Gohr        );
448fed17f3SAndreas Gohr
458fed17f3SAndreas Gohr        $as->assignPageSchema('page01', 'schema2');
468fed17f3SAndreas Gohr        $this->saveData(
478fed17f3SAndreas Gohr            'page01',
488fed17f3SAndreas Gohr            'schema2',
498fed17f3SAndreas Gohr            [
508fed17f3SAndreas Gohr                'afirst' => 'first data',
518fed17f3SAndreas Gohr                'asecond' => ['second data', 'more data', 'even more'],
528fed17f3SAndreas Gohr                'athird' => 'third data',
538fed17f3SAndreas Gohr                'afourth' => 'fourth data'
548fed17f3SAndreas Gohr            ],
553ff5da8aSAndreas Gohr            $this->fixedrev
568fed17f3SAndreas Gohr        );
578fed17f3SAndreas Gohr
588fed17f3SAndreas Gohr        for ($i = 10; $i <= 20; $i++) {
598fed17f3SAndreas Gohr            $as->assignPageSchema("page$i", 'schema2');
608fed17f3SAndreas Gohr            $this->saveData(
618fed17f3SAndreas Gohr                "page$i",
628fed17f3SAndreas Gohr                'schema2',
638fed17f3SAndreas Gohr                [
648fed17f3SAndreas Gohr                    'afirst' => "page$i first data",
658fed17f3SAndreas Gohr                    'asecond' => ["page$i second data"],
668fed17f3SAndreas Gohr                    'athird' => "page$i third data",
678fed17f3SAndreas Gohr                    'afourth' => "page$i fourth data"
688fed17f3SAndreas Gohr                ],
693ff5da8aSAndreas Gohr                $this->fixedrev
708fed17f3SAndreas Gohr            );
718fed17f3SAndreas Gohr        }
728fed17f3SAndreas Gohr    }
738fed17f3SAndreas Gohr
748fed17f3SAndreas Gohr    public function test_constructor()
758fed17f3SAndreas Gohr    {
768fed17f3SAndreas Gohr        global $INPUT;
778fed17f3SAndreas Gohr
788fed17f3SAndreas Gohr        $data = [
798fed17f3SAndreas Gohr            'schemas' => [
808fed17f3SAndreas Gohr                ['schema1', 'alias1'],
818fed17f3SAndreas Gohr                ['schema2', 'alias2'],
828fed17f3SAndreas Gohr            ],
838fed17f3SAndreas Gohr            'cols' => [
848fed17f3SAndreas Gohr                '%pageid%',
858fed17f3SAndreas Gohr                'first', 'second', 'third', 'fourth',
868fed17f3SAndreas Gohr                'afirst', 'asecond', 'athird', 'afourth',
878fed17f3SAndreas Gohr            ]
888fed17f3SAndreas Gohr        ];
898fed17f3SAndreas Gohr
908fed17f3SAndreas Gohr        // init with no parameters
918fed17f3SAndreas Gohr        $expect = $data;
928fed17f3SAndreas Gohr        $params = [];
938fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
948fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
958fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
968fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
978fed17f3SAndreas Gohr
988fed17f3SAndreas Gohr        // init with sort
998fed17f3SAndreas Gohr        $INPUT->set(meta\SearchConfigParameters::$PARAM_SORT, '^alias2.athird');
1008fed17f3SAndreas Gohr        $expect['sort'] = [['schema2.athird', false]];
1018fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_SORT] = '^schema2.athird';
1028fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1038fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1048fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
1058fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
1068fed17f3SAndreas Gohr
1078fed17f3SAndreas Gohr        // init with offset
1088fed17f3SAndreas Gohr        $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 25);
1098fed17f3SAndreas Gohr        $expect['offset'] = 25;
1108fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_OFFSET] = 25;
1118fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1128fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1138fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
1148fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
1158fed17f3SAndreas Gohr
1168fed17f3SAndreas Gohr        // init with filters
1178fed17f3SAndreas Gohr        $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['alias1.first*~'] = 'test';
1188fed17f3SAndreas Gohr        $_REQUEST[meta\SearchConfigParameters::$PARAM_FILTER]['afirst='] = 'test2';
1198fed17f3SAndreas Gohr        $expect['filter'] = [
1208fed17f3SAndreas Gohr            ['schema1.first', '*~', 'test', 'AND'],
1218fed17f3SAndreas Gohr            ['schema2.afirst', '=', 'test2', 'AND']
1228fed17f3SAndreas Gohr        ];
1238fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema1.first*~]'] = 'test';
1248fed17f3SAndreas Gohr        $params[meta\SearchConfigParameters::$PARAM_FILTER . '[schema2.afirst=]'] = 'test2';
1258fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1268fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1278fed17f3SAndreas Gohr        $this->assertEquals($expect, $searchConfig->getConf());
1288fed17f3SAndreas Gohr        $this->assertEquals($params, $dynamic->getURLParameters());
1298fed17f3SAndreas Gohr    }
1308fed17f3SAndreas Gohr
1318fed17f3SAndreas Gohr    public function test_filter()
1328fed17f3SAndreas Gohr    {
1338fed17f3SAndreas Gohr        $data = [
1348fed17f3SAndreas Gohr            'schemas' => [
1358fed17f3SAndreas Gohr                ['schema1', 'alias1'],
1368fed17f3SAndreas Gohr                ['schema2', 'alias2'],
1378fed17f3SAndreas Gohr            ],
1388fed17f3SAndreas Gohr            'cols' => [
1398fed17f3SAndreas Gohr                '%pageid%',
1408fed17f3SAndreas Gohr                'first', 'second', 'third', 'fourth',
1418fed17f3SAndreas Gohr                'afirst', 'asecond', 'athird', 'afourth',
1428fed17f3SAndreas Gohr            ]
1438fed17f3SAndreas Gohr        ];
1448fed17f3SAndreas Gohr
1458fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1468fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1478fed17f3SAndreas Gohr        $expect = [];
1488fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1498fed17f3SAndreas Gohr
1508fed17f3SAndreas Gohr        $dynamic->addFilter('first', '*~', 'test');
1518fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1528fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1538fed17f3SAndreas Gohr
1548fed17f3SAndreas Gohr        $dynamic->addFilter('asecond', '*~', 'test2');
1558fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'test2']];
1568fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1578fed17f3SAndreas Gohr
1588fed17f3SAndreas Gohr        // overwrite a filter
1598fed17f3SAndreas Gohr        $dynamic->addFilter('asecond', '*~', 'foobar');
1608fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test'], 'schema2.asecond' => ['*~', 'foobar']];
1618fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1628fed17f3SAndreas Gohr
1638fed17f3SAndreas Gohr        // overwrite a filter with blank removes
1648fed17f3SAndreas Gohr        $dynamic->addFilter('asecond', '*~', '');
1658fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1668fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1678fed17f3SAndreas Gohr
1688fed17f3SAndreas Gohr        // adding unknown filter does nothing
1698fed17f3SAndreas Gohr        $dynamic->addFilter('nope', '*~', 'foobar');
1708fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1718fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1728fed17f3SAndreas Gohr
1738fed17f3SAndreas Gohr        // removing unknown column does nothing
1748fed17f3SAndreas Gohr        $dynamic->removeFilter('nope');
1758fed17f3SAndreas Gohr        $expect = ['schema1.first' => ['*~', 'test']];
1768fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1778fed17f3SAndreas Gohr
1788fed17f3SAndreas Gohr        $dynamic->removeFilter('first');
1798fed17f3SAndreas Gohr        $expect = [];
1808fed17f3SAndreas Gohr        $this->assertEquals($expect, $dynamic->getFilters());
1818fed17f3SAndreas Gohr    }
1828fed17f3SAndreas Gohr
1838fed17f3SAndreas Gohr    public function test_sort()
1848fed17f3SAndreas Gohr    {
1858fed17f3SAndreas Gohr        $data = [
1868fed17f3SAndreas Gohr            'schemas' => [
1878fed17f3SAndreas Gohr                ['schema1', 'alias1'],
1888fed17f3SAndreas Gohr                ['schema2', 'alias2'],
1898fed17f3SAndreas Gohr            ],
1908fed17f3SAndreas Gohr            'cols' => [
1918fed17f3SAndreas Gohr                '%pageid%',
1928fed17f3SAndreas Gohr                'first', 'second', 'third', 'fourth',
1938fed17f3SAndreas Gohr                'afirst', 'asecond', 'athird', 'afourth',
1948fed17f3SAndreas Gohr            ]
1958fed17f3SAndreas Gohr        ];
1968fed17f3SAndreas Gohr
1978fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
1988fed17f3SAndreas Gohr        $dynamic = $searchConfig->getDynamicParameters();
1998fed17f3SAndreas Gohr
200850ad33eSAndreas Gohr        $dynamic->setSort('%pageid%');
2018fed17f3SAndreas Gohr        $conf = $dynamic->updateConfig($data);
2028fed17f3SAndreas Gohr        $param = $dynamic->getURLParameters();
2038fed17f3SAndreas Gohr        $this->assertEquals([['%pageid%', true]], $conf['sort']);
2048fed17f3SAndreas Gohr        $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
2058fed17f3SAndreas Gohr        $this->assertEquals('%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]);
2068fed17f3SAndreas Gohr
2078fed17f3SAndreas Gohr        $dynamic->setSort('%pageid%', false);
2088fed17f3SAndreas Gohr        $conf = $dynamic->updateConfig($data);
2098fed17f3SAndreas Gohr        $param = $dynamic->getURLParameters();
2108fed17f3SAndreas Gohr        $this->assertEquals([['%pageid%', false]], $conf['sort']);
2118fed17f3SAndreas Gohr        $this->assertArrayHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
2128fed17f3SAndreas Gohr        $this->assertEquals('^%pageid%', $param[meta\SearchConfigParameters::$PARAM_SORT]);
2138fed17f3SAndreas Gohr
2148fed17f3SAndreas Gohr        $dynamic->removeSort();
2158fed17f3SAndreas Gohr        $conf = $dynamic->updateConfig($data);
2168fed17f3SAndreas Gohr        $param = $dynamic->getURLParameters();
2178fed17f3SAndreas Gohr        $this->assertArrayNotHasKey('sort', $conf);
2188fed17f3SAndreas Gohr        $this->assertArrayNotHasKey(meta\SearchConfigParameters::$PARAM_SORT, $param);
2198fed17f3SAndreas Gohr    }
2208fed17f3SAndreas Gohr
2218fed17f3SAndreas Gohr    public function test_pagination()
2228fed17f3SAndreas Gohr    {
2238fed17f3SAndreas Gohr        global $INPUT;
2248fed17f3SAndreas Gohr
2258fed17f3SAndreas Gohr        $data = [
2268fed17f3SAndreas Gohr            'schemas' => [
2278fed17f3SAndreas Gohr                ['schema2', 'alias2'],
2288fed17f3SAndreas Gohr            ],
2298fed17f3SAndreas Gohr            'cols' => [
2308fed17f3SAndreas Gohr                'afirst'
2318fed17f3SAndreas Gohr            ],
2328fed17f3SAndreas Gohr            'rownumbers' => '1',
2338fed17f3SAndreas Gohr            'limit' => '5',
234*af0ce8d2SAndreas Gohr            'nesting' => 0,
235*af0ce8d2SAndreas Gohr            'index' => 0,
236*af0ce8d2SAndreas Gohr            'classes' => [],
2378fed17f3SAndreas Gohr        ];
2388fed17f3SAndreas Gohr
2398fed17f3SAndreas Gohr        $R = new \Doku_Renderer_xhtml();
2408fed17f3SAndreas Gohr        // init with offset
2418fed17f3SAndreas Gohr        $INPUT->set(meta\SearchConfigParameters::$PARAM_OFFSET, 5);
2428fed17f3SAndreas Gohr        $searchConfig = new meta\SearchConfig($data);
2438fed17f3SAndreas Gohr        $aggregationTable = new meta\AggregationTable('test_pagination', 'xhtml', $R, $searchConfig);
244*af0ce8d2SAndreas Gohr        $aggregationTable->startScope();
2458fed17f3SAndreas Gohr        $aggregationTable->render();
246*af0ce8d2SAndreas Gohr        $aggregationTable->finishScope();
2478fed17f3SAndreas Gohr
2488fed17f3SAndreas Gohr        $rev = time();
2498fed17f3SAndreas Gohr
250850ad33eSAndreas Gohr        $doc = new Document();
25176e537bfSAndreas Gohr        $doc->html($R->doc);
252850ad33eSAndreas Gohr        $table = $doc->find('div.structaggregation');
253850ad33eSAndreas Gohr
254850ad33eSAndreas Gohr        $tr1 = $table->find(".row1");
2558fed17f3SAndreas Gohr        $this->assertEquals('6page14 first data', trim($tr1->text()));
2568fed17f3SAndreas Gohr        $this->assertEquals('page14', $tr1->attr('data-pid'));
2578fed17f3SAndreas Gohr        $this->assertEquals('0', $tr1->attr('data-rid'));
2583ff5da8aSAndreas Gohr        $this->assertEquals($this->fixedrev, $tr1->attr('data-rev'));
2598fed17f3SAndreas Gohr
260850ad33eSAndreas Gohr        $tr6aPrev = $table->find(".row6 a.prev");
2618fed17f3SAndreas Gohr        $this->assertEquals('/./doku.php?id=test_pagination', $tr6aPrev->attr('href'));
2628fed17f3SAndreas Gohr
2638fed17f3SAndreas Gohr    }
2648fed17f3SAndreas Gohr}
265