From ff4ce29768cb36fbeecf7f80b82a63e3bc799930 Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Mon, 12 Aug 2024 15:21:01 +0800 Subject: [PATCH] Add more package tests --- tests/AutoReview/ComposerJsonTest.php | 83 +++++++++--------------- tests/AutoReview/PackageMetadataTest.php | 59 +++++++++++++++++ tests/AutoReview/PackageTrait.php | 72 ++++++++++++++++++++ 3 files changed, 163 insertions(+), 51 deletions(-) create mode 100644 tests/AutoReview/PackageMetadataTest.php create mode 100644 tests/AutoReview/PackageTrait.php diff --git a/tests/AutoReview/ComposerJsonTest.php b/tests/AutoReview/ComposerJsonTest.php index 9a210f1..83aff88 100644 --- a/tests/AutoReview/ComposerJsonTest.php +++ b/tests/AutoReview/ComposerJsonTest.php @@ -25,10 +25,7 @@ #[Group('package-test')] final class ComposerJsonTest extends TestCase { - /** - * @var list - */ - private static array $packages = []; + use PackageTrait; public function testRootComposerJsonReplacesPackages(): void { @@ -66,6 +63,37 @@ public function testPackageHasComposerJson(string $package): void self::assertSame('https://github.com/NexusPHP/framework', $composerJson['support']['source']); } + #[DataProvider('providePackageHasComposerJsonCases')] + public function testComposerJsonHasAutoloadEntries(string $package): void + { + $composerJson = $this->getComposer(\sprintf('%s/composer.json', $package)); + + self::assertArrayHasKey('autoload', $composerJson); + self::assertIsArray($composerJson['autoload']); + self::assertArrayHasKey('psr-4', $composerJson['autoload']); + self::assertIsArray($composerJson['autoload']['psr-4']); + self::assertArrayHasKey(str_replace('/', '\\', substr($package, 4)).'\\', $composerJson['autoload']['psr-4']); + + $functionsFile = $package.\DIRECTORY_SEPARATOR.'functions.php'; + + if (! is_file($functionsFile)) { + self::assertFileDoesNotExist($package.\DIRECTORY_SEPARATOR.'function.php'); + + return; + } + + self::assertArrayHasKey('files', $composerJson['autoload']); + self::assertIsArray($composerJson['autoload']['files']); + self::assertContains('functions.php', $composerJson['autoload']['files']); + + $rootComposer = $this->getComposer(__DIR__.'/../../composer.json'); + self::assertArrayHasKey('autoload', $rootComposer); + self::assertIsArray($rootComposer['autoload']); + self::assertArrayHasKey('files', $rootComposer['autoload']); + self::assertIsArray($rootComposer['autoload']['files']); + self::assertContains($functionsFile, $rootComposer['autoload']['files']); + } + /** * @return iterable */ @@ -105,51 +133,4 @@ private function getComposer(string $path): array self::fail(\sprintf('Retrieving the contents failed: %s', $e->getMessage())); } } - - /** - * @return list - */ - private static function getPackageDirectories(): array - { - if ([] !== self::$packages) { - return self::$packages; - } - - $finder = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator( - 'src/Nexus', - \FilesystemIterator::KEY_AS_FILENAME | \FilesystemIterator::UNIX_PATHS, - ), - ); - $finder->setMaxDepth(3); - - /** - * @var \SplFileInfo $splFileInfo - */ - foreach ($finder as $file => $splFileInfo) { - if ('composer.json' === $file) { - self::$packages[] = \dirname($splFileInfo->getPathname()); - } - } - - return self::$packages; - } - - private function getPackageName(string $package): string - { - static $specialCases = [ - 'PHPStan' => 'phpstan-nexus', - ]; - - $package = basename($package); - - return \sprintf( - 'nexusphp/%s', - $specialCases[$package] ?? strtolower(preg_replace( - '/(? + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Nexus\Tests\AutoReview; + +use PHPUnit\Framework\Attributes\CoversNothing; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\TestCase; + +/** + * @internal + */ +#[CoversNothing] +#[Group('package-test')] +final class PackageMetadataTest extends TestCase +{ + use PackageTrait; + + /** + * @var list + */ + private const METADATA_FILES = [ + 'LICENSE', + 'README.md', + ]; + + #[DataProvider('provideMetadataFilesExistForPackageCases')] + public function testMetadataFilesExistForPackage(string $package, string $metadata): void + { + $metadataFile = $package.\DIRECTORY_SEPARATOR.$metadata; + + self::assertFileExists($metadataFile); + self::assertFileIsReadable($metadataFile); + self::assertFileIsWritable($metadataFile); + } + + /** + * @return iterable + */ + public static function provideMetadataFilesExistForPackageCases(): iterable + { + foreach (self::getPackageDirectories() as $package) { + foreach (self::METADATA_FILES as $metadata) { + yield $package.\DIRECTORY_SEPARATOR.$metadata => [$package, $metadata]; + } + } + } +} diff --git a/tests/AutoReview/PackageTrait.php b/tests/AutoReview/PackageTrait.php new file mode 100644 index 0000000..5966534 --- /dev/null +++ b/tests/AutoReview/PackageTrait.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Nexus\Tests\AutoReview; + +/** + * @internal + */ +trait PackageTrait +{ + /** + * @var list + */ + private static array $packages = []; + + /** + * @return list + */ + private static function getPackageDirectories(): array + { + if ([] !== self::$packages) { + return self::$packages; + } + + $finder = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator( + 'src/Nexus', + \FilesystemIterator::KEY_AS_FILENAME | \FilesystemIterator::UNIX_PATHS, + ), + ); + $finder->setMaxDepth(3); + + /** + * @var \SplFileInfo $splFileInfo + */ + foreach ($finder as $file => $splFileInfo) { + if ('composer.json' === $file) { + self::$packages[] = \dirname($splFileInfo->getPathname()); + } + } + + return self::$packages; + } + + private function getPackageName(string $package): string + { + static $specialCases = [ + 'PHPStan' => 'phpstan-nexus', + ]; + + $package = basename($package); + + return \sprintf( + 'nexusphp/%s', + $specialCases[$package] ?? strtolower(preg_replace( + '/(?