*/ class TimesheetZeroDurationValidatorTest extends ConstraintValidatorTestCase { protected function createValidator(): TimesheetZeroDurationValidator { return $this->createMyValidator(false); } protected function createMyValidator(bool $allowZeroDuration = false): TimesheetZeroDurationValidator { $loader = $this->createMock(ConfigLoaderInterface::class); $config = SystemConfigurationFactory::create($loader, [ 'timesheet' => [ 'rules' => [ 'allow_zero_duration' => $allowZeroDuration, ], ] ]); return new TimesheetZeroDurationValidator($config); } public function testConstraintIsInvalid(): void { $this->expectException(UnexpectedTypeException::class); $this->validator->validate(new Timesheet(), new NotBlank()); } public function testInvalidValueThrowsException(): void { $this->expectException(UnexpectedTypeException::class); $this->validator->validate(new NotBlank(), new TimesheetZeroDuration(['message' => 'Duration cannot be zero.'])); // @phpstan-ignore-line } private function prepareTimesheet() { // creates Timesheet with same begin and endtime $begin = new \DateTime(); $timesheet = new Timesheet(); $timesheet->setBegin(clone $begin); $timesheet->setEnd(clone $begin); $timesheet->setDuration(0); return $timesheet; } public function testZeroDurationIsDisallowed(): void { $timesheet = $this->prepareTimesheet(); $this->validator->validate($timesheet, new TimesheetZeroDuration(['message' => 'Duration cannot be zero.'])); $this->buildViolation('Duration cannot be zero.') ->atPath('property.path.duration') ->setCode(TimesheetZeroDuration::ZERO_DURATION_ERROR) ->assertRaised(); } public function testZeroDurationIsAllowed(): void { $this->validator = $this->createMyValidator(true); $this->validator->initialize($this->context); $timesheet = $this->prepareTimesheet(); $this->validator->validate($timesheet, new TimesheetZeroDuration(['message' => 'Duration cannot be zero.'])); $this->assertNoViolation(); } }