SiteConfigurationTest.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <?php
  2. class SiteConfigurationTest extends MediaWikiTestCase {
  3. /**
  4. * @var SiteConfiguration
  5. */
  6. protected $mConf;
  7. protected function setUp() {
  8. parent::setUp();
  9. $this->mConf = new SiteConfiguration;
  10. $this->mConf->suffixes = [ 'wikipedia' => 'wiki' ];
  11. $this->mConf->wikis = [ 'enwiki', 'dewiki', 'frwiki' ];
  12. $this->mConf->settings = [
  13. 'SimpleKey' => [
  14. 'wiki' => 'wiki',
  15. 'tag' => 'tag',
  16. 'enwiki' => 'enwiki',
  17. 'dewiki' => 'dewiki',
  18. 'frwiki' => 'frwiki',
  19. ],
  20. 'Fallback' => [
  21. 'default' => 'default',
  22. 'wiki' => 'wiki',
  23. 'tag' => 'tag',
  24. 'frwiki' => 'frwiki',
  25. 'null_wiki' => null,
  26. ],
  27. 'WithParams' => [
  28. 'default' => '$lang $site $wiki',
  29. ],
  30. '+SomeGlobal' => [
  31. 'wiki' => [
  32. 'wiki' => 'wiki',
  33. ],
  34. 'tag' => [
  35. 'tag' => 'tag',
  36. ],
  37. 'enwiki' => [
  38. 'enwiki' => 'enwiki',
  39. ],
  40. 'dewiki' => [
  41. 'dewiki' => 'dewiki',
  42. ],
  43. 'frwiki' => [
  44. 'frwiki' => 'frwiki',
  45. ],
  46. ],
  47. 'MergeIt' => [
  48. '+wiki' => [
  49. 'wiki' => 'wiki',
  50. ],
  51. '+tag' => [
  52. 'tag' => 'tag',
  53. ],
  54. 'default' => [
  55. 'default' => 'default',
  56. ],
  57. '+enwiki' => [
  58. 'enwiki' => 'enwiki',
  59. ],
  60. '+dewiki' => [
  61. 'dewiki' => 'dewiki',
  62. ],
  63. '+frwiki' => [
  64. 'frwiki' => 'frwiki',
  65. ],
  66. ],
  67. ];
  68. $GLOBALS['SomeGlobal'] = [ 'SomeGlobal' => 'SomeGlobal' ];
  69. }
  70. /**
  71. * This function is used as a callback within the tests below
  72. */
  73. public static function getSiteParamsCallback( $conf, $wiki ) {
  74. $site = null;
  75. $lang = null;
  76. foreach ( $conf->suffixes as $suffix ) {
  77. if ( substr( $wiki, -strlen( $suffix ) ) == $suffix ) {
  78. $site = $suffix;
  79. $lang = substr( $wiki, 0, -strlen( $suffix ) );
  80. break;
  81. }
  82. }
  83. return [
  84. 'suffix' => $site,
  85. 'lang' => $lang,
  86. 'params' => [
  87. 'lang' => $lang,
  88. 'site' => $site,
  89. 'wiki' => $wiki,
  90. ],
  91. 'tags' => [ 'tag' ],
  92. ];
  93. }
  94. /**
  95. * @covers SiteConfiguration::siteFromDB
  96. */
  97. public function testSiteFromDb() {
  98. $this->assertEquals(
  99. [ 'wikipedia', 'en' ],
  100. $this->mConf->siteFromDB( 'enwiki' ),
  101. 'siteFromDB()'
  102. );
  103. $this->assertEquals(
  104. [ 'wikipedia', '' ],
  105. $this->mConf->siteFromDB( 'wiki' ),
  106. 'siteFromDB() on a suffix'
  107. );
  108. $this->assertEquals(
  109. [ null, null ],
  110. $this->mConf->siteFromDB( 'wikien' ),
  111. 'siteFromDB() on a non-existing wiki'
  112. );
  113. $this->mConf->suffixes = [ 'wiki', '' ];
  114. $this->assertEquals(
  115. [ '', 'wikien' ],
  116. $this->mConf->siteFromDB( 'wikien' ),
  117. 'siteFromDB() on a non-existing wiki (2)'
  118. );
  119. }
  120. /**
  121. * @covers SiteConfiguration::getLocalDatabases
  122. */
  123. public function testGetLocalDatabases() {
  124. $this->assertEquals(
  125. [ 'enwiki', 'dewiki', 'frwiki' ],
  126. $this->mConf->getLocalDatabases(),
  127. 'getLocalDatabases()'
  128. );
  129. }
  130. /**
  131. * @covers SiteConfiguration::get
  132. */
  133. public function testGetConfVariables() {
  134. // Simple
  135. $this->assertEquals(
  136. 'enwiki',
  137. $this->mConf->get( 'SimpleKey', 'enwiki', 'wiki' ),
  138. 'get(): simple setting on an existing wiki'
  139. );
  140. $this->assertEquals(
  141. 'dewiki',
  142. $this->mConf->get( 'SimpleKey', 'dewiki', 'wiki' ),
  143. 'get(): simple setting on an existing wiki (2)'
  144. );
  145. $this->assertEquals(
  146. 'frwiki',
  147. $this->mConf->get( 'SimpleKey', 'frwiki', 'wiki' ),
  148. 'get(): simple setting on an existing wiki (3)'
  149. );
  150. $this->assertEquals(
  151. 'wiki',
  152. $this->mConf->get( 'SimpleKey', 'wiki', 'wiki' ),
  153. 'get(): simple setting on an suffix'
  154. );
  155. $this->assertEquals(
  156. 'wiki',
  157. $this->mConf->get( 'SimpleKey', 'eswiki', 'wiki' ),
  158. 'get(): simple setting on an non-existing wiki'
  159. );
  160. // Fallback
  161. $this->assertEquals(
  162. 'wiki',
  163. $this->mConf->get( 'Fallback', 'enwiki', 'wiki' ),
  164. 'get(): fallback setting on an existing wiki'
  165. );
  166. $this->assertEquals(
  167. 'tag',
  168. $this->mConf->get( 'Fallback', 'dewiki', 'wiki', [], [ 'tag' ] ),
  169. 'get(): fallback setting on an existing wiki (with wiki tag)'
  170. );
  171. $this->assertEquals(
  172. 'frwiki',
  173. $this->mConf->get( 'Fallback', 'frwiki', 'wiki', [], [ 'tag' ] ),
  174. 'get(): no fallback if wiki has its own setting (matching tag)'
  175. );
  176. $this->assertSame(
  177. // Potential regression test for T192855
  178. null,
  179. $this->mConf->get( 'Fallback', 'null_wiki', 'wiki', [], [ 'tag' ] ),
  180. 'get(): no fallback if wiki has its own setting (matching tag and uses null)'
  181. );
  182. $this->assertEquals(
  183. 'wiki',
  184. $this->mConf->get( 'Fallback', 'wiki', 'wiki' ),
  185. 'get(): fallback setting on an suffix'
  186. );
  187. $this->assertEquals(
  188. 'wiki',
  189. $this->mConf->get( 'Fallback', 'wiki', 'wiki', [], [ 'tag' ] ),
  190. 'get(): fallback setting on an suffix (with wiki tag)'
  191. );
  192. $this->assertEquals(
  193. 'wiki',
  194. $this->mConf->get( 'Fallback', 'eswiki', 'wiki' ),
  195. 'get(): fallback setting on an non-existing wiki'
  196. );
  197. $this->assertEquals(
  198. 'tag',
  199. $this->mConf->get( 'Fallback', 'eswiki', 'wiki', [], [ 'tag' ] ),
  200. 'get(): fallback setting on an non-existing wiki (with wiki tag)'
  201. );
  202. // Merging
  203. $common = [ 'wiki' => 'wiki', 'default' => 'default' ];
  204. $commonTag = [ 'tag' => 'tag', 'wiki' => 'wiki', 'default' => 'default' ];
  205. $this->assertEquals(
  206. [ 'enwiki' => 'enwiki' ] + $common,
  207. $this->mConf->get( 'MergeIt', 'enwiki', 'wiki' ),
  208. 'get(): merging setting on an existing wiki'
  209. );
  210. $this->assertEquals(
  211. [ 'enwiki' => 'enwiki' ] + $commonTag,
  212. $this->mConf->get( 'MergeIt', 'enwiki', 'wiki', [], [ 'tag' ] ),
  213. 'get(): merging setting on an existing wiki (with tag)'
  214. );
  215. $this->assertEquals(
  216. [ 'dewiki' => 'dewiki' ] + $common,
  217. $this->mConf->get( 'MergeIt', 'dewiki', 'wiki' ),
  218. 'get(): merging setting on an existing wiki (2)'
  219. );
  220. $this->assertEquals(
  221. [ 'dewiki' => 'dewiki' ] + $commonTag,
  222. $this->mConf->get( 'MergeIt', 'dewiki', 'wiki', [], [ 'tag' ] ),
  223. 'get(): merging setting on an existing wiki (2) (with tag)'
  224. );
  225. $this->assertEquals(
  226. [ 'frwiki' => 'frwiki' ] + $common,
  227. $this->mConf->get( 'MergeIt', 'frwiki', 'wiki' ),
  228. 'get(): merging setting on an existing wiki (3)'
  229. );
  230. $this->assertEquals(
  231. [ 'frwiki' => 'frwiki' ] + $commonTag,
  232. $this->mConf->get( 'MergeIt', 'frwiki', 'wiki', [], [ 'tag' ] ),
  233. 'get(): merging setting on an existing wiki (3) (with tag)'
  234. );
  235. $this->assertEquals(
  236. [ 'wiki' => 'wiki' ] + $common,
  237. $this->mConf->get( 'MergeIt', 'wiki', 'wiki' ),
  238. 'get(): merging setting on an suffix'
  239. );
  240. $this->assertEquals(
  241. [ 'wiki' => 'wiki' ] + $commonTag,
  242. $this->mConf->get( 'MergeIt', 'wiki', 'wiki', [], [ 'tag' ] ),
  243. 'get(): merging setting on an suffix (with tag)'
  244. );
  245. $this->assertEquals(
  246. $common,
  247. $this->mConf->get( 'MergeIt', 'eswiki', 'wiki' ),
  248. 'get(): merging setting on an non-existing wiki'
  249. );
  250. $this->assertEquals(
  251. $commonTag,
  252. $this->mConf->get( 'MergeIt', 'eswiki', 'wiki', [], [ 'tag' ] ),
  253. 'get(): merging setting on an non-existing wiki (with tag)'
  254. );
  255. }
  256. /**
  257. * @covers SiteConfiguration::siteFromDB
  258. */
  259. public function testSiteFromDbWithCallback() {
  260. $this->mConf->siteParamsCallback = 'SiteConfigurationTest::getSiteParamsCallback';
  261. $this->assertEquals(
  262. [ 'wiki', 'en' ],
  263. $this->mConf->siteFromDB( 'enwiki' ),
  264. 'siteFromDB() with callback'
  265. );
  266. $this->assertEquals(
  267. [ 'wiki', '' ],
  268. $this->mConf->siteFromDB( 'wiki' ),
  269. 'siteFromDB() with callback on a suffix'
  270. );
  271. $this->assertEquals(
  272. [ null, null ],
  273. $this->mConf->siteFromDB( 'wikien' ),
  274. 'siteFromDB() with callback on a non-existing wiki'
  275. );
  276. }
  277. /**
  278. * @covers SiteConfiguration::get
  279. */
  280. public function testParameterReplacement() {
  281. $this->mConf->siteParamsCallback = 'SiteConfigurationTest::getSiteParamsCallback';
  282. $this->assertEquals(
  283. 'en wiki enwiki',
  284. $this->mConf->get( 'WithParams', 'enwiki', 'wiki' ),
  285. 'get(): parameter replacement on an existing wiki'
  286. );
  287. $this->assertEquals(
  288. 'de wiki dewiki',
  289. $this->mConf->get( 'WithParams', 'dewiki', 'wiki' ),
  290. 'get(): parameter replacement on an existing wiki (2)'
  291. );
  292. $this->assertEquals(
  293. 'fr wiki frwiki',
  294. $this->mConf->get( 'WithParams', 'frwiki', 'wiki' ),
  295. 'get(): parameter replacement on an existing wiki (3)'
  296. );
  297. $this->assertEquals(
  298. ' wiki wiki',
  299. $this->mConf->get( 'WithParams', 'wiki', 'wiki' ),
  300. 'get(): parameter replacement on an suffix'
  301. );
  302. $this->assertEquals(
  303. 'es wiki eswiki',
  304. $this->mConf->get( 'WithParams', 'eswiki', 'wiki' ),
  305. 'get(): parameter replacement on an non-existing wiki'
  306. );
  307. }
  308. /**
  309. * @covers SiteConfiguration::getAll
  310. */
  311. public function testGetAllGlobals() {
  312. $this->mConf->siteParamsCallback = 'SiteConfigurationTest::getSiteParamsCallback';
  313. $getall = [
  314. 'SimpleKey' => 'enwiki',
  315. 'Fallback' => 'tag',
  316. 'WithParams' => 'en wiki enwiki',
  317. 'SomeGlobal' => [ 'enwiki' => 'enwiki' ] + $GLOBALS['SomeGlobal'],
  318. 'MergeIt' => [
  319. 'enwiki' => 'enwiki',
  320. 'tag' => 'tag',
  321. 'wiki' => 'wiki',
  322. 'default' => 'default'
  323. ],
  324. ];
  325. $this->assertEquals( $getall, $this->mConf->getAll( 'enwiki' ), 'getAll()' );
  326. $this->mConf->extractAllGlobals( 'enwiki', 'wiki' );
  327. $this->assertEquals(
  328. $getall['SimpleKey'],
  329. $GLOBALS['SimpleKey'],
  330. 'extractAllGlobals(): simple setting'
  331. );
  332. $this->assertEquals(
  333. $getall['Fallback'],
  334. $GLOBALS['Fallback'],
  335. 'extractAllGlobals(): fallback setting'
  336. );
  337. $this->assertEquals(
  338. $getall['WithParams'],
  339. $GLOBALS['WithParams'],
  340. 'extractAllGlobals(): parameter replacement'
  341. );
  342. $this->assertEquals(
  343. $getall['SomeGlobal'],
  344. $GLOBALS['SomeGlobal'],
  345. 'extractAllGlobals(): merging with global'
  346. );
  347. $this->assertEquals(
  348. $getall['MergeIt'],
  349. $GLOBALS['MergeIt'],
  350. 'extractAllGlobals(): merging setting'
  351. );
  352. }
  353. }