__invoke($ticket, $command); // Assert that the ticket is returned unchanged $this->assertSame($ticket, $result); $this->assertSame(EmergencyStatusEnum::YES, $ticket->getEmergencyStatus()); // Assert that no new emergency status history was created $emergencyStatusHistories = $ticket->getEmergencyStatusHistories(); $this->assertCount(1, $emergencyStatusHistories); } public function testInvokeWithYesEmergencyStatusToNo(): void { $ticket = new Ticket(); // Create a YES emergency status history new EmergencyStatusHistory(EmergencyStatusEnum::YES, $ticket); $handler = new ChangeEmergencyStateCommandHandler(new MockClock()); $command = new ChangeEmergencyStateCommand(EmergencyStatusEnum::NO); $result = $handler->__invoke($ticket, $command); // Assert that the ticket is returned $this->assertSame($ticket, $result); // Assert that the ticket emergency status is now NO $this->assertSame(EmergencyStatusEnum::NO, $ticket->getEmergencyStatus()); // Assert that the old emergency status history was ended and a new one was created $emergencyStatusHistories = $ticket->getEmergencyStatusHistories(); $this->assertCount(2, $emergencyStatusHistories); // The first emergency status history should be ended $yesEmergencyStatusHistory = $emergencyStatusHistories->first(); $this->assertNotNull($yesEmergencyStatusHistory->getEndDate()); $this->assertSame(EmergencyStatusEnum::YES, $yesEmergencyStatusHistory->getEmergencyStatus()); // The last emergency status history should be NO and active $noEmergencyStatusHistory = $emergencyStatusHistories->last(); $this->assertNull($noEmergencyStatusHistory->getEndDate()); $this->assertSame(EmergencyStatusEnum::NO, $noEmergencyStatusHistory->getEmergencyStatus()); } public function testInvokeWithNoEmergencyStatusToYes(): void { $ticket = new Ticket(); // Create a NO emergency status history new EmergencyStatusHistory(EmergencyStatusEnum::NO, $ticket); $handler = new ChangeEmergencyStateCommandHandler(new MockClock()); $command = new ChangeEmergencyStateCommand(EmergencyStatusEnum::YES); $result = $handler->__invoke($ticket, $command); // Assert that the ticket is returned $this->assertSame($ticket, $result); // Assert that the ticket emergency status is now YES $this->assertSame(EmergencyStatusEnum::YES, $ticket->getEmergencyStatus()); // Assert that the old emergency status history was ended and a new one was created $emergencyStatusHistories = $ticket->getEmergencyStatusHistories(); $this->assertCount(2, $emergencyStatusHistories); // The first emergency status history should be ended $noEmergencyStatusHistory = $emergencyStatusHistories->first(); $this->assertNotNull($noEmergencyStatusHistory->getEndDate()); $this->assertSame(EmergencyStatusEnum::NO, $noEmergencyStatusHistory->getEmergencyStatus()); // The last emergency status history should be YES and active $yesEmergencyStatusHistory = $emergencyStatusHistories->last(); $this->assertNull($yesEmergencyStatusHistory->getEndDate()); $this->assertSame(EmergencyStatusEnum::YES, $yesEmergencyStatusHistory->getEmergencyStatus()); } }