'admin', 'PHP_AUTH_PW' => 'Maut1cR0cks!', ]; protected array $configParams = [ 'api_enabled' => true, 'api_enable_basic_auth' => true, 'create_custom_field_in_background' => false, 'site_url' => 'https://localhost', 'mailer_dsn' => 'null://null', 'messenger_dsn_email' => 'in-memory://default', 'messenger_dsn_hit' => 'sync://', 'messenger_dsn_failed' => 'in-memory://default', ]; protected AbstractDatabaseTool $databaseTool; /** * Overloading the method from MailerAssertionsTrait to get better typehint. * * @return MauticMessage[] */ public static function getMailerMessages(string $transport = null): array { $messages = parent::getMailerMessages($transport); return array_map(function (RawMessage $message): MauticMessage { \assert($message instanceof MauticMessage); return $message; }, $messages); } /** * Overloading the method from MailerAssertionsTrait to get better typehint. */ public static function getMailerMessage(int $index = 0, string $transport = null): ?MauticMessage { return self::getMailerMessages($transport)[$index] ?? null; } /** * @return MauticMessage[] */ public static function getMailerMessagesByToAddress(string $toAddress, string $transport = null): array { return array_values(array_filter(self::getMailerMessages($transport), fn (MauticMessage $mauticMessage) => $mauticMessage->getTo()[0]->getAddress() === $toAddress)); } protected function setUp(): void { $this->setUpSymfony($this->configParams); $this->databaseTool = static::getContainer()->get(DatabaseToolCollection::class)->get(); } protected function setUpSymfony(array $defaultConfigOptions = []): void { putenv('MAUTIC_CONFIG_PARAMETERS='.json_encode($defaultConfigOptions)); EnvLoader::load(); self::ensureKernelShutdown(); $this->client = static::createClient($this->clientOptions, $this->clientServer); $this->client->disableReboot(); $this->client->followRedirects(true); $this->em = static::getContainer()->get('doctrine')->getManager(); $this->connection = $this->em->getConnection(); $this->router = static::getContainer()->get('router'); $scheme = $this->router->getContext()->getScheme(); $secure = 0 === strcasecmp($scheme, 'https'); $this->client->setServerParameter('HTTPS', (string) $secure); } /** * Make `$append = true` default so we can avoid unnecessary purges. */ protected function loadFixtures(array $classNames = [], bool $append = true): ?AbstractExecutor { return $this->databaseTool->loadFixtures($classNames, $append); } /** * Make `$append = true` default so we can avoid unnecessary purges. */ protected function loadFixtureFiles(array $paths = [], bool $append = true): array { return $this->databaseTool->loadAliceFixture($paths, $append); } protected function applyMigrations(): void { $input = new ArgvInput(['console', 'doctrine:migrations:version', '--add', '--all', '--no-interaction']); $output = new BufferedOutput(); $application = new Application(static::getContainer()->get('kernel')); $application->setAutoExit(false); $application->run($input, $output); } protected function installDatabaseFixtures(array $classNames = []): void { $this->loadFixtures($classNames); } /** * Use when POSTing directly to forms. * * @param string $intention * * @return string */ protected function getCsrfToken($intention) { return $this->client->getContainer()->get('security.csrf.token_manager')->refreshToken($intention)->getValue(); } /** * @return string[] */ protected function createAjaxHeaders(): array { return [ 'HTTP_Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', 'HTTP_X-Requested-With' => 'XMLHttpRequest', 'HTTP_X-CSRF-Token' => $this->getCsrfToken('mautic_ajax_post'), ]; } protected function loginUser(string $username): User { /** @var User|null $user */ $user = $this->em->getRepository(User::class) ->findOneBy(['username' => $username]); if (!$user) { throw new \InvalidArgumentException(sprintf('User with username "%s" not found.', $username)); } $firewall = 'mautic'; $session = static::getContainer()->get('session'); $token = new UsernamePasswordToken($user, $firewall, $user->getRoles()); $session->set('_security_'.$firewall, serialize($token)); $session->save(); $cookie = new Cookie($session->getName(), $session->getId()); $this->client->getCookieJar()->set($cookie); return $user; } /** * @param array $params */ protected function testSymfonyCommand(string $name, array $params = [], Command $command = null): CommandTester { $kernel = static::getContainer()->get('kernel'); $application = new Application($kernel); if ($command) { // Register the command $application->add($command); } $command = $application->find($name); $commandTester = new CommandTester($command); $commandTester->execute($params); return $commandTester; } }