Files
netslim-core/tests/Kernel/ModuleRegistryTest.php
2026-03-20 22:13:41 +01:00

88 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Kernel;
use Netig\Netslim\Kernel\Runtime\Module\ModuleInterface;
use Netig\Netslim\Kernel\Runtime\Module\ModuleRegistry;
use Netig\Netslim\Kernel\Runtime\RuntimePaths;
use PHPUnit\Framework\TestCase;
final class ModuleRegistryTest extends TestCase
{
protected function setUp(): void
{
RuntimePaths::resetApplicationRoot();
RuntimePaths::resetProjectRoot();
ModuleRegistry::reset();
}
protected function tearDown(): void
{
RuntimePaths::resetApplicationRoot();
RuntimePaths::resetProjectRoot();
ModuleRegistry::reset();
}
public function testModulesAreDeclaredInExpectedOrderForFixtureApplication(): void
{
RuntimePaths::setApplicationRoot(dirname(__DIR__, 2) . '/tests/Fixtures/Application');
$moduleClasses = array_map(
static fn (ModuleInterface $module): string => $module::class,
ModuleRegistry::modules(),
);
self::assertSame([
'Netig\Netslim\Kernel\Runtime\KernelModule',
'Netig\Netslim\Identity\IdentityModule',
'Netig\Netslim\Settings\SettingsModule',
'Netig\Netslim\AuditLog\AuditLogModule',
'Netig\Netslim\Notifications\NotificationsModule',
'Netig\Netslim\Taxonomy\TaxonomyModule',
'Netig\Netslim\Media\MediaModule',
], $moduleClasses);
}
public function testModuleClassNamesExposeTheActiveApplicationComposition(): void
{
RuntimePaths::setApplicationRoot(dirname(__DIR__, 2) . '/tests/Fixtures/Application');
self::assertSame([
'Netig\Netslim\Kernel\Runtime\KernelModule',
'Netig\Netslim\Identity\IdentityModule',
'Netig\Netslim\Settings\SettingsModule',
'Netig\Netslim\AuditLog\AuditLogModule',
'Netig\Netslim\Notifications\NotificationsModule',
'Netig\Netslim\Taxonomy\TaxonomyModule',
'Netig\Netslim\Media\MediaModule',
], ModuleRegistry::moduleClassNames());
}
public function testApplicationManifestIsResolvedFromTheActiveApplicationRoot(): void
{
RuntimePaths::setApplicationRoot(dirname(__DIR__, 2) . '/tests/Fixtures/Application');
self::assertFileExists(RuntimePaths::getApplicationConfigPath('modules.php'));
}
public function testEveryModuleExposesResolvableMetadata(): void
{
RuntimePaths::setApplicationRoot(dirname(__DIR__, 2) . '/tests/Fixtures/Application');
foreach (ModuleRegistry::modules() as $module) {
self::assertNotSame([], $module->definitions(), $module::class . ' should expose DI definitions.');
foreach ($module->templateNamespaces() as $namespace => $templatePath) {
self::assertNotSame('', $namespace, $module::class . ' should declare a non-empty Twig namespace.');
self::assertDirectoryExists($templatePath, $module::class . ' should point Twig to an existing template directory.');
}
foreach ($module->twigExtensions() as $twigExtensionClass) {
self::assertTrue(class_exists($twigExtensionClass), $module::class . ' should reference an existing Twig extension class.');
}
}
}
}