6 * @author Thiemo Mättig
11 class ActionTest
extends MediaWikiTestCase
{
13 protected function setUp() {
16 $context = $this->getContext();
17 $this->setMwGlobals( 'wgActions', [
22 'revisiondelete' => 'SpecialPageAction',
24 'string' => 'NamedDummyAction',
25 'declared' => 'NonExistingClassName',
26 'callable' => [ $this, 'dummyActionCallback' ],
27 'object' => new InstantiatedDummyAction( $context->getWikiPage(), $context ),
31 private function getPage() {
32 return WikiPage
::factory( Title
::makeTitle( 0, 'Title' ) );
35 private function getContext( $requestedAction = null ) {
36 $request = new FauxRequest( [ 'action' => $requestedAction ] );
38 $context = new DerivativeContext( RequestContext
::getMain() );
39 $context->setRequest( $request );
40 $context->setWikiPage( $this->getPage() );
45 public function actionProvider() {
47 [ 'dummy', 'DummyAction' ],
48 [ 'string', 'NamedDummyAction' ],
49 [ 'callable', 'CalledDummyAction' ],
50 [ 'object', 'InstantiatedDummyAction' ],
52 // Capitalization is ignored
53 [ 'DUMMY', 'DummyAction' ],
54 [ 'STRING', 'NamedDummyAction' ],
56 // Null and non-existing values
58 [ 'undeclared', null ],
63 * @dataProvider actionProvider
64 * @param string $requestedAction
65 * @param string|null $expected
67 public function testActionExists( $requestedAction, $expected ) {
68 $exists = Action
::exists( $requestedAction );
70 $this->assertSame( $expected !== null, $exists );
73 public function testActionExists_doesNotRequireInstantiation() {
74 // The method is not supposed to check if the action can be instantiated.
75 $exists = Action
::exists( 'declared' );
77 $this->assertTrue( $exists );
81 * @dataProvider actionProvider
82 * @param string $requestedAction
83 * @param string|null $expected
85 public function testGetActionName( $requestedAction, $expected ) {
86 $context = $this->getContext( $requestedAction );
87 $actionName = Action
::getActionName( $context );
89 $this->assertEquals( $expected ?
: 'nosuchaction', $actionName );
92 public function testGetActionName_editredlinkWorkaround() {
93 // See https://phabricator.wikimedia.org/T22966
94 $context = $this->getContext( 'editredlink' );
95 $actionName = Action
::getActionName( $context );
97 $this->assertEquals( 'edit', $actionName );
100 public function testGetActionName_historysubmitWorkaround() {
101 // See https://phabricator.wikimedia.org/T22966
102 $context = $this->getContext( 'historysubmit' );
103 $actionName = Action
::getActionName( $context );
105 $this->assertEquals( 'view', $actionName );
108 public function testGetActionName_revisiondeleteWorkaround() {
109 // See https://phabricator.wikimedia.org/T22966
110 $context = $this->getContext( 'historysubmit' );
111 $context->getRequest()->setVal( 'revisiondelete', true );
112 $actionName = Action
::getActionName( $context );
114 $this->assertEquals( 'revisiondelete', $actionName );
117 public function testGetActionName_whenCanNotUseWikiPage_defaultsToView() {
118 $request = new FauxRequest( [ 'action' => 'edit' ] );
119 $context = new DerivativeContext( RequestContext
::getMain() );
120 $context->setRequest( $request );
121 $actionName = Action
::getActionName( $context );
123 $this->assertEquals( 'view', $actionName );
127 * @dataProvider actionProvider
128 * @param string $requestedAction
129 * @param string|null $expected
131 public function testActionFactory( $requestedAction, $expected ) {
132 $context = $this->getContext();
133 $action = Action
::factory( $requestedAction, $context->getWikiPage(), $context );
135 $this->assertType( $expected ?
: 'null', $action );
138 public function emptyActionProvider() {
147 * @dataProvider emptyActionProvider
149 public function testEmptyAction_doesNotExist( $requestedAction ) {
150 $exists = Action
::exists( $requestedAction );
152 $this->assertFalse( $exists );
156 * @dataProvider emptyActionProvider
158 public function testEmptyAction_defaultsToView( $requestedAction ) {
159 $context = $this->getContext( $requestedAction );
160 $actionName = Action
::getActionName( $context );
162 $this->assertEquals( 'view', $actionName );
166 * @dataProvider emptyActionProvider
168 public function testEmptyAction_canNotBeInstantiated( $requestedAction ) {
169 $page = $this->getPage();
170 $action = Action
::factory( $requestedAction, $page );
172 $this->assertNull( $action );
175 public function testDisabledAction_exists() {
176 $exists = Action
::exists( 'disabled' );
178 $this->assertTrue( $exists );
181 public function testDisabledAction_isNotResolved() {
182 $context = $this->getContext( 'disabled' );
183 $actionName = Action
::getActionName( $context );
185 $this->assertEquals( 'nosuchaction', $actionName );
188 public function testDisabledAction_factoryReturnsFalse() {
189 $page = $this->getPage();
190 $action = Action
::factory( 'disabled', $page );
192 $this->assertFalse( $action );
195 public function dummyActionCallback() {
196 $context = $this->getContext();
197 return new CalledDummyAction( $context->getWikiPage(), $context );
202 class DummyAction
extends Action
{
204 public function getName() {
205 return static::class;
208 public function show() {
211 public function execute() {
215 class NamedDummyAction
extends DummyAction
{
218 class CalledDummyAction
extends DummyAction
{
221 class InstantiatedDummyAction
extends DummyAction
{