. */ namespace SPT; use Faker\Factory; use Faker\Generator; use PHPUnit\Framework\MockObject\Exception; use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use SP\Core\Application; use SP\Core\Context\ContextException; use SP\Core\Context\StatelessContext; use SP\DataModel\ProfileData; use SP\Domain\Config\Ports\ConfigFileService; use SP\Domain\Core\Context\Context; use SP\Domain\Core\Events\EventDispatcherInterface; use SP\Domain\User\Dtos\UserDataDto; use SP\Domain\User\Models\User; use SPT\Generators\ConfigDataGenerator; /** * A class to test using a mocked Dependency Injection Container */ abstract class UnitaryTestCase extends TestCase { use PHPUnitHelper; protected static Generator $faker; protected readonly ConfigFileService|Stub $config; protected readonly Application $application; protected readonly Context $context; public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); self::$faker = Factory::create(); self::setLocales(); } private static function setLocales(): void { $lang = 'en_US.utf8'; putenv('LANG=' . $lang); putenv('LANGUAGE=' . $lang); setlocale(LC_MESSAGES, $lang); setlocale(LC_ALL, $lang); bindtextdomain('messages', LOCALES_PATH); textdomain('messages'); bind_textdomain_codeset('messages', 'UTF-8'); } public static function getRandomNumbers(int $count): array { return array_map(static fn() => self::$faker->randomNumber(), range(0, $count - 1)); } /** * @throws Exception * @throws ContextException */ protected function setUp(): void { parent::setUp(); $this->application = $this->buildApplication(); } /** * @return Application * @throws Exception * @throws ContextException */ private function buildApplication(): Application { $this->context = $this->buildContext(); $this->config = $this->buildConfig(); return new Application( $this->config, $this->createStub(EventDispatcherInterface::class), $this->context ); } /** * @throws ContextException */ protected function buildContext(): Context { $context = new StatelessContext(); $context->initialize(); $context->setUserData($this->buildUserDataDto()); $context->setUserProfile(new ProfileData()); return $context; } /** * @return UserDataDto */ private function buildUserDataDto(): UserDataDto { return new UserDataDto( new User( [ 'login' => self::$faker->userName, 'name' => self::$faker->userName, 'id' => self::$faker->randomNumber(2), 'userGroupId' => self::$faker->randomNumber(2), 'userProfileId' => self::$faker->randomNumber(2) ] ) ); } /** * @throws Exception */ protected function buildConfig(): ConfigFileService { $configData = ConfigDataGenerator::factory()->buildConfigData(); $config = $this->createStub(ConfigFileService::class); $config->method('getConfigData')->willReturn($configData); return $config; } }