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 = '[email protected], [email protected]'; | |
$webhook_notification_email_addresses = '[email protected], [email protected]'; | |
$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()); | |
} | |
} | |