. */ namespace SP\Tests\Modules\Cli; use DI\ContainerBuilder; use DI\DependencyException; use DI\NotFoundException; use Exception; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use SP\Core\Context\ContextInterface; use SP\Storage\Database\DBStorageInterface; use Symfony\Component\Console\Tester\CommandTester; use function SP\Tests\getDbHandler; /** * Class CliTestCase * * @package SP\Tests\Modules\Cli */ abstract class CliTestCase extends TestCase { /** * @var ContainerInterface */ protected static $dic; /** * @var string[] */ protected static array $commandInputData = []; /** * This method is called before the first test of this test class is run. * * @throws Exception */ public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); $builder = new ContainerBuilder(); $builder->addDefinitions( APP_ROOT . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'Definitions.php', MODULES_PATH . DIRECTORY_SEPARATOR . 'cli' . DIRECTORY_SEPARATOR . 'definitions.php' ); self::$dic = $builder->build(); $context = self::$dic->get(ContextInterface::class); $context->initialize(); } /** * @param string $commandClass * @param array|null $inputData * @param bool $useInputData * * @return CommandTester * @throws DependencyException * @throws NotFoundException */ protected function executeCommandTest( string $commandClass, ?array $inputData = null, bool $useInputData = true ): CommandTester { $installCommand = self::$dic->get($commandClass); if (null === $inputData && $useInputData) { $inputData = static::$commandInputData; } $commandTester = new CommandTester($installCommand); $commandTester->execute( $inputData ?? [], ['interactive' => false] ); return $commandTester; } protected function setupDatabase(): void { self::$dic->set(DBStorageInterface::class, getDbHandler()); } }