Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4162106
GlobalUserPageTest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
GlobalUserPageTest.php
View Options
<?php
namespace
MediaWiki\GlobalUserPage\Tests\Integration
;
use
MediaWiki\Config\ServiceOptions
;
use
MediaWiki\Config\SiteConfiguration
;
use
MediaWiki\Context\RequestContext
;
use
MediaWiki\GlobalUserPage\GlobalUserPage
;
use
MediaWiki\GlobalUserPage\GlobalUserPageManager
;
use
MediaWiki\GlobalUserPage\WikiGlobalUserPage
;
use
MediaWiki\Linker\LinkTarget
;
use
MediaWiki\Page\Article
;
use
MediaWiki\Title\Title
;
use
MediaWiki\Title\TitleValue
;
use
MediaWiki\User\CentralId\CentralIdLookup
;
use
MediaWikiIntegrationTestCase
;
use
MockHttpTrait
;
use
Wikimedia\Rdbms\IConnectionProvider
;
/**
* @covers \MediaWiki\GlobalUserPage\Hooks::onArticleFromTitle
* @covers \MediaWiki\GlobalUserPage\Hooks::onWikiPageFactory
* @covers \MediaWiki\GlobalUserPage\GlobalUserPage
* @covers \MediaWiki\GlobalUserPage\WikiGlobalUserPage
*
* @group Database
*/
class
GlobalUserPageTest
extends
MediaWikiIntegrationTestCase
{
use
MockHttpTrait
;
private
const
WIKI_DEFINED_IN_SITECONFIGURATION
=
'wiki_in_siteconfiguration'
;
private
const
FOREIGN_WIKI
=
'some_foreign_wiki'
;
private
const
USER_WITH_GLOBAL_USERPAGE
=
'UserWithGlobalUserPage'
;
protected
function
setUp
():
void
{
parent
::
setUp
();
$conf
=
new
SiteConfiguration
();
$conf
->
settings
=
[
'wgServer'
=>
[
self
::
WIKI_DEFINED_IN_SITECONFIGURATION
=>
'https://localwiki.example.com'
],
'wgArticlePath'
=>
[
self
::
WIKI_DEFINED_IN_SITECONFIGURATION
=>
'/wiki/$1'
,
],
];
$conf
->
suffixes
=
[
self
::
WIKI_DEFINED_IN_SITECONFIGURATION
];
$this
->
setMwGlobals
(
'wgConf'
,
$conf
);
}
public
function
addDBDataOnce
()
{
parent
::
addDBDataOnce
();
$this
->
editPage
(
new
TitleValue
(
NS_USER
,
self
::
USER_WITH_GLOBAL_USERPAGE
),
'Global user page content'
);
}
/**
* @dataProvider provideNotRelevantTitles
*
* @param LinkTarget $title
* @return void
*/
public
function
testShouldNotInterceptNotRelevantTitles
(
LinkTarget
$title
):
void
{
$title
=
$this
->
getServiceContainer
()
->
getTitleFactory
()
->
newFromLinkTarget
(
$title
);
$context
=
RequestContext
::
getMain
();
$context
->
setTitle
(
$title
);
$article
=
Article
::
newFromTitle
(
$title
,
$context
);
$this
->
assertNotInstanceOf
(
GlobalUserPage
::
class
,
$article
);
$this
->
assertNotInstanceOf
(
WikiGlobalUserPage
::
class
,
$article
->
getPage
()
);
}
public
static
function
provideNotRelevantTitles
():
iterable
{
yield
'not a userpage'
=>
[
new
TitleValue
(
NS_MAIN
,
'MainPage'
),
];
yield
'userpage that exists locally'
=>
[
// NB.: We use this page to simulate a global userpage in testShowMissingArticle(),
// but since all pages live on the same wiki in tests, it's suitable for emulating
// an existing local userpage as well, saving us one edit during setup.
new
TitleValue
(
NS_USER
,
self
::
USER_WITH_GLOBAL_USERPAGE
)
];
}
/**
* @dataProvider provideShowMissingArticle
*/
public
function
testShowMissingArticle
(
string
$globalUserPageDBname
,
string
$expectedCanonicalUrl
):
void
{
$this
->
overrideConfigValue
(
'GlobalUserPageDBname'
,
$globalUserPageDBname
);
$this
->
installMockHttp
(
[
$this
->
makeFakeHttpRequest
(
json_encode
(
[
'parse'
=>
[
'text'
=>
'<div>Global user page HTML</div>'
,
'modules'
=>
[],
'modulestyles'
=>
[],
'jsconfigvars'
=>
[
'wgFoo'
=>
'bar'
,
],
'indicators'
=>
[],
]
]
)
),
// If the wiki storing global user pages isn't defined in $wgConf locally,
// we should fetch it from its API.
$this
->
makeFakeHttpRequest
(
json_encode
(
[
'query'
=>
[
'pages'
=>
[
[
'canonicalurl'
=>
'https://wiki.example.com/wiki/User:UserWithGlobalUserPage'
]
]
],
]
)
)
]
);
$centralIdLookup
=
$this
->
createMock
(
CentralIdLookup
::
class
);
$centralIdLookup
->
method
(
'isAttached'
)
->
willReturn
(
true
);
// Use the local DB connection for simulated connections to the wiki storing global user pages,
// since tests do not support more than one wiki.
$connectionProvider
=
$this
->
createMock
(
IConnectionProvider
::
class
);
$connectionProvider
->
method
(
'getReplicaDatabase'
)
->
with
(
$globalUserPageDBname
)
->
willReturn
(
$this
->
getDb
()
);
$globalUserPageManager
=
new
GlobalUserPageManager
(
$connectionProvider
,
$this
->
getServiceContainer
()->
getUserFactory
(),
$this
->
getServiceContainer
()->
getUserNameUtils
(),
$centralIdLookup
,
new
ServiceOptions
(
GlobalUserPageManager
::
CONSTRUCTOR_OPTIONS
,
[
'GlobalUserPageDBname'
=>
$globalUserPageDBname
,
]
)
);
$this
->
setService
(
'GlobalUserPage.GlobalUserPageManager'
,
$globalUserPageManager
);
// Set up a stubbed userpage title that doesn't exist.
// This is needed because the "global" userpage lives on the local wiki in tests,
// since tests do not support more than one wiki.
$title
=
$this
->
createMock
(
Title
::
class
);
$title
->
method
(
'inNamespace'
)
->
with
(
NS_USER
)
->
willReturn
(
true
);
$title
->
method
(
'canExist'
)
->
willReturn
(
true
);
$title
->
method
(
'exists'
)
->
willReturn
(
false
);
$title
->
method
(
'getText'
)
->
willReturn
(
self
::
USER_WITH_GLOBAL_USERPAGE
);
$title
->
method
(
'getRootText'
)
->
willReturn
(
self
::
USER_WITH_GLOBAL_USERPAGE
);
$title
->
method
(
'getContentModel'
)
->
willReturn
(
CONTENT_MODEL_WIKITEXT
);
$title
->
method
(
'getWikiId'
)
->
willReturn
(
$title
::
LOCAL
);
$context
=
RequestContext
::
getMain
();
$context
->
setTitle
(
$title
);
$article
=
Article
::
newFromTitle
(
$title
,
$context
);
$article
->
showMissingArticle
();
$this
->
assertInstanceOf
(
GlobalUserPage
::
class
,
$article
);
$this
->
assertInstanceOf
(
WikiGlobalUserPage
::
class
,
$article
->
getPage
()
);
$this
->
assertStringContainsString
(
'<div>Global user page HTML</div>'
,
$context
->
getOutput
()->
getHTML
()
);
$this
->
assertSame
(
$expectedCanonicalUrl
,
$context
->
getOutput
()->
getCanonicalUrl
()
);
$this
->
assertSame
(
[
'wgFoo'
=>
'bar'
],
$context
->
getOutput
()->
getJsConfigVars
()
);
}
public
static
function
provideShowMissingArticle
():
iterable
{
yield
'global userpage wiki defined in local $wgConf'
=>
[
self
::
WIKI_DEFINED_IN_SITECONFIGURATION
,
'https://localwiki.example.com/wiki/User:UserWithGlobalUserPage'
,
];
yield
'foreign global userpage wiki'
=>
[
self
::
FOREIGN_WIKI
,
'https://wiki.example.com/wiki/User:UserWithGlobalUserPage'
,
];
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Aug 20 2026, 01:20 (10 w, 7 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
06/a9/ecc8193a6475efa2ad0508a6a93b
Default Alt Text
GlobalUserPageTest.php (6 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment