35d4ea099720f6b89355b5e1aabadd8d20538a1e
[lhc/web/wiklou.git] / tests / phpunit / includes / registration / VersionCheckerTest.php
1 <?php
2
3 /**
4 * @covers VersionChecker
5 */
6 class VersionCheckerTest extends PHPUnit\Framework\TestCase {
7
8 use MediaWikiCoversValidator;
9 use PHPUnit4And6Compat;
10
11 /**
12 * @dataProvider provideCheck
13 */
14 public function testCheck( $coreVersion, $constraint, $expected ) {
15 $checker = new VersionChecker( $coreVersion );
16 $this->assertEquals( $expected, !(bool)$checker->checkArray( [
17 'FakeExtension' => [
18 'MediaWiki' => $constraint,
19 ],
20 ] )
21 );
22 }
23
24 public static function provideCheck() {
25 return [
26 // [ $wgVersion, constraint, expected ]
27 [ '1.25alpha', '>= 1.26', false ],
28 [ '1.25.0', '>= 1.26', false ],
29 [ '1.26alpha', '>= 1.26', true ],
30 [ '1.26alpha', '>= 1.26.0', true ],
31 [ '1.26alpha', '>= 1.26.0-stable', false ],
32 [ '1.26.0', '>= 1.26.0-stable', true ],
33 [ '1.26.1', '>= 1.26.0-stable', true ],
34 [ '1.27.1', '>= 1.26.0-stable', true ],
35 [ '1.26alpha', '>= 1.26.1', false ],
36 [ '1.26alpha', '>= 1.26alpha', true ],
37 [ '1.26alpha', '>= 1.25', true ],
38 [ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
39 [ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
40 [ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
41 [ '1.26.1', '^1.26.2', false ],
42 // Accept anything for un-parsable version strings
43 [ '1.26mwf14', '== 1.25alpha', true ],
44 [ 'totallyinvalid', '== 1.0', true ],
45 ];
46 }
47
48 /**
49 * @dataProvider provideType
50 */
51 public function testType( $given, $expected ) {
52 $checker = new VersionChecker( '1.0.0' );
53 $checker
54 ->setLoadedExtensionsAndSkins( [
55 'FakeDependency' => [
56 'version' => '1.0.0',
57 ],
58 'NoVersionGiven' => [],
59 ] );
60 $this->assertEquals( $expected, $checker->checkArray( [
61 'FakeExtension' => $given,
62 ] )
63 );
64 }
65
66 public static function provideType() {
67 return [
68 // valid type
69 [
70 [
71 'extensions' => [
72 'FakeDependency' => '1.0.0'
73 ]
74 ],
75 []
76 ],
77 [
78 [
79 'MediaWiki' => '1.0.0'
80 ],
81 []
82 ],
83 [
84 [
85 'extensions' => [
86 'NoVersionGiven' => '*'
87 ]
88 ],
89 [],
90 ],
91 [
92 [
93 'extensions' => [
94 'NoVersionGiven' => '1.0',
95 ]
96 ],
97 [ [
98 'incompatible' => 'FakeExtension',
99 'type' => 'incompatible-extensions',
100 'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.'
101 ] ],
102 ],
103 [
104 [
105 'extensions' => [
106 'Missing' => '*',
107 ]
108 ],
109 [ [
110 'missing' => 'Missing',
111 'type' => 'missing-extensions',
112 'msg' => 'FakeExtension requires Missing to be installed.',
113 ] ],
114 ],
115 [
116 [
117 'extensions' => [
118 'FakeDependency' => '2.0.0',
119 ]
120 ],
121 [ [
122 'incompatible' => 'FakeExtension',
123 'type' => 'incompatible-extensions',
124 // phpcs:ignore Generic.Files.LineLength.TooLong
125 'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.'
126 ] ],
127 ]
128 ];
129 }
130
131 /**
132 * Check, if a non-parsable version constraint does not throw an exception or
133 * returns any error message.
134 */
135 public function testInvalidConstraint() {
136 $checker = new VersionChecker( '1.0.0' );
137 $checker
138 ->setLoadedExtensionsAndSkins( [
139 'FakeDependency' => [
140 'version' => 'not really valid',
141 ],
142 ] );
143 $this->assertEquals(
144 [ [
145 'type' => 'invalid-version',
146 'msg' => "FakeDependency does not have a valid version string."
147 ] ],
148 $checker->checkArray( [
149 'FakeExtension' => [
150 'extensions' => [
151 'FakeDependency' => '1.24.3',
152 ],
153 ],
154 ] )
155 );
156
157 $checker = new VersionChecker( '1.0.0' );
158 $checker
159 ->setLoadedExtensionsAndSkins( [
160 'FakeDependency' => [
161 'version' => '1.24.3',
162 ],
163 ] );
164
165 $this->setExpectedException( UnexpectedValueException::class );
166 $checker->checkArray( [
167 'FakeExtension' => [
168 'FakeDependency' => 'not really valid',
169 ]
170 ] );
171 }
172 }