Skip to content

Commit

Permalink
Add more package tests
Browse files Browse the repository at this point in the history
  • Loading branch information
paulbalandan committed Aug 12, 2024
1 parent 0b3a946 commit ff4ce29
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 51 deletions.
83 changes: 32 additions & 51 deletions tests/AutoReview/ComposerJsonTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,7 @@
#[Group('package-test')]
final class ComposerJsonTest extends TestCase
{
/**
* @var list<string>
*/
private static array $packages = [];
use PackageTrait;

public function testRootComposerJsonReplacesPackages(): void
{
Expand Down Expand Up @@ -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<string, array{string}>
*/
Expand Down Expand Up @@ -105,51 +133,4 @@ private function getComposer(string $path): array
self::fail(\sprintf('Retrieving the contents failed: %s', $e->getMessage()));
}
}

/**
* @return list<string>
*/
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(
'/(?<!^)((?=[A-Z][^A-Z])|(?<![A-Z])(?=[A-Z]))/u',
'_',
$package,
) ?? $package),
);
}
}
59 changes: 59 additions & 0 deletions tests/AutoReview/PackageMetadataTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

/**
* This file is part of the Nexus framework.
*
* (c) John Paul E. Balandan, CPA <[email protected]>
*
* 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<string>
*/
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<string, array{string, string}>
*/
public static function provideMetadataFilesExistForPackageCases(): iterable
{
foreach (self::getPackageDirectories() as $package) {
foreach (self::METADATA_FILES as $metadata) {
yield $package.\DIRECTORY_SEPARATOR.$metadata => [$package, $metadata];
}
}
}
}
72 changes: 72 additions & 0 deletions tests/AutoReview/PackageTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

declare(strict_types=1);

/**
* This file is part of the Nexus framework.
*
* (c) John Paul E. Balandan, CPA <[email protected]>
*
* 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<string>
*/
private static array $packages = [];

/**
* @return list<string>
*/
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(
'/(?<!^)((?=[A-Z][^A-Z])|(?<![A-Z])(?=[A-Z]))/u',
'_',
$package,
) ?? $package),
);
}
}

0 comments on commit ff4ce29

Please sign in to comment.