Merge "Revert "Log the reason why revision->getContent() returns null""
[lhc/web/wiklou.git] / tests / phpunit / includes / actions / ActionTest.php
1 <?php
2
3 /**
4 * @covers Action
5 *
6 * @group Action
7 * @group Database
8 *
9 * @licence GNU GPL v2+
10 * @author Thiemo Kreuz
11 */
12 class ActionTest extends MediaWikiTestCase {
13
14 protected function setUp() {
15 parent::setUp();
16
17 $context = $this->getContext();
18 $this->setMwGlobals( 'wgActions', [
19 'null' => null,
20 'disabled' => false,
21 'view' => true,
22 'edit' => true,
23 'revisiondelete' => SpecialPageAction::class,
24 'dummy' => true,
25 'string' => 'NamedDummyAction',
26 'declared' => 'NonExistingClassName',
27 'callable' => [ $this, 'dummyActionCallback' ],
28 'object' => new InstantiatedDummyAction( $context->getWikiPage(), $context ),
29 ] );
30 }
31
32 private function getPage() {
33 return WikiPage::factory( Title::makeTitle( 0, 'Title' ) );
34 }
35
36 private function getContext( $requestedAction = null ) {
37 $request = new FauxRequest( [ 'action' => $requestedAction ] );
38
39 $context = new DerivativeContext( RequestContext::getMain() );
40 $context->setRequest( $request );
41 $context->setWikiPage( $this->getPage() );
42
43 return $context;
44 }
45
46 public function actionProvider() {
47 return [
48 [ 'dummy', 'DummyAction' ],
49 [ 'string', 'NamedDummyAction' ],
50 [ 'callable', 'CalledDummyAction' ],
51 [ 'object', 'InstantiatedDummyAction' ],
52
53 // Capitalization is ignored
54 [ 'DUMMY', 'DummyAction' ],
55 [ 'STRING', 'NamedDummyAction' ],
56
57 // Null and non-existing values
58 [ 'null', null ],
59 [ 'undeclared', null ],
60 [ '', null ],
61 [ false, null ],
62 ];
63 }
64
65 /**
66 * @dataProvider actionProvider
67 * @param string $requestedAction
68 * @param string|null $expected
69 */
70 public function testActionExists( $requestedAction, $expected ) {
71 $exists = Action::exists( $requestedAction );
72
73 $this->assertSame( $expected !== null, $exists );
74 }
75
76 public function testActionExists_doesNotRequireInstantiation() {
77 // The method is not supposed to check if the action can be instantiated.
78 $exists = Action::exists( 'declared' );
79
80 $this->assertTrue( $exists );
81 }
82
83 /**
84 * @dataProvider actionProvider
85 * @param string $requestedAction
86 * @param string|null $expected
87 */
88 public function testGetActionName( $requestedAction, $expected ) {
89 $context = $this->getContext( $requestedAction );
90 $actionName = Action::getActionName( $context );
91
92 $this->assertEquals( $expected ?: 'nosuchaction', $actionName );
93 }
94
95 public function testGetActionName_editredlinkWorkaround() {
96 // See https://phabricator.wikimedia.org/T22966
97 $context = $this->getContext( 'editredlink' );
98 $actionName = Action::getActionName( $context );
99
100 $this->assertEquals( 'edit', $actionName );
101 }
102
103 public function testGetActionName_historysubmitWorkaround() {
104 // See https://phabricator.wikimedia.org/T22966
105 $context = $this->getContext( 'historysubmit' );
106 $actionName = Action::getActionName( $context );
107
108 $this->assertEquals( 'view', $actionName );
109 }
110
111 public function testGetActionName_revisiondeleteWorkaround() {
112 // See https://phabricator.wikimedia.org/T22966
113 $context = $this->getContext( 'historysubmit' );
114 $context->getRequest()->setVal( 'revisiondelete', true );
115 $actionName = Action::getActionName( $context );
116
117 $this->assertEquals( 'revisiondelete', $actionName );
118 }
119
120 public function testGetActionName_whenCanNotUseWikiPage_defaultsToView() {
121 $request = new FauxRequest( [ 'action' => 'edit' ] );
122 $context = new DerivativeContext( RequestContext::getMain() );
123 $context->setRequest( $request );
124 $actionName = Action::getActionName( $context );
125
126 $this->assertEquals( 'view', $actionName );
127 }
128
129 /**
130 * @dataProvider actionProvider
131 * @param string $requestedAction
132 * @param string|null $expected
133 */
134 public function testActionFactory( $requestedAction, $expected ) {
135 $context = $this->getContext();
136 $action = Action::factory( $requestedAction, $context->getWikiPage(), $context );
137
138 $this->assertType( $expected ?: 'null', $action );
139 }
140
141 public function testNull_doesNotExist() {
142 $exists = Action::exists( null );
143
144 $this->assertFalse( $exists );
145 }
146
147 public function testNull_defaultsToView() {
148 $context = $this->getContext( null );
149 $actionName = Action::getActionName( $context );
150
151 $this->assertEquals( 'view', $actionName );
152 }
153
154 public function testNull_canNotBeInstantiated() {
155 $page = $this->getPage();
156 $action = Action::factory( null, $page );
157
158 $this->assertNull( $action );
159 }
160
161 public function testDisabledAction_exists() {
162 $exists = Action::exists( 'disabled' );
163
164 $this->assertTrue( $exists );
165 }
166
167 public function testDisabledAction_isNotResolved() {
168 $context = $this->getContext( 'disabled' );
169 $actionName = Action::getActionName( $context );
170
171 $this->assertEquals( 'nosuchaction', $actionName );
172 }
173
174 public function testDisabledAction_factoryReturnsFalse() {
175 $page = $this->getPage();
176 $action = Action::factory( 'disabled', $page );
177
178 $this->assertFalse( $action );
179 }
180
181 public function dummyActionCallback() {
182 $context = $this->getContext();
183 return new CalledDummyAction( $context->getWikiPage(), $context );
184 }
185
186 }
187
188 class DummyAction extends Action {
189
190 public function getName() {
191 return static::class;
192 }
193
194 public function show() {
195 }
196
197 public function execute() {
198 }
199 }
200
201 class NamedDummyAction extends DummyAction {
202 }
203
204 class CalledDummyAction extends DummyAction {
205 }
206
207 class InstantiatedDummyAction extends DummyAction {
208 }