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