Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\ChannelBundle\Tests\Controller\Api; | |
use Mautic\ChannelBundle\Entity\Channel; | |
use Mautic\ChannelBundle\Entity\Message; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use PHPUnit\Framework\Assert; | |
final class MessageApiControllerTest extends MauticMysqlTestCase | |
{ | |
public function testCreateMessage(): void | |
{ | |
$payloadJson = <<<'JSON' | |
{ | |
"name": "API message", | |
"description": "Marketing message created via API functional test", | |
"channels": { | |
"email": { | |
"channel": "email", | |
"channelId": 12, | |
"isEnabled": true | |
} | |
} | |
} | |
JSON; | |
$payloadArray = json_decode($payloadJson, true); | |
$this->client->request('POST', '/api/messages/new', $payloadArray); | |
$responseJson = $this->client->getResponse()->getContent(); | |
Assert::assertSame(201, $this->client->getResponse()->getStatusCode(), $responseJson); | |
$this->assertMessagePayload($payloadArray, json_decode($responseJson, true)['message'], $responseJson); | |
} | |
/** | |
* @dataProvider patchProvider | |
* | |
* @param mixed[] $payload | |
* @param mixed[] $expectedResponsePayload | |
*/ | |
public function testEditMessageWithPatch(array $payload, array $expectedResponsePayload): void | |
{ | |
$channel = new Channel(); | |
$channel->setChannel('email'); | |
$channel->setChannelId(12); | |
$channel->setIsEnabled(true); | |
$message = new Message(); | |
$message->setName('API message'); | |
$message->addChannel($channel); | |
$this->em->persist($channel); | |
$this->em->persist($message); | |
$this->em->flush(); | |
$this->em->detach($channel); | |
$this->em->detach($message); | |
$patchPayload = ['id' => $message->getId()] + $payload; | |
$this->client->request('PATCH', "/api/messages/{$message->getId()}/edit", $patchPayload); | |
$responseJson = $this->client->getResponse()->getContent(); | |
Assert::assertSame(200, $this->client->getResponse()->getStatusCode(), $responseJson); | |
$this->assertMessagePayload( | |
['id' => $message->getId()] + $expectedResponsePayload, | |
json_decode($responseJson, true)['message'], | |
$responseJson | |
); | |
} | |
/** | |
* Note: the ID is added to the payload automatically in the test. | |
* | |
* @return iterable<mixed[]> | |
*/ | |
public static function patchProvider(): iterable | |
{ | |
yield [ | |
[ | |
'name' => 'API message (updated)', | |
], | |
[ | |
'name' => 'API message (updated)', | |
'description' => null, | |
'channels' => [ | |
'email' => [ | |
'channel' => 'email', | |
'channelId' => 12, | |
'isEnabled' => true, | |
], | |
], | |
], | |
]; | |
yield [ | |
[ | |
'description' => 'Description (updated)', | |
'channels' => [ | |
'email' => [ | |
'channel' => 'email', | |
'channelId' => 13, | |
'isEnabled' => false, | |
], | |
], | |
], | |
[ | |
'name' => 'API message', | |
'description' => 'Description (updated)', | |
'channels' => [ | |
'email' => [ | |
'channel' => 'email', | |
'channelId' => 13, | |
'isEnabled' => false, | |
], | |
], | |
], | |
]; | |
} | |
public function testEditMessagesWithPatch(): void | |
{ | |
$channel1 = new Channel(); | |
$channel1->setChannel('email'); | |
$channel1->setChannelId(12); | |
$channel1->setIsEnabled(true); | |
$message1 = new Message(); | |
$message1->setName('API message 1'); | |
$message1->addChannel($channel1); | |
$channel2 = new Channel(); | |
$channel2->setChannel('email'); | |
$channel2->setChannelId(13); | |
$channel2->setIsEnabled(true); | |
$message2 = new Message(); | |
$message2->setName('API message 2'); | |
$message2->addChannel($channel2); | |
$this->em->persist($channel1); | |
$this->em->persist($channel2); | |
$this->em->persist($message1); | |
$this->em->persist($message2); | |
$this->em->flush(); | |
$this->em->detach($channel1); | |
$this->em->detach($channel2); | |
$this->em->detach($message1); | |
$this->em->detach($message2); | |
$patchPayload = [ | |
['id' => $message1->getId(), 'name' => 'API message 1 (updated)'], | |
['id' => $message2->getId(), 'channels' => ['email' => ['channelId' => 14, 'isEnabled' => false]]], | |
]; | |
$this->client->request('PATCH', '/api/messages/batch/edit', $patchPayload); | |
$responseJson = $this->client->getResponse()->getContent(); | |
Assert::assertSame(200, $this->client->getResponse()->getStatusCode(), $responseJson); | |
$responseArray = json_decode($responseJson, true); | |
$this->assertMessagePayload( | |
[ | |
'id' => $message1->getId(), | |
'name' => 'API message 1 (updated)', | |
'description' => null, | |
'channels' => [ | |
'email' => [ | |
'channel' => 'email', | |
'channelId' => 12, | |
'isEnabled' => true, | |
], | |
], | |
], | |
$responseArray['messages'][0], | |
$responseJson | |
); | |
$this->assertMessagePayload( | |
[ | |
'id' => $message2->getId(), | |
'name' => 'API message 2', | |
'description' => null, | |
'channels' => [ | |
'email' => [ | |
'channel' => 'email', | |
'channelId' => 14, | |
'isEnabled' => false, | |
], | |
], | |
], | |
$responseArray['messages'][1], | |
$responseJson | |
); | |
} | |
/** | |
* @param mixed[] $expectedPayload | |
* @param mixed[] $actualPayload | |
*/ | |
private function assertMessagePayload(array $expectedPayload, array $actualPayload, string $deliveredPayloadJson): void | |
{ | |
Assert::assertSame($expectedPayload['name'], $actualPayload['name'], $deliveredPayloadJson); | |
Assert::assertSame($expectedPayload['description'], $actualPayload['description'], $deliveredPayloadJson); | |
Assert::assertCount(count($expectedPayload['channels']), $actualPayload['channels'], $deliveredPayloadJson); | |
Assert::assertGreaterThan(0, $actualPayload['id'], $deliveredPayloadJson); | |
Assert::assertSame($expectedPayload['channels']['email']['channel'], $actualPayload['channels'][0]['channel'], $deliveredPayloadJson); | |
Assert::assertSame($expectedPayload['channels']['email']['channelId'], $actualPayload['channels'][0]['channelId'], $deliveredPayloadJson); | |
Assert::assertSame($expectedPayload['channels']['email']['isEnabled'], $actualPayload['channels'][0]['isEnabled'], $deliveredPayloadJson); | |
Assert::assertGreaterThan(0, $actualPayload['channels'][0]['id'], $deliveredPayloadJson); | |
} | |
} | |