Completed
Push — add/changelog-tooling ( 963953...b30521 )
by
unknown
866:58 queued 856:03
created

ChangeEntryTest::testConstructor_error()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
/**
3
 * Tests for the changelog ChangeEntry class.
4
 *
5
 * @package automattic/jetpack-changelogger
6
 */
7
8
namespace Automattic\Jetpack\Changelog\Tests;
9
10
use Automattic\Jetpack\Changelog\ChangeEntry;
11
use DateTime;
12
use InvalidArgumentException;
13
use PHPUnit\Framework\TestCase;
14
15
/**
16
 * Tests for the changelog ChangeEntry class.
17
 *
18
 * @covers \Automattic\Jetpack\Changelog\ChangeEntry
19
 */
20
class ChangeEntryTest extends TestCase {
21
	use \Yoast\PHPUnitPolyfills\Polyfills\ExpectException;
22
23
	/**
24
	 * Test general getters.
25
	 */
26
	public function testGetters() {
27
		$then   = new DateTime( 'now' );
28
		$change = new ChangeEntry();
29
		$now    = new DateTime( 'now' );
30
		$this->assertGreaterThanOrEqual( $then, $change->getTimestamp() );
31
		$this->assertLessThanOrEqual( $now, $change->getTimestamp() );
32
		$this->assertSame( null, $change->getSignificance() );
33
		$this->assertSame( '', $change->getSubheading() );
34
		$this->assertSame( '', $change->getAuthor() );
35
		$this->assertSame( '', $change->getContent() );
36
37
		$this->assertSame( $change, $change->setSignificance( 'patch' )->setAuthor( 'me!' )->setSubheading( 'Foo' )->setContent( 'Bar' ) );
38
		$this->assertSame( 'patch', $change->getSignificance() );
39
		$this->assertSame( 'Foo', $change->getSubheading() );
40
		$this->assertSame( 'me!', $change->getAuthor() );
41
		$this->assertSame( 'Bar', $change->getContent() );
42
43
		$this->assertSame( $change, $change->setSignificance( null )->setAuthor( 111 )->setSubheading( 222 )->setContent( 333 ) );
44
		$this->assertSame( null, $change->getSignificance() );
45
		$this->assertSame( '111', $change->getAuthor() );
46
		$this->assertSame( '222', $change->getSubheading() );
47
		$this->assertSame( '333', $change->getContent() );
48
49
		$change = new ChangeEntry(
50
			array(
51
				'significance' => 'minor',
52
				'author'       => 'that guy',
53
				'subheading'   => 'Things',
54
				'content'      => 'Stuff',
55
				'timestamp'    => '2021-02-16',
56
			)
57
		);
58
		$this->assertSame( 'minor', $change->getSignificance() );
59
		$this->assertSame( 'Things', $change->getSubheading() );
60
		$this->assertSame( 'that guy', $change->getAuthor() );
61
		$this->assertSame( 'Stuff', $change->getContent() );
62
		$this->assertSame( '2021-02-16 00:00:00', $change->getTimestamp()->format( 'Y-m-d H:i:s' ) );
63
	}
64
65
	/**
66
	 * Test constructor error.
67
	 */
68
	public function testConstructor_error() {
69
		$this->expectException( InvalidArgumentException::class );
70
		$this->expectExceptionMessage( 'Automattic\\Jetpack\\Changelog\\ChangeEntry::__construct: Unrecognized data item "foo"' );
71
		new ChangeEntry( array( 'foo' => 'bar' ) );
72
	}
73
74
	/**
75
	 * Test setTimestamp error.
76
	 */
77
	public function testSetTimestamp_error() {
78
		$change = new ChangeEntry();
79
		$this->expectException( InvalidArgumentException::class );
80
		$this->expectExceptionMessage( 'Automattic\\Jetpack\\Changelog\\ChangeEntry::setTimestamp: Invalid timestamp' );
81
		$change->setTimestamp( 'bogus' );
82
	}
83
84
	/**
85
	 * Test setSignificance error.
86
	 */
87
	public function testSetSignificance_error() {
88
		$change = new ChangeEntry();
89
		$this->expectException( InvalidArgumentException::class );
90
		$this->expectExceptionMessage( "Automattic\\Jetpack\\Changelog\\ChangeEntry::setSignificance: Significance must be 'patch', 'minor', or 'major' (or null)" );
91
		$change->setSignificance( 'bogus' );
92
	}
93
94
	/**
95
	 * Test compare.
96
	 *
97
	 * @dataProvider provideCompare
98
	 * @param ChangeEntry $a First change entry.
99
	 * @param ChangeEntry $b Second change entry.
100
	 * @param array       $config Compare config.
101
	 * @param int         $expect Expected value.
102
	 */
103
	public function testCompare( ChangeEntry $a, ChangeEntry $b, array $config, $expect ) {
104
		$ret = ChangeEntry::compare( $a, $b, $config );
105
		// We only care about the sign of the return value.
106
		$ret = $ret < 0 ? -1 : ( $ret > 0 ? 1 : 0 );
107
		$this->assertSame( $expect, $ret );
108
109
		$ret = ChangeEntry::compare( $b, $a, $config );
110
		// We only care about the sign of the return value.
111
		$ret = $ret < 0 ? -1 : ( $ret > 0 ? 1 : 0 );
112
		$this->assertSame( -$expect, $ret );
113
	}
114
115
	/**
116
	 * Data provider for testCompare.
117
	 */
118
	public function provideCompare() {
119
		return array(
120
			'Default config, equal'                        => array(
121
				new ChangeEntry(
122
					array(
123
						'significance' => 'major',
124
						'subheading'   => 'Head',
125
						'author'       => 'XXX',
126
						'timestamp'    => '2020-01-01',
127
						'content'      => 'A change.',
128
					)
129
				),
130
				new ChangeEntry(
131
					array(
132
						'significance' => 'patch',
133
						'subheading'   => 'Head',
134
						'author'       => 'YYY',
135
						'timestamp'    => '2020-02-02',
136
						'content'      => 'A change.',
137
					)
138
				),
139
				array(),
140
				0,
141
			),
142
			'Default config, equal but for case'           => array(
143
				new ChangeEntry(
144
					array(
145
						'significance' => 'major',
146
						'subheading'   => 'Head',
147
						'author'       => 'Xxx',
148
						'timestamp'    => '2020-01-01',
149
						'content'      => 'A change.',
150
					)
151
				),
152
				new ChangeEntry(
153
					array(
154
						'significance' => 'patch',
155
						'subheading'   => 'hEAD',
156
						'author'       => 'xXX',
157
						'timestamp'    => '2020-02-02',
158
						'content'      => 'a CHANGE.',
159
					)
160
				),
161
				array(
162
					'ordering' => array( 'subheading', 'author', 'content' ),
163
				),
164
				0,
165
			),
166
			'Default config, subheading before content'    => array(
167
				new ChangeEntry(
168
					array(
169
						'significance' => 'major',
170
						'subheading'   => 'A',
171
						'author'       => 'XXX',
172
						'timestamp'    => '2020-01-01',
173
						'content'      => 'B',
174
					)
175
				),
176
				new ChangeEntry(
177
					array(
178
						'significance' => 'patch',
179
						'subheading'   => 'B',
180
						'author'       => 'YYY',
181
						'timestamp'    => '2020-01-01',
182
						'content'      => 'A',
183
					)
184
				),
185
				array(),
186
				-1,
187
			),
188
			'Default config, content differs'              => array(
189
				new ChangeEntry(
190
					array(
191
						'significance' => 'major',
192
						'subheading'   => 'Head',
193
						'author'       => 'XXX',
194
						'timestamp'    => '2020-01-01',
195
						'content'      => 'B',
196
					)
197
				),
198
				new ChangeEntry(
199
					array(
200
						'significance' => 'patch',
201
						'subheading'   => 'Head',
202
						'author'       => 'YYY',
203
						'timestamp'    => '2020-02-02',
204
						'content'      => 'A',
205
					)
206
				),
207
				array(),
208
				1,
209
			),
210
			'Add timestamp to config'                      => array(
211
				new ChangeEntry(
212
					array(
213
						'significance' => 'major',
214
						'subheading'   => 'Head',
215
						'author'       => 'XXX',
216
						'timestamp'    => '2020-01-01',
217
						'content'      => 'B',
218
					)
219
				),
220
				new ChangeEntry(
221
					array(
222
						'significance' => 'patch',
223
						'subheading'   => 'Head',
224
						'author'       => 'YYY',
225
						'timestamp'    => '2020-02-02',
226
						'content'      => 'A',
227
					)
228
				),
229
				array(
230
					'ordering' => array( 'subheading', 'timestamp', 'content' ),
231
				),
232
				-1,
233
			),
234
			'Add significance to config'                   => array(
235
				new ChangeEntry(
236
					array(
237
						'significance' => 'major',
238
						'subheading'   => 'Head',
239
						'author'       => 'XXX',
240
						'timestamp'    => '2020-01-01',
241
						'content'      => 'B',
242
					)
243
				),
244
				new ChangeEntry(
245
					array(
246
						'significance' => 'patch',
247
						'subheading'   => 'Head',
248
						'author'       => 'YYY',
249
						'timestamp'    => '2020-02-02',
250
						'content'      => 'A',
251
					)
252
				),
253
				array(
254
					'ordering' => array( 'subheading', 'significance', 'content' ),
255
				),
256
				-1,
257
			),
258
			'Use knownSubheadings'                         => array(
259
				new ChangeEntry(
260
					array(
261
						'significance' => 'major',
262
						'subheading'   => 'AAA',
263
						'author'       => 'XXX',
264
						'timestamp'    => '2020-01-01',
265
						'content'      => 'Content',
266
					)
267
				),
268
				new ChangeEntry(
269
					array(
270
						'significance' => 'major',
271
						'subheading'   => 'BBB',
272
						'author'       => 'XXX',
273
						'timestamp'    => '2020-01-01',
274
						'content'      => 'Content',
275
					)
276
				),
277
				array(
278
					'knownSubheadings' => array( 'BBB', 'AAA' ),
279
				),
280
				1,
281
			),
282
			'Use knownSubheadings, case mismatch'          => array(
283
				new ChangeEntry(
284
					array(
285
						'significance' => 'major',
286
						'subheading'   => 'aAa',
287
						'author'       => 'XXX',
288
						'timestamp'    => '2020-01-01',
289
						'content'      => 'Content',
290
					)
291
				),
292
				new ChangeEntry(
293
					array(
294
						'significance' => 'major',
295
						'subheading'   => 'AaA',
296
						'author'       => 'XXX',
297
						'timestamp'    => '2020-01-01',
298
						'content'      => 'Content',
299
					)
300
				),
301
				array(
302
					'knownSubheadings' => array( 'BBB', 'AAA' ),
303
				),
304
				0,
305
			),
306
			'Use knownSubheadings, one subheading unknown' => array(
307
				new ChangeEntry(
308
					array(
309
						'significance' => 'major',
310
						'subheading'   => 'AAA?',
311
						'author'       => 'XXX',
312
						'timestamp'    => '2020-01-01',
313
						'content'      => 'Content',
314
					)
315
				),
316
				new ChangeEntry(
317
					array(
318
						'significance' => 'major',
319
						'subheading'   => 'BBB',
320
						'author'       => 'XXX',
321
						'timestamp'    => '2020-01-01',
322
						'content'      => 'Content',
323
					)
324
				),
325
				array(
326
					'knownSubheadings' => array( 'AAA', 'BBB' ),
327
				),
328
				1,
329
			),
330
			'Use knownSubheadings, both subheadings unknown' => array(
331
				new ChangeEntry(
332
					array(
333
						'significance' => 'major',
334
						'subheading'   => 'AAA?',
335
						'author'       => 'XXX',
336
						'timestamp'    => '2020-01-01',
337
						'content'      => 'Content',
338
					)
339
				),
340
				new ChangeEntry(
341
					array(
342
						'significance' => 'major',
343
						'subheading'   => 'BBB?',
344
						'author'       => 'XXX',
345
						'timestamp'    => '2020-01-01',
346
						'content'      => 'Content',
347
					)
348
				),
349
				array(
350
					'knownSubheadings' => array( 'BBB', 'AAA' ),
351
				),
352
				-1,
353
			),
354
			'Use knownSubheadings, empty subheading cannot be known' => array(
355
				new ChangeEntry(
356
					array(
357
						'significance' => 'major',
358
						'subheading'   => '',
359
						'author'       => 'XXX',
360
						'timestamp'    => '2020-01-01',
361
						'content'      => 'Content',
362
					)
363
				),
364
				new ChangeEntry(
365
					array(
366
						'significance' => 'major',
367
						'subheading'   => 'BBB',
368
						'author'       => 'XXX',
369
						'timestamp'    => '2020-01-01',
370
						'content'      => 'Content',
371
					)
372
				),
373
				array(
374
					'knownSubheadings' => array( 'BBB', 'AAA', '' ),
375
				),
376
				-1,
377
			),
378
		);
379
	}
380
381
	/**
382
	 * Test compare error.
383
	 */
384
	public function testCompare_error() {
385
		$this->expectException( InvalidArgumentException::class );
386
		$this->expectExceptionMessage( 'Automattic\\Jetpack\\Changelog\\ChangeEntry::compare: Invalid field in ordering' );
387
		ChangeEntry::compare(
388
			new ChangeEntry(),
389
			new ChangeEntry(),
390
			array(
391
				'ordering' => array( 'subheading', 'bogus', 'content' ),
392
			)
393
		);
394
	}
395
396
}
397