From 20bbb6b485992ed0eed6673ffbd0647f6b66ff47 Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Mon, 29 Sep 2025 16:23:13 +0200 Subject: [PATCH] Fix test according to Junie guidelines --- .../TaskAssignEventSubscriberTest.php | 105 ++++++++++-------- 1 file changed, 56 insertions(+), 49 deletions(-) diff --git a/src/Bundle/ChillTaskBundle/Tests/EventSubscriber/TaskAssignEventSubscriberTest.php b/src/Bundle/ChillTaskBundle/Tests/EventSubscriber/TaskAssignEventSubscriberTest.php index 2a820478c..2d58c517a 100644 --- a/src/Bundle/ChillTaskBundle/Tests/EventSubscriber/TaskAssignEventSubscriberTest.php +++ b/src/Bundle/ChillTaskBundle/Tests/EventSubscriber/TaskAssignEventSubscriberTest.php @@ -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());