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