Fix test according to Junie guidelines

This commit is contained in:
2025-09-29 16:23:13 +02:00
parent c731f1967b
commit 20bbb6b485

View File

@@ -19,6 +19,9 @@ use Chill\TaskBundle\Event\TaskAssignEventSubscriber;
use Chill\TaskBundle\Notification\AssignTaskNotificationFlagProvider;
use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Prophecy\Argument;
use Prophecy\PhpUnit\ProphecyTrait;
use Prophecy\Prophecy\ObjectProphecy;
use Twig\Environment;
/**
@@ -28,53 +31,53 @@ use Twig\Environment;
*/
class TaskAssignEventSubscriberTest extends TestCase
{
private EntityManagerInterface $entityManager;
private Environment $twig;
use ProphecyTrait;
private ObjectProphecy $entityManager;
private ObjectProphecy $twig;
private TaskAssignEventSubscriber $subscriber;
protected function setUp(): void
{
$this->entityManager = $this->createMock(EntityManagerInterface::class);
$this->twig = $this->createMock(Environment::class);
$this->subscriber = new TaskAssignEventSubscriber($this->entityManager, $this->twig);
$this->entityManager = $this->prophesize(EntityManagerInterface::class);
$this->twig = $this->prophesize(Environment::class);
$this->subscriber = new TaskAssignEventSubscriber(
$this->entityManager->reveal(),
$this->twig->reveal()
);
}
public function testGetSubscribedEvents(): void
private function setEntityId(object $entity, int $id): void
{
$events = TaskAssignEventSubscriber::getSubscribedEvents();
$this->assertArrayHasKey(AssignTaskEvent::PERSIST, $events);
$this->assertEquals(['onTaskAssigned', 0], $events[AssignTaskEvent::PERSIST]);
$reflection = new \ReflectionClass($entity);
$property = $reflection->getProperty('id');
$property->setAccessible(true);
$property->setValue($entity, $id);
}
public function testOnTaskAssignedCreatesNotificationWhenAssigneeChanges(): void
{
// Arrange
$task = $this->createMock(SingleTask::class);
$assignee = $this->createMock(User::class);
$event = $this->createMock(AssignTaskEvent::class);
$initialAssignee = new User();
$newAssignee = new User();
$task->method('getId')->willReturn(123);
$task->method('getTitle')->willReturn('Test Task');
$task->method('getAssignee')->willReturn($assignee);
$task = new SingleTask();
$task->setTitle('Test Task');
$task->setAssignee($newAssignee);
$this->setEntityId($task, 123);
$event->method('hasAssigneeChanged')->willReturn(true);
$event->method('getTask')->willReturn($task);
$event = new AssignTaskEvent($task, $initialAssignee);
$this->twig->expects($this->exactly(2))
->method('render')
->with(
$this->logicalOr(
'@ChillTask/Notification/task_assignment_notification_title.txt.twig',
'@ChillTask/Notification/task_assignment_notification_content.txt.twig'
),
$this->isType('array')
)
->willReturnOnConsecutiveCalls('Notification Title', 'Notification Content');
$this->twig->render('@ChillTask/Notification/task_assignment_notification_title.txt.twig', Argument::type('array'))
->shouldBeCalledOnce()
->willReturn('Notification Title');
$this->entityManager->expects($this->once())
->method('persist')
->with($this->isInstanceOf(Notification::class));
$this->twig->render('@ChillTask/Notification/task_assignment_notification_content.txt.twig', Argument::type('array'))
->shouldBeCalledOnce()
->willReturn('Notification Content');
$this->entityManager->persist(Argument::type(Notification::class))
->shouldBeCalledOnce();
// Act
$this->subscriber->onTaskAssigned($event);
@@ -83,11 +86,16 @@ class TaskAssignEventSubscriberTest extends TestCase
public function testOnTaskAssignedDoesNothingWhenAssigneeDoesNotChange(): void
{
// Arrange
$event = $this->createMock(AssignTaskEvent::class);
$event->method('hasAssigneeChanged')->willReturn(false);
$assignee = new User();
$this->twig->expects($this->never())->method('render');
$this->entityManager->expects($this->never())->method('persist');
$task = new SingleTask();
$task->setTitle('Test Task');
$task->setAssignee($assignee);
$event = new AssignTaskEvent($task, $assignee);
$this->twig->render(Argument::any(), Argument::any())->shouldNotBeCalled();
$this->entityManager->persist(Argument::any())->shouldNotBeCalled();
// Act
$this->subscriber->onTaskAssigned($event);
@@ -96,25 +104,24 @@ class TaskAssignEventSubscriberTest extends TestCase
public function testNotificationHasCorrectProperties(): void
{
// Arrange
$task = $this->createMock(SingleTask::class);
$assignee = $this->createMock(User::class);
$event = $this->createMock(AssignTaskEvent::class);
$initialAssignee = new User();
$newAssignee = new User();
$task->method('getId')->willReturn(456);
$task->method('getTitle')->willReturn('Important Task');
$task->method('getAssignee')->willReturn($assignee);
$task = new SingleTask();
$task->setTitle('Important Task');
$task->setAssignee($newAssignee);
$this->setEntityId($task, 456);
$event->method('hasAssigneeChanged')->willReturn(true);
$event->method('getTask')->willReturn($task);
$event = new AssignTaskEvent($task, $initialAssignee);
$this->twig->method('render')->willReturn('Test Content');
$this->twig->render(Argument::any(), Argument::any())->willReturn('Test Content');
// Capture the persisted notification
$persistedNotification = null;
$this->entityManager->expects($this->once())
->method('persist')
->willReturnCallback(function ($notification) use (&$persistedNotification) {
$persistedNotification = $notification;
$this->entityManager->persist(Argument::type(Notification::class))
->shouldBeCalledOnce()
->will(function ($args) use (&$persistedNotification) {
$persistedNotification = $args[0];
});
// Act
@@ -122,7 +129,7 @@ class TaskAssignEventSubscriberTest extends TestCase
// Assert
$this->assertInstanceOf(Notification::class, $persistedNotification);
$this->assertEquals(456, $persistedNotification->getRelatedEntityId());
$this->assertEquals($task->getId(), $persistedNotification->getRelatedEntityId());
$this->assertEquals(SingleTask::class, $persistedNotification->getRelatedEntityClass());
$this->assertEquals(AssignTaskNotificationFlagProvider::FLAG, $persistedNotification->getType());
$this->assertEquals('Test Content', $persistedNotification->getTitle());