Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\ConfigBundle\Tests\Controller; | |
| use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
| use PHPUnit\Framework\Assert; | |
| use Symfony\Component\DomCrawler\Field\ChoiceFormField; | |
| use Symfony\Component\HttpFoundation\Request; | |
| class ConfigControllerFunctionalTest extends MauticMysqlTestCase | |
| { | |
| private const SUBDOMAIN_URL = 'subdomain_url.com'; | |
| /** | |
| * @var string | |
| */ | |
| private $prefix; | |
| protected $useCleanupRollback = false; | |
| protected function setUp(): void | |
| { | |
| $this->configParams['config_allowed_parameters'] = [ | |
| 'kernel.project_dir', | |
| ]; | |
| $this->configParams['locale'] = 'en_US'; | |
| $this->configParams['subdomain_url'] = self::SUBDOMAIN_URL; | |
| parent::setUp(); | |
| $this->prefix = MAUTIC_TABLE_PREFIX; | |
| } | |
| public function testValuesAreEscapedProperly(): void | |
| { | |
| $url = 'https://test.us/create?key=2MLzQFXBSqd2nqwGero90CpB1jX1FbVhhRd51ojr&domain=https%3A%2F%2Ftest.us%2F&longUrl='; | |
| $trackIps = "%ip1%\n%ip2%\n%kernel.project_dir%"; | |
| $googleAnalytics = 'reveal pass: %mautic.db_password%'; | |
| // request config edit page | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| // Find save & close button | |
| $buttonCrawler = $crawler->selectButton('config[buttons][save]'); | |
| $form = $buttonCrawler->form(); | |
| $form->setValues( | |
| [ | |
| 'config[coreconfig][site_url]' => 'https://mautic-community.local', // required | |
| 'config[coreconfig][do_not_track_ips]' => $trackIps, | |
| 'config[pageconfig][google_analytics]' => $googleAnalytics, | |
| 'config[leadconfig][contact_columns]' => ['name', 'email', 'id'], | |
| ] | |
| ); | |
| $crawler = $this->client->submit($form); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| // Check for a flash error | |
| $response = $this->client->getResponse()->getContent(); | |
| $message = $crawler->filterXPath("//div[@id='flashes']//span")->count() | |
| ? | |
| $crawler->filterXPath("//div[@id='flashes']//span")->first()->text() | |
| : | |
| ''; | |
| Assert::assertStringNotContainsString('Could not save updated configuration:', $response, $message); | |
| // Check values are escaped properly in the config file | |
| $configParameters = $this->getConfigParameters(); | |
| Assert::assertArrayHasKey('do_not_track_ips', $configParameters); | |
| Assert::assertSame( | |
| [ | |
| $this->escape('%ip1%'), | |
| $this->escape('%ip2%'), | |
| '%kernel.project_dir%', | |
| ], | |
| $configParameters['do_not_track_ips'] | |
| ); | |
| Assert::assertArrayHasKey('google_analytics', $configParameters); | |
| Assert::assertSame($this->escape($googleAnalytics), $configParameters['google_analytics']); | |
| // Check values are unescaped properly in the edit form | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| $buttonCrawler = $crawler->selectButton('config[buttons][save]'); | |
| $form = $buttonCrawler->form(); | |
| Assert::assertEquals($trackIps, $form['config[coreconfig][do_not_track_ips]']->getValue()); | |
| Assert::assertEquals($googleAnalytics, $form['config[pageconfig][google_analytics]']->getValue()); | |
| } | |
| private function getConfigPath(): string | |
| { | |
| return static::getContainer()->get('kernel')->getLocalConfigFile(); | |
| } | |
| private function getConfigParameters(): array | |
| { | |
| $parameters = []; | |
| include $this->getConfigPath(); | |
| return $parameters; | |
| } | |
| private function escape(string $value): string | |
| { | |
| return str_replace('%', '%%', $value); | |
| } | |
| public function testConfigNotFoundPageConfiguration(): void | |
| { | |
| // insert published record | |
| $this->connection->insert($this->prefix.'pages', [ | |
| 'is_published' => 1, | |
| 'date_added' => (new \DateTime())->format('Y-m-d H:i:s'), | |
| 'title' => 'page1', | |
| 'alias' => 'page1', | |
| 'template' => 'blank', | |
| 'custom_html' => 'Page1 Test Html', | |
| 'hits' => 0, | |
| 'unique_hits' => 0, | |
| 'variant_hits' => 0, | |
| 'revision' => 0, | |
| 'lang' => 'en', | |
| ]); | |
| $page1 = $this->connection->lastInsertId(); | |
| // insert unpublished record | |
| $this->connection->insert($this->prefix.'pages', [ | |
| 'is_published' => 0, | |
| 'date_added' => (new \DateTime())->format('Y-m-d H:i:s'), | |
| 'title' => 'page2', | |
| 'alias' => 'page2', | |
| 'template' => 'blank', | |
| 'custom_html' => 'Page2 Test Html', | |
| 'hits' => 0, | |
| 'unique_hits' => 0, | |
| 'variant_hits' => 0, | |
| 'revision' => 0, | |
| 'lang' => 'en', | |
| ]); | |
| $this->connection->lastInsertId(); | |
| // insert published record | |
| $this->connection->insert($this->prefix.'pages', [ | |
| 'is_published' => 1, | |
| 'date_added' => (new \DateTime())->format('Y-m-d H:i:s'), | |
| 'title' => 'page3', | |
| 'alias' => 'page3', | |
| 'template' => 'blank', | |
| 'custom_html' => 'Page3 Test Html', | |
| 'hits' => 0, | |
| 'unique_hits' => 0, | |
| 'variant_hits' => 0, | |
| 'revision' => 0, | |
| 'lang' => 'en', | |
| ]); | |
| $page3 = $this->connection->lastInsertId(); | |
| // request config edit page | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| // Find save & close button | |
| $buttonCrawler = $crawler->selectButton('config[buttons][save]'); | |
| $form = $buttonCrawler->form(); | |
| // Fetch available option for 404_page field | |
| $availableOptions = $form['config[coreconfig][404_page]']->availableOptionValues(); | |
| // page 2 should not be available in option list because it is unpublished | |
| $this->assertEquals(['', $page1, $page3], $availableOptions); | |
| // page 3 for 404_page | |
| $form->setValues( | |
| [ | |
| 'config[coreconfig][site_url]' => 'https://mautic-community.local', // required | |
| 'config[leadconfig][contact_columns]' => ['name', 'email', 'id'], | |
| 'config[coreconfig][404_page]' => $page3, | |
| ] | |
| ); | |
| $crawler = $this->client->submit($form); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| $buttonCrawler = $crawler->selectButton('config[buttons][save]'); | |
| $form = $buttonCrawler->form(); | |
| Assert::assertEquals($page3, $form['config[coreconfig][404_page]']->getValue()); | |
| // re-create the Symfony client to make config changes applied | |
| $this->setUpSymfony($this->configParams); | |
| // Request not found url page3 page content should be rendered | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/editnotfoundurlblablabla'); | |
| $this->assertStringContainsString('Page3 Test Html', $crawler->text()); | |
| } | |
| public function testConfigNotificationConfiguration(): void | |
| { | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| $buttonCrawler = $crawler->selectButton('config[buttons][save]'); | |
| $form = $buttonCrawler->form(); | |
| $send_notification_to_author = '0'; | |
| $campaign_notification_email_addresses = 'a@test.com, b@test.com'; | |
| $webhook_notification_email_addresses = 'a@webhook.com, b@webhook.com'; | |
| $form->setValues( | |
| [ | |
| 'config[coreconfig][site_url]' => 'https://mautic-community.local', // required | |
| 'config[leadconfig][contact_columns]' => ['name', 'email', 'id'], | |
| 'config[notification_config][campaign_send_notification_to_author]' => $send_notification_to_author, | |
| 'config[notification_config][campaign_notification_email_addresses]' => $campaign_notification_email_addresses, | |
| 'config[notification_config][webhook_send_notification_to_author]' => $send_notification_to_author, | |
| 'config[notification_config][webhook_notification_email_addresses]' => $webhook_notification_email_addresses, | |
| ] | |
| ); | |
| $this->client->submit($form); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| $crawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| $buttonCrawler = $crawler->selectButton('config[buttons][save]'); | |
| $form = $buttonCrawler->form(); | |
| Assert::assertEquals($send_notification_to_author, $form['config[notification_config][campaign_send_notification_to_author]']->getValue()); | |
| Assert::assertEquals($campaign_notification_email_addresses, $form['config[notification_config][campaign_notification_email_addresses]']->getValue()); | |
| Assert::assertEquals($send_notification_to_author, $form['config[notification_config][webhook_send_notification_to_author]']->getValue()); | |
| Assert::assertEquals($webhook_notification_email_addresses, $form['config[notification_config][webhook_notification_email_addresses]']->getValue()); | |
| } | |
| public function testUserAndSystemLocale(): void | |
| { | |
| // 1. Change user locale in account - should change _locale session | |
| $accountCrawler = $this->client->request(Request::METHOD_GET, '/s/account'); | |
| $accountSaveButton = $accountCrawler->selectButton('user[buttons][save]'); | |
| $accountForm = $accountSaveButton->form(); | |
| $accountForm->setValues( | |
| [ | |
| 'user[locale]' => 'en_US', | |
| ] | |
| ); | |
| $this->client->submit($accountForm); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| Assert::assertSame('en_US', static::getContainer()->get('session')->get('_locale')); | |
| // 2. Change system locale in configuration - should not change _locale session | |
| $configCrawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| $configSaveButton = $configCrawler->selectButton('config[buttons][save]'); | |
| $configForm = $configSaveButton->form(); | |
| $configForm->setValues( | |
| [ | |
| 'config[coreconfig][locale]' => 'en_US', | |
| 'config[coreconfig][site_url]' => 'https://mautic-cloud.local', // required | |
| ] | |
| ); | |
| $this->client->submit($configForm); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| Assert::assertSame('en_US', static::getContainer()->get('session')->get('_locale')); | |
| // 3. Change user locale to system default in account - should change _locale session to system default | |
| $accountCrawler = $this->client->request(Request::METHOD_GET, '/s/account'); | |
| $accountSaveButton = $accountCrawler->selectButton('user[buttons][save]'); | |
| $accountForm = $accountSaveButton->form(); | |
| $accountForm->setValues( | |
| [ | |
| 'user[locale]' => '', | |
| ] | |
| ); | |
| $this->client->submit($accountForm); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| Assert::assertSame('en_US', static::getContainer()->get('session')->get('_locale')); | |
| // 2. Change system locale in configuration to en_US - should change _locale session | |
| $configCrawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| $configSaveButton = $configCrawler->selectButton('config[buttons][save]'); | |
| $configForm = $configSaveButton->form(); | |
| $configForm->setValues( | |
| [ | |
| 'config[coreconfig][locale]' => 'en_US', | |
| 'config[coreconfig][site_url]' => 'https://mautic-cloud.local', // required | |
| ] | |
| ); | |
| $this->client->submit($configForm); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| Assert::assertSame('en_US', static::getContainer()->get('session')->get('_locale')); | |
| } | |
| public function testSSOSettingEntityId(): void | |
| { | |
| $configCrawler = $this->client->request(Request::METHOD_GET, '/s/config/edit'); | |
| $configSaveButton = $configCrawler->selectButton('config[buttons][apply]'); | |
| $configForm = $configSaveButton->form(); | |
| /** @var ChoiceFormField $entityIdField */ | |
| $entityIdField = $configForm['config[userconfig][saml_idp_entity_id]']; | |
| $availableOptions = $entityIdField->availableOptionValues(); | |
| Assert::assertCount(3, $availableOptions); | |
| $configForm->setValues( | |
| [ | |
| 'config[userconfig][saml_idp_entity_id]' => $availableOptions[1], | |
| 'config[coreconfig][site_url]' => 'https://mautic-cloud.local', // required | |
| ] | |
| ); | |
| $this->client->submit($configForm); | |
| Assert::assertTrue($this->client->getResponse()->isOk()); | |
| Assert::assertEquals($availableOptions[1], $configForm['config[userconfig][saml_idp_entity_id]']->getValue()); | |
| } | |
| } | |