aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/unit/documentation/ReleaseNotesTest.php
blob: f8313c072cf7b2cb22bb7370562f957727e43026 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php

/**
 * James doesn't like having to manually fix these things.
 */
class ReleaseNotesTest extends MediaWikiUnitTestCase {
	/**
	 * Verify that at least one Release Notes file exists, have content, and
	 * aren't overly long.
	 *
	 * @group documentation
	 * @coversNothing
	 */
	public function testReleaseNotesFilesExistAndAreNotMalformed() {
		global $IP;

		$notesFiles = glob( "$IP/RELEASE-NOTES-*" );

		$this->assertGreaterThanOrEqual(
			1,
			count( $notesFiles ),
			'Repo has at least one Release Notes file.'
		);

		$versionParts = explode( '.', explode( '-', MW_VERSION )[0] );
		$this->assertContains(
			"$IP/RELEASE-NOTES-$versionParts[0].$versionParts[1]",
			$notesFiles,
			'Repo has a Release Notes file for the current MW_VERSION.'
		);

		foreach ( $notesFiles as $index => $fileName ) {
			$this->assertFileLength( "Release Notes", $fileName );
		}
	}

	public static function provideFilesAtRoot() {
		global $IP;

		$rootFiles = [
			"COPYING",
			"FAQ",
			"HISTORY",
			"INSTALL",
			"SECURITY",
		];

		foreach ( $rootFiles as $rootFile ) {
			yield "$rootFile file" => [ "$IP/$rootFile" ];
		}
	}

	/**
	 * @dataProvider provideFilesAtRoot
	 * @coversNothing
	 */
	public function testRootFilesHaveProperLineLength( $fileName ) {
		$this->assertFileLength( "Help", $fileName );
	}

	private function assertFileLength( $type, $fileName ) {
		$lines = file( $fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );

		$this->assertNotFalse(
			$lines,
			"$type file '$fileName' is inaccessible."
		);

		$errors = [];
		foreach ( $lines as $i => $line ) {
			$num = $i + 1;

			// FILE_IGNORE_NEW_LINES drops the \n at the EOL, so max length is 80 not 81.
			$max_length = 80;

			$length = mb_strlen( $line );
			if ( $length <= $max_length ) {
				continue;
			}
			$errors[] = "line $num: length $length > $max_length:\n$line";
		}
		// Use assertSame() instead of assertEqual(), to show the full line in the diff
		$this->assertSame(
			[],
			$errors,
			"$type file '$fileName' lines have at most $max_length characters"
		);
	}
}