Completed
Push — add/changelog-tooling ( 86359e...64ad4d )
by
unknown
40:44 queued 31:04
created

VersionCommandTest::provideExecute()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 208

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 208
rs 8
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
/**
3
 * Tests for the changelogger validate command.
4
 *
5
 * @package automattic/jetpack-changelogger
6
 */
7
8
// phpcs:disable WordPress.WP.AlternativeFunctions, WordPress.NamingConventions.ValidVariableName
9
10
namespace Automattic\Jetpack\Changelogger\Tests;
11
12
use Symfony\Component\Console\Output\OutputInterface;
13
14
/**
15
 * Tests for the changelogger validate command.
16
 *
17
 * @covers \Automattic\Jetpack\Changelogger\VersionCommand
18
 */
19
class VersionCommandTest extends CommandTestCase {
20
	use \Yoast\PHPUnitPolyfills\Polyfills\AssertionRenames;
21
22
	/**
23
	 * Set up.
24
	 *
25
	 * @before
26
	 */
27
	public function set_up() {
28
		parent::set_up();
29
		$this->useTempDir();
30
31
		mkdir( 'changelog' );
32
		file_put_contents( 'changelog/.gitkeep', '' );
33
	}
34
35
	/**
36
	 * Test the command.
37
	 *
38
	 * @dataProvider provideExecute
39
	 * @param string[] $args Command line arguments.
40
	 * @param array    $options Options for the test and CommandTester.
41
	 * @param int      $expectExitCode Expected exit code.
42
	 * @param string   $expectOutput Expected output.
43
	 */
44
	public function testExecute( array $args, array $options, $expectExitCode, $expectOutput ) {
45
		if ( isset( $options['composer.json'] ) ) {
46
			file_put_contents( 'composer.json', json_encode( array( 'extra' => array( 'changelogger' => $options['composer.json'] ) ), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) );
47
			unset( $options['composer.json'] );
48
		}
49
		if ( isset( $options['CHANGELOG.md'] ) ) {
50
			file_put_contents( 'CHANGELOG.md', $options['CHANGELOG.md'] );
51
			unset( $options['CHANGELOG.md'] );
52
		}
53
		if ( isset( $options['significances'] ) ) {
54
			foreach ( $options['significances'] as $significance ) {
55
				file_put_contents( "changelog/$significance", "Significance: $significance\nType: added\n\nEntry.\n" );
56
			}
57
			unset( $options['significances'] );
58
		}
59
60
		$tester = $this->getTester( 'version' );
61
		$code   = $tester->execute( $args, $options );
62
		$output = str_replace( getcwd() . '/', '/base/path/', rtrim( $tester->getDisplay() ) );
63
		$this->assertSame( $expectOutput, $output );
64
		$this->assertSame( $expectExitCode, $code );
65
	}
66
67
	/**
68
	 * Data provider for testExecute.
69
	 */
70
	public function provideExecute() {
71
		$changelog = "## 2.0.0 - 2021-02-22\n\n## 1.0.0 - 2021-02-21\n";
72
73
		return array(
74
			'Run for previous'                           => array(
75
				array( 'which' => 'previous' ),
76
				array( 'CHANGELOG.md' => $changelog ),
77
				0,
78
				'1.0.0',
79
			),
80
			'Run for previous, abbreviated'              => array(
81
				array( 'which' => 'prev' ),
82
				array( 'CHANGELOG.md' => $changelog ),
83
				0,
84
				'1.0.0',
85
			),
86
			'Run for current'                            => array(
87
				array( 'which' => 'current' ),
88
				array( 'CHANGELOG.md' => $changelog ),
89
				0,
90
				'2.0.0',
91
			),
92
			'Run for current, abbreviated'               => array(
93
				array( 'which' => 'cur' ),
94
				array( 'CHANGELOG.md' => "## 8.0.00 - 2021-02-22\n" ),
95
				0,
96
				'8.0.00',
97
			),
98
			'Run for next, no entries'                   => array(
99
				array( 'which' => 'next' ),
100
				array( 'CHANGELOG.md' => $changelog ),
101
				0,
102
				'2.0.1',
103
			),
104
			'Run for next, some entries'                 => array(
105
				array( 'which' => 'next' ),
106
				array(
107
					'CHANGELOG.md'  => $changelog,
108
					'significances' => array( 'major', 'minor', 'bogus' ),
109
				),
110
				0,
111
				"bogus: Automattic\\Jetpack\\Changelog\\ChangeEntry::setSignificance: Significance must be 'patch', 'minor', or 'major' (or null)\n3.0.0",
112
			),
113
			'Run for previous, quiet'                    => array(
114
				array( 'which' => 'previous' ),
115
				array(
116
					'CHANGELOG.md' => $changelog,
117
					'verbosity'    => OutputInterface::VERBOSITY_QUIET,
118
				),
119
				0,
120
				'1.0.0',
121
			),
122
			'Run for current, quiet'                     => array(
123
				array( 'which' => 'current' ),
124
				array(
125
					'CHANGELOG.md' => $changelog,
126
					'verbosity'    => OutputInterface::VERBOSITY_QUIET,
127
				),
128
				0,
129
				'2.0.0',
130
			),
131
			'Run for next, some entries, quiet'          => array(
132
				array( 'which' => 'next' ),
133
				array(
134
					'CHANGELOG.md'  => $changelog,
135
					'significances' => array( 'major', 'minor', 'bogus' ),
136
					'verbosity'     => OutputInterface::VERBOSITY_QUIET,
137
				),
138
				0,
139
				'3.0.0',
140
			),
141
			'Run for next, --use-version'                => array(
142
				array(
143
					'which'         => 'next',
144
					'--use-version' => '100.200.300',
145
				),
146
				array(),
147
				0,
148
				'100.200.301',
149
			),
150
			'Run for next, --use-significance'           => array(
151
				array(
152
					'which'              => 'next',
153
					'--use-significance' => 'minor',
154
				),
155
				array(
156
					'CHANGELOG.md'  => $changelog,
157
					'significances' => array( 'major' ),
158
				),
159
				0,
160
				'2.1.0',
161
			),
162
			'Run for next, --use-significance bad'       => array(
163
				array(
164
					'which'              => 'next',
165
					'--use-significance' => 'bad',
166
				),
167
				array(
168
					'CHANGELOG.md'  => $changelog,
169
					'significances' => array( 'major' ),
170
				),
171
				1,
172
				"Automattic\\Jetpack\\Changelog\\ChangeEntry::setSignificance: Significance must be 'patch', 'minor', or 'major' (or null)",
173
			),
174
			'Run for next, --prerelease'                 => array(
175
				array(
176
					'which'        => 'next',
177
					'--prerelease' => 'beta',
178
				),
179
				array( 'CHANGELOG.md' => $changelog ),
180
				0,
181
				'2.0.1-beta',
182
			),
183
			'Run for next, --buildinfo'                  => array(
184
				array(
185
					'which'       => 'next',
186
					'--buildinfo' => 'g12345678',
187
				),
188
				array( 'CHANGELOG.md' => $changelog ),
189
				0,
190
				'2.0.1+g12345678',
191
			),
192
			'Run for next, --prerelease and --buildinfo' => array(
193
				array(
194
					'which'        => 'next',
195
					'--prerelease' => 'dev',
196
					'--buildinfo'  => 'g12345678',
197
				),
198
				array( 'CHANGELOG.md' => $changelog ),
199
				0,
200
				'2.0.1-dev+g12345678',
201
			),
202
			'Run for current, ignored options'           => array(
203
				array(
204
					'which'              => 'current',
205
					'--use-version'      => '100.200.300',
206
					'--use-significance' => 'minor',
207
					'--prerelease'       => 'dev',
208
					'--buildinfo'        => 'g12345678',
209
				),
210
				array( 'CHANGELOG.md' => $changelog ),
211
				0,
212
				'2.0.0',
213
			),
214
215
			'Invalid base version, current'              => array(
216
				array( 'which' => 'cur' ),
217
				array( 'CHANGELOG.md' => "## 1.0 - 2021-02-22\n" ),
218
				0,
219
				'1.0',
220
			),
221
			'Invalid base version, next'                 => array(
222
				array( 'which' => 'next' ),
223
				array( 'CHANGELOG.md' => "## 1.0 - 2021-02-22\n" ),
224
				1,
225
				'Version number "1.0" is not in a recognized format.',
226
			),
227
228
			'Invalid formatter'                          => array(
229
				array( 'which' => 'cur' ),
230
				array(
231
					'CHANGELOG.md'  => $changelog,
232
					'composer.json' => array( 'formatter' => 'bogus' ),
233
				),
234
				1,
235
				'Unknown formatter plugin "bogus"',
236
			),
237
			'Invalid versioning'                         => array(
238
				array( 'which' => 'cur' ),
239
				array(
240
					'CHANGELOG.md'  => $changelog,
241
					'composer.json' => array( 'versioning' => 'bogus' ),
242
				),
243
				1,
244
				'Unknown versioning plugin "bogus"',
245
			),
246
			'Invalid "which"'                            => array(
247
				array( 'which' => 'bogus' ),
248
				array( 'CHANGELOG.md' => $changelog ),
249
				1,
250
				'Don\'t know how to fetch the "bogus" version',
251
			),
252
			'No changelog'                               => array(
253
				array( 'which' => 'current' ),
254
				array(),
255
				1,
256
				'Changelog file /base/path/CHANGELOG.md does not exist',
257
			),
258
			'Invalid changelog'                          => array(
259
				array( 'which' => 'current' ),
260
				array( 'CHANGELOG.md' => "## Bogus\n" ),
261
				1,
262
				'Failed to parse changelog: Invalid heading: ## Bogus',
263
			),
264
			'Empty changelog'                            => array(
265
				array( 'which' => 'current' ),
266
				array( 'CHANGELOG.md' => '' ),
267
				1,
268
				'Changelog file contains no entries',
269
			),
270
			'Previous, only one entry in changelog'      => array(
271
				array( 'which' => 'prev' ),
272
				array( 'CHANGELOG.md' => '## 1.0.0 - 2021-02-22' ),
273
				1,
274
				'Changelog file contains no previous version',
275
			),
276
		);
277
	}
278
279
}
280