MediaWiki REL1_34
TitleLibraryTest.php
Go to the documentation of this file.
1<?php
2
8 protected static $moduleName = 'TitleLibraryTests';
9
10 public static function suite( $className ) {
11 global $wgInterwikiCache;
12 if ( $wgInterwikiCache ) {
13 $suite = new PHPUnit_Framework_TestSuite;
14 $suite->setName( $className );
15 $suite->addTest(
17 $className, 'Cannot run TitleLibrary tests when $wgInterwikiCache is set'
18 ), [ 'Lua' ]
19 );
20 return $suite;
21 }
22
23 return parent::suite( $className );
24 }
25
26 protected function setUp() {
27 global $wgHooks;
28
29 parent::setUp();
30
31 // Hook to inject our interwiki prefix
32 $this->hooks = $wgHooks;
33 $wgHooks['InterwikiLoadPrefix'][] = function ( $prefix, &$data ) {
34 if ( $prefix !== 'interwikiprefix' ) {
35 return true;
36 }
37
38 $data = [
39 'iw_prefix' => 'interwikiprefix',
40 'iw_url' => '//test.wikipedia.org/wiki/$1',
41 'iw_api' => 1,
42 'iw_wikiid' => 0,
43 'iw_local' => 0,
44 'iw_trans' => 0,
45 ];
46 return false;
47 };
48
49 // Page for getContent test
50 $page = WikiPage::factory( Title::newFromText( 'ScribuntoTestPage' ) );
51 $page->doEditContent(
53 '{{int:mainpage}}<includeonly>...</includeonly><noinclude>...</noinclude>'
54 ),
55 'Summary'
56 );
57 $testPageId = $page->getId();
58
59 // Pages for redirectTarget tests
60 $page = WikiPage::factory( Title::newFromText( 'ScribuntoTestRedirect' ) );
61 $page->doEditContent(
62 new WikitextContent( '#REDIRECT [[ScribuntoTestTarget]]' ),
63 'Summary'
64 );
65 $page = WikiPage::factory( Title::newFromText( 'ScribuntoTestNonRedirect' ) );
66 $page->doEditContent(
67 new WikitextContent( 'Not a redirect.' ),
68 'Summary'
69 );
70
71 // Set restrictions for protectionLevels and cascadingProtection tests
72 // Since mRestrictionsLoaded is true, they don't count as expensive
73 $title = Title::newFromText( 'Main Page' );
74 $title->mRestrictionsLoaded = true;
75 $title->mRestrictions = [ 'edit' => [], 'move' => [] ];
76 $title->mCascadeSources = [
77 Title::makeTitle( NS_MAIN, "Lockbox" ),
78 Title::makeTitle( NS_MAIN, "Lockbox2" ),
79 ];
80 $title->mCascadingRestrictions = [ 'edit' => [ 'sysop' ] ];
81 $title = Title::newFromText( 'Module:TestFramework' );
82 $title->mRestrictionsLoaded = true;
83 $title->mRestrictions = [
84 'edit' => [ 'sysop', 'bogus' ],
85 'move' => [ 'sysop', 'bogus' ],
86 ];
87 $title->mCascadeSources = [];
88 $title->mCascadingRestrictions = [];
89 $title = Title::newFromText( 'interwikiprefix:Module:TestFramework' );
90 $title->mRestrictionsLoaded = true;
91 $title->mRestrictions = [];
92 $title->mCascadeSources = [];
93 $title->mCascadingRestrictions = [];
94 $title = Title::newFromText( 'Talk:Has/A/Subpage' );
95 $title->mRestrictionsLoaded = true;
96 $title->mRestrictions = [ 'create' => [ 'sysop' ] ];
97 $title->mCascadeSources = [];
98 $title->mCascadingRestrictions = [];
99 $title = Title::newFromText( 'Not/A/Subpage' );
100 $title->mRestrictionsLoaded = true;
101 $title->mRestrictions = [ 'edit' => [ 'autoconfirmed' ], 'move' => [ 'sysop' ] ];
102 $title->mCascadeSources = [];
103 $title->mCascadingRestrictions = [];
104 $title = Title::newFromText( 'Module talk:Test Framework' );
105 $title->mRestrictionsLoaded = true;
106 $title->mRestrictions = [ 'edit' => [], 'move' => [ 'sysop' ] ];
107 $title->mCascadeSources = [];
108 $title->mCascadingRestrictions = [];
109
110 // Note this depends on every iteration of the data provider running with a clean parser
111 $this->getEngine()->getParser()->getOptions()->setExpensiveParserFunctionLimit( 10 );
112
113 // Indicate to the tests that it's safe to create the title objects
114 $interpreter = $this->getEngine()->getInterpreter();
115 $interpreter->callFunction(
116 $interpreter->loadString( "mw.title.testPageId = $testPageId", 'fortest' )
117 );
118
119 $this->setMwGlobals( [
120 'wgServer' => '//wiki.local',
121 'wgCanonicalServer' => 'http://wiki.local',
122 'wgUsePathInfo' => true,
123 'wgActionPaths' => [],
124 'wgScript' => '/w/index.php',
125 'wgScriptPath' => '/w',
126 'wgArticlePath' => '/wiki/$1',
127 ] );
128 }
129
130 protected function tearDown() {
131 global $wgHooks;
132 $wgHooks = $this->hooks;
133 parent::tearDown();
134 }
135
136 protected function getTestModules() {
137 return parent::getTestModules() + [
138 'TitleLibraryTests' => __DIR__ . '/TitleLibraryTests.lua',
139 ];
140 }
141
142 public function testAddsLinks() {
143 $engine = $this->getEngine();
144 $interpreter = $engine->getInterpreter();
145
146 // Loading a title should create a link
147 $links = $engine->getParser()->getOutput()->getLinks();
148 $this->assertFalse( isset( $links[NS_PROJECT]['Referenced_from_Lua'] ) );
149
150 $interpreter->callFunction( $interpreter->loadString(
151 'local _ = mw.title.new( "Project:Referenced from Lua" ).id', 'reference title'
152 ) );
153
154 $links = $engine->getParser()->getOutput()->getLinks();
155 $this->assertArrayHasKey( NS_PROJECT, $links );
156 $this->assertArrayHasKey( 'Referenced_from_Lua', $links[NS_PROJECT] );
157
158 // Loading the page content should create a templatelink
159 $templates = $engine->getParser()->getOutput()->getTemplates();
160 $this->assertFalse( isset( $links[NS_PROJECT]['Loaded_from_Lua'] ) );
161
162 $interpreter->callFunction( $interpreter->loadString(
163 'mw.title.new( "Project:Loaded from Lua" ):getContent()', 'load title'
164 ) );
165
166 $templates = $engine->getParser()->getOutput()->getTemplates();
167 $this->assertArrayHasKey( NS_PROJECT, $templates );
168 $this->assertArrayHasKey( 'Loaded_from_Lua', $templates[NS_PROJECT] );
169 }
170}
bool array string $wgInterwikiCache
Interwiki cache, either as an associative array or a path to a constant database (....
$wgHooks['AdminLinks'][]
This is the subclass for Lua library tests.
@covers Scribunto_LuaTitleLibrary @group Database
Content object for wiki text pages.
const NS_MAIN
Definition Defines.php:69
const NS_PROJECT
Definition Defines.php:73