-
Notifications
You must be signed in to change notification settings - Fork 1
/
OwnersStructureTest.php
120 lines (112 loc) · 3.02 KB
/
OwnersStructureTest.php
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
namespace WikimediaEvents\Tests;
use LogicException;
/**
* @coversNothing
*/
class OwnersStructureTest extends \PHPUnit\Framework\TestCase {
/** @var array */
private static $ownerSections;
public static function setUpBeforeClass(): void {
// Parse the owners data and store it in an array.
$sections = [];
$lines = file( __DIR__ . '/../../OWNERS.md', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
$section = null;
foreach ( $lines as $line ) {
if ( strpos( $line, '* ' ) === 0 ) {
[ $label, $value ] = explode( ':', substr( $line, 2 ), 2 );
if ( $label === 'Files' ) {
$section[$label] = array_map( 'trim', explode( ',', $value ) );
} else {
$section[$label] = trim( $value );
}
}
if ( strpos( $line, '## ' ) === 0 ) {
if ( $section !== null ) {
// Commit previous section
$sections[ $section['title'] ] = $section;
}
$section = [ 'title' => trim( substr( $line, 2 ) ) ];
}
}
if ( $section !== null ) {
// Commit last section
$sections[ $section['title'] ] = $section;
$section = null;
}
self::$ownerSections = $sections;
}
private function getResources(): array {
$extension = json_decode(
file_get_contents( __DIR__ . '/../../extension.json' ),
JSON_OBJECT_AS_ARRAY
);
$modules = $extension['ResourceModules'];
$resources = [];
foreach ( $modules as $moduleName => $moduleInfo ) {
foreach ( $moduleInfo as $key => $value ) {
$files = [];
switch ( $key ) {
case 'packageFiles':
foreach ( $value as $entry ) {
if ( is_string( $entry ) && $entry !== 'index.js' ) {
$files[] = $entry;
}
if (
is_array( $entry ) &&
isset( $entry['name'] ) &&
str_ends_with( $entry['name'], '.js' )
) {
$files[] = $entry['name'];
}
}
break;
case 'localBasePath':
case 'remoteExtPath':
case 'dependencies':
case 'targets':
case 'es6':
// ignore
break;
default:
throw new LogicException( "Unknown module info key: {$key}" );
}
foreach ( $files as $file ) {
$resources[ basename( $file ) ] = $moduleName;
}
}
}
return $resources;
}
public function testOwnersFile() {
$expected = [ 'Files', 'Contact', 'Since' ];
foreach ( self::$ownerSections as $title => $section ) {
$actual = array_intersect( $expected, array_keys( $section ) );
$this->assertSame( $expected, $actual, "Labels under OWNERS.md § $title" );
}
}
/**
* @depends testOwnersFile
*/
public function testResourceOwnersFile() {
$ownedFiles = [];
foreach ( self::$ownerSections as $section ) {
foreach ( $section['Files'] as $file ) {
$ownedFiles[] = $file;
}
}
$resources = $this->getResources();
foreach ( $resources as $file => $moduleName ) {
$this->assertContains(
$file, $ownedFiles,
"File $file in $moduleName has an owner"
);
}
foreach ( $ownedFiles as $file ) {
$this->assertTrue(
isset( $resources[$file] ),
"Owned file $file is a registered resource"
);
}
}
}