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

92 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Architecture;
use Netig\Netslim\AuditLog\Application\AuditLogServiceInterface;
use Netig\Netslim\Identity\Application\AuthorizationServiceInterface;
use Netig\Netslim\Identity\Application\AuthServiceInterface;
use Netig\Netslim\Identity\Application\PasswordResetServiceInterface;
use Netig\Netslim\Identity\Application\UserServiceInterface;
use Netig\Netslim\Media\Application\MediaServiceInterface;
use Netig\Netslim\Notifications\Application\NotificationServiceInterface;
use Netig\Netslim\Settings\Application\SettingsServiceInterface;
use Netig\Netslim\Taxonomy\Application\TaxonomyServiceInterface;
use Tests\Architecture\Support\ArchitectureTestCase;
final class ApplicationServiceVocabularyTest extends ArchitectureTestCase
{
/**
* @return iterable<string, array{0: class-string, 1: list<string>}>
*/
public static function serviceInterfaces(): iterable
{
yield 'auth service vocabulary' => [
AuthServiceInterface::class,
['checkRateLimit', 'recordFailure', 'resetRateLimit', 'checkPasswordResetRateLimit', 'recordPasswordResetAttempt', 'authenticate', 'changePassword', 'isLoggedIn', 'login', 'logout'],
];
yield 'password reset service vocabulary' => [
PasswordResetServiceInterface::class,
['requestReset', 'validateToken', 'resetPassword'],
];
yield 'authorization service vocabulary' => [
AuthorizationServiceInterface::class,
['canRole', 'canUser', 'permissionsForRole'],
];
yield 'settings service vocabulary' => [
SettingsServiceInterface::class,
['all', 'delete', 'get', 'getBool', 'getInt', 'getString', 'has', 'set'],
];
yield 'audit log service vocabulary' => [
AuditLogServiceInterface::class,
['listRecent', 'record'],
];
yield 'notification service vocabulary' => [
NotificationServiceInterface::class,
['recent', 'send', 'sendTemplate'],
];
yield 'taxonomy service vocabulary' => [
TaxonomyServiceInterface::class,
['findAll', 'findPaginated', 'findById', 'findBySlug', 'create', 'delete'],
];
yield 'media service vocabulary' => [
MediaServiceInterface::class,
['findAll', 'findPaginated', 'findByUserId', 'findByUserIdPaginated', 'findById', 'store', 'getUsageSummary', 'getUsageSummaries', 'delete'],
];
yield 'user service vocabulary' => [
UserServiceInterface::class,
['findAll', 'findPaginated', 'findById', 'delete', 'deleteFromAdministration', 'updateRole', 'updateRoleFromAdministration', 'create'],
];
}
#[\PHPUnit\Framework\Attributes\DataProvider('serviceInterfaces')]
public function testApplicationServiceInterfacesExposeAnExplicitVocabulary(string $interface, array $expectedMethods): void
{
$reflection = new \ReflectionClass($interface);
$methods = array_values(array_map(
static fn (\ReflectionMethod $method): string => $method->getName(),
$reflection->getMethods(\ReflectionMethod::IS_PUBLIC),
));
sort($methods);
$expected = $expectedMethods;
sort($expected);
self::assertSame(
$expected,
$methods,
sprintf('%s must keep its agreed application vocabulary to stay aligned with the other modules.', $interface),
);
}
}