44
55namespace PhpList \RestBundle \Tests \Unit \Messaging \Service ;
66
7+ use DateTime ;
8+ use DateTimeImmutable ;
79use Doctrine \ORM \EntityManagerInterface ;
810use PhpList \Core \Domain \Identity \Model \Administrator ;
911use PhpList \Core \Domain \Identity \Model \PrivilegeFlag ;
1214use PhpList \Core \Domain \Messaging \Model \Message ;
1315use PhpList \Core \Domain \Messaging \Model \Dto \CreateMessageDto ;
1416use PhpList \Core \Domain \Messaging \Model \Dto \UpdateMessageDto ;
17+ use PhpList \Core \Domain \Messaging \Model \Message \MessageContent ;
18+ use PhpList \Core \Domain \Messaging \Model \Message \MessageMetadata ;
19+ use PhpList \Core \Domain \Messaging \Model \Message \MessageStatus ;
1520use PhpList \Core \Domain \Messaging \Service \Manager \MessageManager ;
1621use PhpList \RestBundle \Common \Service \Provider \PaginatedDataProvider ;
1722use PhpList \RestBundle \Messaging \Request \CreateMessageRequest ;
2227use PHPUnit \Framework \TestCase ;
2328use Symfony \Component \HttpFoundation \Request ;
2429use Symfony \Component \HttpKernel \Exception \AccessDeniedHttpException ;
30+ use Symfony \Component \HttpKernel \Exception \ConflictHttpException ;
2531use Symfony \Component \HttpKernel \Exception \NotFoundHttpException ;
2632
2733class CampaignServiceTest extends TestCase
@@ -42,6 +48,7 @@ protected function setUp(): void
4248 paginatedProvider: $ this ->paginatedProvider ,
4349 normalizer: $ this ->normalizer ,
4450 entityManager: $ this ->createMock (EntityManagerInterface::class),
51+ stuckCampaignThresholdSeconds: 1800 ,
4552 );
4653 }
4754
@@ -342,4 +349,111 @@ public function testDeleteMessageCallsMessageManagerDelete(): void
342349
343350 $ this ->campaignService ->deleteMessage ($ administrator , $ message );
344351 }
352+
353+ public function testGetStuckCampaignsReturnsMappedArray (): void
354+ {
355+ $ message = $ this ->createMock (Message::class);
356+ $ content = $ this ->createMock (MessageContent::class);
357+ $ metadata = $ this ->createMock (MessageMetadata::class);
358+ $ updatedAt = new DateTime ('-45 minutes ' );
359+
360+ $ content ->method ('getSubject ' )->willReturn ('Stuck Campaign ' );
361+ $ metadata ->method ('getStatus ' )->willReturn (MessageStatus::InProcess);
362+ $ message ->method ('getId ' )->willReturn (7 );
363+ $ message ->method ('getContent ' )->willReturn ($ content );
364+ $ message ->method ('getMetadata ' )->willReturn ($ metadata );
365+ $ message ->method ('getUpdatedAt ' )->willReturn ($ updatedAt );
366+
367+ $ this ->messageManager ->expects ($ this ->once ())
368+ ->method ('getStuckCampaigns ' )
369+ ->with ($ this ->isInstanceOf (DateTimeImmutable::class))
370+ ->willReturn ([$ message ]);
371+
372+ $ result = $ this ->campaignService ->getStuckCampaigns ();
373+
374+ $ this ->assertCount (1 , $ result );
375+ $ this ->assertSame (7 , $ result [0 ]['id ' ]);
376+ $ this ->assertSame ('Stuck Campaign ' , $ result [0 ]['subject ' ]);
377+ $ this ->assertSame ('inprocess ' , $ result [0 ]['status ' ]);
378+ $ this ->assertGreaterThanOrEqual (45 * 60 , $ result [0 ]['stuck_seconds ' ]);
379+ }
380+
381+ public function testResumeStuckCampaignThrowsExceptionWhenAdministratorLacksPrivileges (): void
382+ {
383+ $ privileges = $ this ->createMock (Privileges::class);
384+ $ administrator = $ this ->createMock (Administrator::class);
385+ $ message = $ this ->createMock (Message::class);
386+
387+ $ administrator ->expects ($ this ->once ())
388+ ->method ('getPrivileges ' )
389+ ->willReturn ($ privileges );
390+
391+ $ privileges ->expects ($ this ->once ())
392+ ->method ('has ' )
393+ ->with (PrivilegeFlag::Campaigns)
394+ ->willReturn (false );
395+
396+ $ this ->expectException (AccessDeniedHttpException::class);
397+
398+ $ this ->campaignService ->resumeStuckCampaign ($ administrator , $ message );
399+ }
400+
401+ public function testResumeStuckCampaignThrowsExceptionWhenMessageIsNull (): void
402+ {
403+ $ privileges = $ this ->createMock (Privileges::class);
404+ $ administrator = $ this ->createMock (Administrator::class);
405+
406+ $ administrator ->expects ($ this ->once ())
407+ ->method ('getPrivileges ' )
408+ ->willReturn ($ privileges );
409+
410+ $ privileges ->expects ($ this ->once ())
411+ ->method ('has ' )
412+ ->with (PrivilegeFlag::Campaigns)
413+ ->willReturn (true );
414+
415+ $ this ->expectException (NotFoundHttpException::class);
416+
417+ $ this ->campaignService ->resumeStuckCampaign ($ administrator , null );
418+ }
419+
420+ public function testResumeStuckCampaignThrowsConflictWhenCampaignIsNotStuck (): void
421+ {
422+ $ privileges = $ this ->createMock (Privileges::class);
423+ $ administrator = $ this ->createMock (Administrator::class);
424+ $ message = $ this ->createMock (Message::class);
425+ $ otherStuckMessage = $ this ->createMock (Message::class);
426+
427+ $ administrator ->method ('getPrivileges ' )->willReturn ($ privileges );
428+ $ privileges ->method ('has ' )->with (PrivilegeFlag::Campaigns)->willReturn (true );
429+
430+ $ message ->method ('getId ' )->willReturn (1 );
431+ $ otherStuckMessage ->method ('getId ' )->willReturn (2 );
432+
433+ $ this ->messageManager ->expects ($ this ->once ())
434+ ->method ('getStuckCampaigns ' )
435+ ->willReturn ([$ otherStuckMessage ]);
436+
437+ $ this ->expectException (ConflictHttpException::class);
438+
439+ $ this ->campaignService ->resumeStuckCampaign ($ administrator , $ message );
440+ }
441+
442+ public function testResumeStuckCampaignSucceedsWhenCampaignIsStuck (): void
443+ {
444+ $ privileges = $ this ->createMock (Privileges::class);
445+ $ administrator = $ this ->createMock (Administrator::class);
446+ $ message = $ this ->createMock (Message::class);
447+
448+ $ administrator ->method ('getPrivileges ' )->willReturn ($ privileges );
449+ $ privileges ->method ('has ' )->with (PrivilegeFlag::Campaigns)->willReturn (true );
450+
451+ $ message ->method ('getId ' )->willReturn (1 );
452+
453+ $ this ->messageManager ->expects ($ this ->once ())
454+ ->method ('getStuckCampaigns ' )
455+ ->willReturn ([$ message ]);
456+
457+ $ this ->campaignService ->resumeStuckCampaign ($ administrator , $ message );
458+ }
345459}
0 commit comments