Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\CampaignBundle\Tests\Controller; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use PHPUnit\Framework\Assert; | |
use Symfony\Component\DomCrawler\Crawler; | |
final class EventControllerFunctionalTest extends MauticMysqlTestCase | |
{ | |
/** | |
* @dataProvider fieldAndValueProvider | |
*/ | |
public function testCreateContactConditionOnStateField(string $field, string $value): void | |
{ | |
// Fetch the campaign condition form. | |
$uri = '/s/campaigns/events/new?type=lead.field_value&eventType=condition&campaignId=mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775&anchor=leadsource&anchorEventType=source'; | |
$this->client->request('GET', $uri, [], [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
Assert::assertTrue($response->isOk(), $response->getContent()); | |
// Get the form HTML element out of the response, fill it in and submit. | |
$responseData = json_decode($response->getContent(), true); | |
$crawler = new Crawler($responseData['newContent'], $this->client->getInternalRequest()->getUri()); | |
$form = $crawler->filterXPath('//form[@name="campaignevent"]')->form(); | |
$form->setValues( | |
[ | |
'campaignevent[anchor]' => 'leadsource', | |
'campaignevent[properties][field]' => $field, | |
'campaignevent[properties][operator]' => '=', | |
'campaignevent[properties][value]' => $value, | |
'campaignevent[type]' => 'lead.field_value', | |
'campaignevent[eventType]' => 'condition', | |
'campaignevent[anchorEventType]' => 'source', | |
'campaignevent[campaignId]' => 'mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775', | |
] | |
); | |
$this->client->request($form->getMethod(), $form->getUri(), $form->getPhpValues(), [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
Assert::assertTrue($response->isOk(), $response->getContent()); | |
$responseData = json_decode($response->getContent(), true); | |
Assert::assertSame(1, $responseData['success'], print_r(json_decode($response->getContent(), true), true)); | |
$actualEventData = array_filter($responseData['event'], fn ($value) => in_array($value, [ | |
'name', | |
'type', | |
'eventType', | |
'anchor', | |
'anchorEventType', | |
]), ARRAY_FILTER_USE_KEY); | |
$expectedEventData = [ | |
'name' => 'Contact field value', | |
'type' => 'lead.field_value', | |
'eventType' => 'condition', | |
'anchor' => 'leadsource', | |
'anchorEventType' => 'source', | |
]; | |
$this->assertSame($expectedEventData, $actualEventData); | |
$this->assertSame('condition', $responseData['eventType']); | |
$this->assertSame('campaignEvent', $responseData['mauticContent']); | |
$this->assertSame(1, $responseData['closeModal']); | |
} | |
/** | |
* @return string[][] | |
*/ | |
public static function fieldAndValueProvider(): array | |
{ | |
return [ | |
'country' => ['country', 'India'], | |
'region' => ['state', 'Arizona'], | |
'timezone' => ['timezone', 'Marigot'], | |
'locale' => ['preferred_locale', 'af'], | |
]; | |
} | |
public function testActionAtSpecificTimeWorkflow(): void | |
{ | |
$uri = '/s/campaigns/events/new?type=lead.changepoints&eventType=action&campaignId=mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775&anchor=no&anchorEventType=condition'; | |
$this->client->request('GET', $uri, [], [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
// Get the form HTML element out of the response, fill it in and submit. | |
$responseData = json_decode($response->getContent(), true); | |
$crawler = new Crawler($responseData['newContent'], $this->client->getInternalRequest()->getUri()); | |
$form = $crawler->filterXPath('//form[@name="campaignevent"]')->form(); | |
$form->setValues( | |
[ | |
'campaignevent[canvasSettings][droppedX]' => '863', | |
'campaignevent[canvasSettings][droppedY]' => '363', | |
'campaignevent[name]' => '', | |
'campaignevent[triggerMode]' => 'date', | |
'campaignevent[triggerDate]' => '2023-09-27 21:37', | |
'campaignevent[triggerInterval]' => '1', | |
'campaignevent[triggerIntervalUnit]' => 'd', | |
'campaignevent[triggerHour]' => '', | |
'campaignevent[triggerRestrictedStartHour]' => '', | |
'campaignevent[triggerRestrictedStopHour]' => '', | |
'campaignevent[anchor]' => 'no', | |
'campaignevent[properties][points]' => '21', | |
'campaignevent[properties][group]' => '', | |
'campaignevent[type]' => 'lead.changepoints', | |
'campaignevent[eventType]' => 'action', | |
'campaignevent[anchorEventType]' => 'condition', | |
'campaignevent[campaignId]' => 'mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775', | |
] | |
); | |
$this->client->request($form->getMethod(), $form->getUri(), $form->getPhpValues(), [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
$responseData = json_decode($response->getContent(), true); | |
$this->assertSame(1, $responseData['success'], print_r(json_decode($response->getContent(), true), true)); | |
$this->assertNotEmpty($responseData['eventId']); | |
$this->assertNotEmpty($responseData['event']['id']); | |
$this->assertEquals($responseData['eventId'], $responseData['event']['id']); | |
$this->assertSame('action', $responseData['eventType']); | |
$this->assertSame('campaignEvent', $responseData['mauticContent']); | |
$this->assertSame('by September 27, 2023 9:37 pm UTC', $responseData['label']); | |
$this->assertSame(1, $responseData['closeModal']); | |
$this->assertArrayHasKey('eventHtml', $responseData); | |
$this->assertArrayNotHasKey('updateHtml', $responseData); | |
$eventId = $responseData['event']['id']; | |
// GET EDIT FORM | |
$uri = "/s/campaigns/events/edit/{$eventId}?campaignId=mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775&anchor=no&anchorEventType=condition"; | |
$this->client->request('GET', $uri, [], [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
// FILL EDIT FORM | |
$responseData = json_decode($response->getContent(), true); | |
$crawler = new Crawler($responseData['newContent'], $this->client->getInternalRequest()->getUri()); | |
$form = $crawler->filterXPath('//form[@name="campaignevent"]')->form(); | |
$form->setValues( | |
[ | |
'campaignevent[canvasSettings][droppedX]' => '863', | |
'campaignevent[canvasSettings][droppedY]' => '363', | |
'campaignevent[name]' => '2 contact points after 1 day', | |
'campaignevent[triggerMode]' => 'interval', | |
'campaignevent[triggerDate]' => '2023-09-27 21:37', | |
'campaignevent[triggerInterval]' => '1', | |
'campaignevent[triggerIntervalUnit]' => 'd', | |
'campaignevent[triggerHour]' => '', | |
'campaignevent[triggerRestrictedStartHour]' => '', | |
'campaignevent[triggerRestrictedStopHour]' => '', | |
'campaignevent[anchor]' => 'no', | |
'campaignevent[properties][points]' => '2', | |
'campaignevent[properties][group]' => '', | |
'campaignevent[type]' => 'lead.changepoints', | |
'campaignevent[eventType]' => 'action', | |
'campaignevent[anchorEventType]' => 'condition', | |
'campaignevent[campaignId]' => 'mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775', | |
] | |
); | |
$this->client->request($form->getMethod(), $form->getUri(), $form->getPhpValues(), [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
$responseData = json_decode($response->getContent(), true); | |
$this->assertTrue($responseData['success'], print_r(json_decode($response->getContent(), true), true)); | |
$this->assertEquals($eventId, $responseData['eventId']); | |
$this->assertEquals($eventId, $responseData['event']['id']); | |
$this->assertSame('2 contact points after 1 day', $responseData['event']['name']); | |
$this->assertSame('action', $responseData['eventType']); | |
$this->assertSame('campaignEvent', $responseData['mauticContent']); | |
$this->assertSame('within 1 day', $responseData['label']); | |
$this->assertSame(1, $responseData['closeModal']); | |
$this->assertArrayHasKey('updateHtml', $responseData); | |
$this->assertArrayNotHasKey('eventHtml', $responseData); | |
} | |
public function testCloneWorkflow(): void | |
{ | |
$uri = '/s/campaigns/events/new?type=lead.changepoints&eventType=action&campaignId=mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775&anchor=no&anchorEventType=condition'; | |
$this->client->request('GET', $uri, [], [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
// Get the form HTML element out of the response, fill it in and submit. | |
$responseData = json_decode($response->getContent(), true); | |
$crawler = new Crawler($responseData['newContent'], $this->client->getInternalRequest()->getUri()); | |
$form = $crawler->filterXPath('//form[@name="campaignevent"]')->form(); | |
$form->setValues( | |
[ | |
'campaignevent[canvasSettings][droppedX]' => '863', | |
'campaignevent[canvasSettings][droppedY]' => '363', | |
'campaignevent[name]' => '', | |
'campaignevent[triggerMode]' => 'date', | |
'campaignevent[triggerDate]' => '2023-09-27 21:37', | |
'campaignevent[triggerInterval]' => '1', | |
'campaignevent[triggerIntervalUnit]' => 'd', | |
'campaignevent[triggerHour]' => '', | |
'campaignevent[triggerRestrictedStartHour]' => '', | |
'campaignevent[triggerRestrictedStopHour]' => '', | |
'campaignevent[anchor]' => 'no', | |
'campaignevent[properties][points]' => '21', | |
'campaignevent[properties][group]' => '', | |
'campaignevent[type]' => 'lead.changepoints', | |
'campaignevent[eventType]' => 'action', | |
'campaignevent[anchorEventType]' => 'condition', | |
'campaignevent[campaignId]' => 'mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775', | |
] | |
); | |
$this->client->request($form->getMethod(), $form->getUri(), $form->getPhpValues(), [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
$responseData = json_decode($response->getContent(), true); | |
$this->assertSame(1, $responseData['success'], print_r(json_decode($response->getContent(), true), true)); | |
$eventId = $responseData['event']['id']; | |
// CLONE EVENT | |
$uri = "/s/campaigns/events/clone/{$eventId}?campaignId=mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775"; | |
$this->client->request('POST', $uri, [], [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
$responseData = json_decode($response->getContent(), true); | |
$this->assertSame(1, $responseData['success'], print_r(json_decode($response->getContent(), true), true)); | |
$this->assertSame('campaignEventClone', $responseData['mauticContent']); | |
$this->assertSame('Adjust contact points', $responseData['eventName']); | |
$this->assertSame('New campaign', $responseData['campaignName']); | |
// INSERT EVENT | |
$uri = "/s/campaigns/events/insert/{$eventId}?campaignId=mautic_89f7f52426c1dff3daa3beaea708a6b39fe7a775"; | |
$this->client->request('POST', $uri, [], [], $this->createAjaxHeaders()); | |
$response = $this->client->getResponse(); | |
$this->assertTrue($response->isOk(), $response->getContent()); | |
$responseData = json_decode($response->getContent(), true); | |
$this->assertSame(1, $responseData['success'], print_r(json_decode($response->getContent(), true), true)); | |
$this->assertSame('action', $responseData['eventType']); | |
$this->assertSame('campaignEvent', $responseData['mauticContent']); | |
$this->assertTrue($responseData['clearCloneStorage']); | |
$this->assertNotEquals($eventId, $responseData['eventId']); | |
$this->assertNotEmpty($responseData['eventHtml']); | |
} | |
} | |