Select Git revision
CapsuleEditorControllerTest.php

David Beniamine authored
CapsuleEditorControllerTest.php 7.36 KiB
<?php
namespace App\Tests\functional;
use App\Entity\Capsule;
use App\Entity\User;
use App\Repository\CapsuleRepository;
use App\Repository\UserRepository;
use Doctrine\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class CapsuleEditorControllerTest extends WebTestCase
{
private KernelBrowser $client;
private ObjectManager $object_manager;
private User $user_author;
private User $editor_non_author;
private UserRepository $user_repository; /** @phpstan-ignore-line */
private CapsuleRepository $capsule_repository; /** @phpstan-ignore-line */
private Capsule $capsule;
protected function setUp(): void
{
self::ensureKernelShutdown();
$this->client = static::createClient();
$this->object_manager = $this->client->getContainer()
->get('doctrine')
->getManager();
$this->user_repository = $this->object_manager->getRepository(User::class);
$this->capsule_repository = $this->object_manager->getRepository(Capsule::class);
$this->setUsers();
$this->setCapsule();
}
protected function tearDown(): void
{
parent::tearDown();
self::ensureKernelShutdown();
}
public function testAuthorShouldBeAbleToDeleteACapsule(): void
{
$this->client->loginUser($this->user_author);
$this->client->request('GET', '/en/capsule/delete/' . $this->capsule->getId());
$this->assertResponseIsSuccessful();
}
public function testEditorNonAuthorShouldNotBeAbleToDeleteACapsule(): void
{
$this->client->loginUser($this->editor_non_author);
$this->client->request('GET', '/en/capsule/delete/' . $this->capsule->getId());
$this->assertResponseRedirects('/en/my_capsules', 302);
}
public function testAuthorShouldBeAbleToAddANewEditorForACapsule(): void
{
$uri = '/en/capsule/' . $this->capsule->getId() . '/editors';
$this->client->loginUser($this->user_author);
$crawler = $this->client->request('GET', $uri);
$this->assertResponseIsSuccessful();
$this->client->enableProfiler();
$submit_button = $crawler->selectButton('Validate');
$form = $submit_button->form();
$form['capsule_editors_form[email]'] = $this->editor_non_author->getEmail();
$this->client->submit($form);
$this->assertResponseRedirects($uri, 302);
$this->client->followRedirect();
$this->assertResponseIsSuccessful($uri);
$capsule_refreshed = $this->capsule_repository->findOneBy(['id' => $this->capsule->getId()]);
if (! $capsule_refreshed instanceof Capsule) {
throw new \Exception("Capsule does not exist.");
}
$editor = $this->user_repository->findOneBy(['id' => $this->editor_non_author->getId()]);
$this->assertSame($editor, $capsule_refreshed->getEditors()->last());
}
public function testEditorShouldBeAbleToAccessTheCapsuleEditorsPage(): void
{
$this->capsule->addEditor($this->editor_non_author);
$uri = '/en/capsule/' . $this->capsule->getId() . '/editors';
$this->client->loginUser($this->editor_non_author);
$this->client->request('GET', $uri);
$this->assertResponseIsSuccessful();
}
public function testNonRegisteredUserAddedAsEditorShouldReceiveAnEmail(): void
{
$uri = '/en/capsule/' . $this->capsule->getId() . '/editors';
$this->client->loginUser($this->user_author);
$crawler = $this->client->request('GET', $uri);
$this->assertResponseIsSuccessful();
$this->client->enableProfiler();
$submit_button = $crawler->selectButton('Validate');
$non_registered_user_email = "non_registered_user@email.fr";
$form = $submit_button->form();
$form['capsule_editors_form[email]'] = $non_registered_user_email;
$this->client->submit($form);
$this->assertResponseRedirects($uri, 302);
$this->assertEmailCount(1);
$emailMessage = $this->getMailerMessage(0);
if (null === $emailMessage) {
throw new \Exception("Email message could not be found");
}
$this->assertEmailAddressContains(
$emailMessage,
'To',
$non_registered_user_email
);
$this->client->followRedirect();
$this->assertResponseIsSuccessful($uri);
}
public function testRegisteredUserShouldReceiveAnEmailWithCapsuleEditionLink(): void
{
$uri = '/en/capsule/' . $this->capsule->getId() . '/editors';
$this->client->loginUser($this->user_author);
$crawler = $this->client->request('GET', $uri);
$this->assertResponseIsSuccessful();
$this->client->enableProfiler();
$submit_button = $crawler->selectButton('Validate');
$form = $submit_button->form();
$form['capsule_editors_form[email]'] = $this->editor_non_author->getEmail();
$this->client->submit($form);
$this->assertResponseRedirects($uri, 302);
$this->assertEmailCount(1);
$emailMessage = $this->getMailerMessage(0);
if (null === $emailMessage) {
throw new \Exception("Email message could not be found");
}
$this->assertEmailAddressContains(
$emailMessage,
'To',
$this->editor_non_author->getEmail()
);
$this->client->followRedirect();
$this->assertResponseIsSuccessful($uri);
}
public function testAlreadyAddedEditorShouldNotReceiveAnEmail(): void
{
$this->capsule->addEditor($this->editor_non_author);
$this->object_manager->persist($this->capsule);
$this->object_manager->flush();
$this->assertContains($this->editor_non_author, $this->capsule->getEditors()->toArray());
$uri = '/en/capsule/' . $this->capsule->getId() . '/editors';
$this->client->loginUser($this->user_author);
$crawler = $this->client->request('GET', $uri);
$this->assertResponseIsSuccessful();
$this->client->enableProfiler();
$submit_button = $crawler->selectButton('Validate');
$form = $submit_button->form();
$form['capsule_editors_form[email]'] = $this->editor_non_author->getEmail();
$this->client->submit($form);
$this->assertEmailCount(1);
$this->assertResponseRedirects($uri, 302);
$this->client->followRedirect();
$this->assertResponseIsSuccessful($uri);
}
private function setUsers(): void
{
$verified_user_1 = $this->user_repository
->findOneBy(['email' => 'defaultUser@localhost.com']);
if (! $verified_user_1 instanceof User) {
throw new \Exception("User does not exist.");
}
$this->user_author = $verified_user_1;
$verified_user_2 = $this->user_repository
->findOneBy(['email' => 'defaultUser2@localhost.com']);
if (! $verified_user_2 instanceof User) {
throw new \Exception("User does not exist.");
}
$this->editor_non_author = $verified_user_2;
}
private function setCapsule(): void
{
$capsule = $this->capsule_repository->findOneBy(['name' => 'Pomme']);
if (! $capsule instanceof Capsule) {
throw new \Exception("Capsule does not exist.");
}
$this->capsule = $capsule;
}
}