. */ namespace SPT; use Faker\Factory; use Faker\Generator; use PHPUnit\Framework\MockObject\Exception; 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\ContextInterface; use SP\Domain\Core\Events\EventDispatcherInterface; use SP\Domain\User\Services\UserLoginResponse; 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 $config; protected readonly Application $application; protected readonly ContextInterface $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 ContextException * @throws Exception */ protected function setUp(): void { $this->application = $this->mockApplication(); $this->config = $this->application->getConfig(); parent::setUp(); } /** * @return Application * @throws ContextException|Exception */ private function mockApplication(): Application { $userLogin = new UserLoginResponse(); $userLogin ->setLogin(self::$faker->userName) ->setName(self::$faker->userName) ->setId(self::$faker->randomNumber(2)) ->setUserGroupId(self::$faker->randomNumber(2)) ->setUserProfileId(self::$faker->randomNumber(2)); $this->context = new StatelessContext(); $this->context->initialize(); $this->context->setUserData($userLogin); $this->context->setUserProfile(new ProfileData()); return new Application( $this->getConfig(), $this->createStub(EventDispatcherInterface::class), $this->context ); } /** * @throws Exception */ protected function getConfig(): ConfigFileService { $configData = ConfigDataGenerator::factory()->buildConfigData(); $config = $this->createStub(ConfigFileService::class); $config->method('getConfigData')->willReturn($configData); return $config; } }