xref: /plugin/struct/_test/SearchConfigTest.php (revision 7923cdacab81de55732b2931695bdc6734571b7e)
1<?php
2
3namespace dokuwiki\plugin\struct\test;
4
5use dokuwiki\plugin\struct\meta;
6use dokuwiki\plugin\struct\test\mock\SearchConfig;
7
8/**
9 * @group plugin_struct
10 * @group plugins
11 *
12 */
13class SearchConfigTest extends StructTest
14{
15
16    public function test_filtervars_simple()
17    {
18        global $INFO;
19        $INFO['id'] = 'foo:bar:baz';
20
21        $searchConfig = new SearchConfig([]);
22
23        $this->assertEquals('foo:bar:baz', $searchConfig->applyFilterVars('$ID$'));
24        $this->assertEquals('baz', $searchConfig->applyFilterVars('$PAGE$'));
25        $this->assertEquals('foo:bar', $searchConfig->applyFilterVars('$NS$'));
26        $this->assertEquals(date('Y-m-d'), $searchConfig->applyFilterVars('$TODAY$'));
27        $this->assertEquals('', $searchConfig->applyFilterVars('$USER$'));
28        $_SERVER['REMOTE_USER'] = 'user';
29        $this->assertEquals('user', $searchConfig->applyFilterVars('$USER$'));
30
31        $this->assertEquals('user baz', $searchConfig->applyFilterVars('$USER$ $PAGE$'));
32        $this->assertEquals('$user', $searchConfig->applyFilterVars('$user'));
33        $this->assertEquals(date('Y-m-d'), $searchConfig->applyFilterVars('$DATE(now)$'));
34    }
35
36    public function test_filtervars_nsorid()
37    {
38        global $INFO;
39
40
41        $searchConfig = new SearchConfig([]);
42
43        // normal page
44        $INFO['id'] = 'foo:bar:baz';
45        $this->assertEquals('foo:bar:baz', $searchConfig->applyFilterVars('$NSORID$'));
46
47        // start page: start in namespace
48        $INFO['id'] = 'foo:bar:start';
49        saveWikiText($INFO['id'], 'start page', 'start created');
50        $this->assertEquals('foo:bar', $searchConfig->applyFilterVars('$NSORID$'));
51        saveWikiText($INFO['id'], '', 'start page deleted');
52        clearstatcache();
53
54        // start page: same as namespace in namespace
55        $INFO['id'] = 'foo:bar:bar';
56        saveWikiText($INFO['id'], 'start page', 'start created');
57        $this->assertEquals('foo:bar', $searchConfig->applyFilterVars('$NSORID$'));
58        saveWikiText($INFO['id'], '', 'start page deleted');
59        clearstatcache();
60
61        // start page: same as namespace in above namespace
62        // incidally this is the same as a normal page
63        $INFO['id'] = 'foo:bar';
64        saveWikiText($INFO['id'], 'start page', 'start created');
65        $this->assertEquals('foo:bar', $searchConfig->applyFilterVars('$NSORID$'));
66        saveWikiText($INFO['id'], '', 'start page deleted');
67        clearstatcache();
68    }
69
70    public function test_filtervars_struct()
71    {
72        global $INFO;
73        $INFO['id'] = 'foo:bar:baz';
74
75        // prepare some struct data
76        $sb = new meta\SchemaImporter('schema1', file_get_contents(__DIR__ . '/json/schema1.struct.json'));
77        $sb->build();
78        $schemaData = meta\AccessTable::getPageAccess('schema1', $INFO['id'], time());
79        $schemaData->saveData(
80            [
81                'first' => 'test',
82                'second' => ['multi1', 'multi2']
83            ]
84        );
85
86        $searchConfig = new SearchConfig(['schemas' => [['schema1', 'alias']]]);
87        $this->assertEquals('test', $searchConfig->applyFilterVars('$STRUCT.first$'));
88        $this->assertEquals('test', $searchConfig->applyFilterVars('$STRUCT.alias.first$'));
89        $this->assertEquals('test', $searchConfig->applyFilterVars('$STRUCT.schema1.first$'));
90
91        $this->assertEquals('pretestpost', $searchConfig->applyFilterVars('pre$STRUCT.first$post'));
92        $this->assertEquals('pretestpost', $searchConfig->applyFilterVars('pre$STRUCT.alias.first$post'));
93        $this->assertEquals('pretestpost', $searchConfig->applyFilterVars('pre$STRUCT.schema1.first$post'));
94
95        $this->assertEquals(['multi1', 'multi2'], $searchConfig->applyFilterVars('$STRUCT.second$'));
96        $this->assertEquals(['multi1', 'multi2'], $searchConfig->applyFilterVars('$STRUCT.alias.second$'));
97        $this->assertEquals(['multi1', 'multi2'], $searchConfig->applyFilterVars('$STRUCT.schema1.second$'));
98
99        $this->assertEquals(['premulti1post', 'premulti2post'], $searchConfig->applyFilterVars('pre$STRUCT.second$post'));
100        $this->assertEquals(['premulti1post', 'premulti2post'], $searchConfig->applyFilterVars('pre$STRUCT.alias.second$post'));
101        $this->assertEquals(['premulti1post', 'premulti2post'], $searchConfig->applyFilterVars('pre$STRUCT.schema1.second$post'));
102
103        $this->assertEquals('', $searchConfig->applyFilterVars('$STRUCT.notexisting$'));
104    }
105
106    public function test_filtervars_struct_other()
107    {
108        global $INFO;
109        $INFO['id'] = 'foo:bar:baz';
110
111        // prepare some struct data
112        $sb = new meta\SchemaImporter('schema2', file_get_contents(__DIR__ . '/json/schema2.struct.json'));
113        $sb->build();
114        $sb = new meta\SchemaImporter('schema3', file_get_contents(__DIR__ . '/json/schema2int.struct.json'));
115        $sb->build();
116        $schemaData = meta\AccessTable::getPageAccess('schema2', $INFO['id'], time());
117        $schemaData->saveData(
118            [
119                'afirst' => 'test',
120                'asecond' => ['multi1', 'multi2']
121            ]
122        );
123        $schemaData = meta\AccessTable::getPageAccess('schema3', 'foo:test:baz', time());
124        $schemaData->saveData(
125            [
126                'afirst' => 'test1',
127                'asecond' => ['multi1a', 'multi2a']
128            ]
129        );
130
131        $searchConfig = new SearchConfig(['schemas' => [['schema3', 'alias']]]);
132        $this->assertEquals('', $searchConfig->applyFilterVars('$STRUCT.afirst$'));
133        $this->assertEquals('test', $searchConfig->applyFilterVars('$STRUCT.schema2.afirst$'));
134
135        $this->assertEquals('prepost', $searchConfig->applyFilterVars('pre$STRUCT.afirst$post'));
136        $this->assertEquals('pretestpost', $searchConfig->applyFilterVars('pre$STRUCT.schema2.afirst$post'));
137
138        $this->assertEquals('', $searchConfig->applyFilterVars('$STRUCT.asecond$'));
139        $this->assertEquals(['multi1', 'multi2'], $searchConfig->applyFilterVars('$STRUCT.schema2.asecond$'));
140
141        $this->assertEquals('prepost', $searchConfig->applyFilterVars('pre$STRUCT.asecond$post'));
142        $this->assertEquals(['premulti1post', 'premulti2post'], $searchConfig->applyFilterVars('pre$STRUCT.schema2.asecond$post'));
143
144        $this->assertEquals('', $searchConfig->applyFilterVars('$STRUCT.notexisting$'));
145
146        $this->assertEquals('', $searchConfig->applyFilterVars('$STRUCT.afirst$'));
147        $this->assertEquals('test', $searchConfig->applyFilterVars('$STRUCT.schema2.afirst$'));
148    }
149
150    public function test_filtervars_user()
151    {
152        global $INFO, $USERINFO;
153
154        $searchConfig = new SearchConfig([]);
155
156        $_SERVER['REMOTE_USER'] = 'john';
157        $USERINFO['name'] = 'John Smith';
158        $USERINFO['mail'] = 'john.smith@example.com';
159        $USERINFO['grps'] = ['user', 'test'];
160        //update info array
161        $INFO['userinfo'] = $USERINFO;
162
163        $this->assertEquals('John Smith', $searchConfig->applyFilterVars('$USER.name$'));
164        $this->assertEquals('john.smith@example.com', $searchConfig->applyFilterVars('$USER.mail$'));
165        $this->assertEquals(['user', 'test'], $searchConfig->applyFilterVars('$USER.grps$'));
166    }
167
168    public function test_cacheflags()
169    {
170        $searchConfig = new SearchConfig([]);
171
172        $flag = $searchConfig->determineCacheFlag(['foo', 'bar']);
173        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_DEFAULT));
174        $this->assertFalse((bool)($flag & SearchConfig::$CACHE_USER));
175        $this->assertFalse((bool)($flag & SearchConfig::$CACHE_DATE));
176
177        $flag = $searchConfig->determineCacheFlag(['foo', '$USER$']);
178        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_DEFAULT));
179        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_USER));
180        $this->assertFalse((bool)($flag & SearchConfig::$CACHE_DATE));
181
182        $flag = $searchConfig->determineCacheFlag(['foo', '$TODAY$']);
183        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_DEFAULT));
184        $this->assertFalse((bool)($flag & SearchConfig::$CACHE_USER));
185        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_DATE));
186
187        $flag = $searchConfig->determineCacheFlag(['foo', '$TODAY$', '$USER$']);
188        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_DEFAULT));
189        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_USER));
190        $this->assertTrue((bool)($flag & SearchConfig::$CACHE_DATE));
191    }
192}
193