createCompletePersonalData(); $personalData->remarks = 'Optional note'; $personalData->address->district = 'Mitte'; $personalData->communication->phone = '0301234567'; $violations = $this->validator()->validate($personalData, null, ['personal_data']); self::assertCount(0, $violations); } public function testMissingRequiredPersonalDataFieldFailsPersonalDataValidationGroup(): void { $personalData = $this->createCompletePersonalData(); $personalData->name = null; $violations = $this->validator()->validate($personalData, null, ['personal_data']); self::assertCount(1, $violations); self::assertSame('name', $violations->get(0)->getPropertyPath()); } public function testAddressCompletenessIgnoresOptionalDistrict(): void { $address = new Address(); $address->street = 'Main Street 1'; $address->postCode = '12345'; $address->city = 'Berlin'; $address->country = 'DE'; $address->district = 'Mitte'; $violations = $this->validator()->validate($address, null, ['personal_data']); self::assertCount(0, $violations); $address->street = null; $violations = $this->validator()->validate($address, null, ['personal_data']); self::assertCount(1, $violations); self::assertSame('street', $violations->get(0)->getPropertyPath()); } public function testCommunicationCompletenessIgnoresOptionalPhone(): void { $communication = new Communication(); $communication->email = 'customer@example.com'; $communication->mobile = '0123456789'; $communication->phone = '0301234567'; $violations = $this->validator()->validate($communication, null, ['personal_data']); self::assertCount(0, $violations); $communication->mobile = null; $violations = $this->validator()->validate($communication, null, ['personal_data']); self::assertCount(1, $violations); self::assertSame('mobile', $violations->get(0)->getPropertyPath()); } private function createCompletePersonalData(): PersonalData { $personalData = new PersonalData(); $personalData->firstName = 'Mia'; $personalData->name = 'Muster'; $personalData->gender = 'W'; $personalData->nationality = 'DE'; $personalData->dateOfBirth = new \DateTimeImmutable('1990-05-15'); $personalData->address->street = 'Main Street 1'; $personalData->address->postCode = '10115'; $personalData->address->city = 'Berlin'; $personalData->address->country = 'DE'; $personalData->communication->email = 'customer@example.com'; $personalData->communication->mobile = '0123456789'; return $personalData; } private function validator(): ValidatorInterface { return Validation::createValidatorBuilder() ->enableAttributeMapping() ->setConstraintValidatorFactory(new class extends ConstraintValidatorFactory { public function getInstance(Constraint $constraint): ConstraintValidatorInterface { if (true === ($constraint instanceof Email)) { return new EmailValidator(Email::VALIDATION_MODE_HTML5); } return parent::getInstance($constraint); } }) ->getValidator(); } }