Skip to content

Commit

Permalink
Adding functional API tests covering the problematic endpoint and met…
Browse files Browse the repository at this point in the history
…hod, fixing the controller
  • Loading branch information
escopecz authored and patrykgruszka committed Jan 12, 2022
1 parent e480e52 commit dafb6f2
Show file tree
Hide file tree
Showing 2 changed files with 209 additions and 2 deletions.
Expand Up @@ -42,11 +42,14 @@ protected function prepareParametersFromRequest(Form $form, array &$params, $ent
{
parent::prepareParametersFromRequest($form, $params, $entity, $masks);

$channels = $this->model->getChannels();
if (!isset($params['channels'])) {
if ('PATCH' === $this->request->getMethod() && !isset($params['channels'])) {
return;
} elseif (!isset($params['channels'])) {
$params['channels'] = [];
}

$channels = $this->model->getChannels();

foreach ($channels as $channelType => $channel) {
if (!isset($params['channels'][$channelType])) {
$params['channels'][$channelType] = ['isEnabled' => 0];
Expand Down
@@ -0,0 +1,204 @@
<?php

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->clear();

$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 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->clear();

$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)',
'channels' => [
'email' => [
'channel' => 'email',
'channelId' => 12,
'isEnabled' => true
],
],
],
$responseArray['messages'][0],
$responseJson
);
$this->assertMessagePayload(
[
'id' => $message2->getId(),
'name' => 'API message 2',
'channels' => [
'email' => [
'channel' => 'email',
'channelId' => 14,
'isEnabled' => false
],
],
],
$responseArray['messages'][1],
$responseJson
);
}

/**
* @param mixed[] $expectedPayload
* @param mixed[] $actualPayload
* @param string $deliveredPayloadJson
*/
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);
}
}

0 comments on commit dafb6f2

Please sign in to comment.