validatorFor([ 'pavao' => [ 'registration_included_in_course' => false, 'registration_installments_allowed' => false, ], ]); $this->assertSame( ['Selecione exatamente uma opção: incluso no valor do curso ou permite parcelar.'], $validator->errors()->get('pavao.registration_included_in_course'), ); } public function test_it_rejects_the_registration_section_when_both_options_are_selected(): void { $validator = $this->validatorFor([ 'pavao' => [ 'registration_included_in_course' => true, 'registration_installments_allowed' => true, ], ]); $this->assertTrue($validator->errors()->has('pavao.registration_included_in_course')); } public function test_it_accepts_the_registration_section_when_exactly_one_option_is_selected(): void { $validator = $this->validatorFor([ 'pavao' => [ 'registration_included_in_course' => true, 'registration_installments_allowed' => false, ], ]); $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course')); } public function test_it_validates_the_classes_and_materials_sections_independently(): void { $validator = $this->validatorFor([ 'pavao' => [ 'registration_included_in_course' => true, 'registration_installments_allowed' => false, 'classes_included_in_course' => false, 'classes_installments_allowed' => false, 'materials_included_in_course' => true, 'materials_installments_allowed' => true, ], ]); $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course')); $this->assertTrue($validator->errors()->has('pavao.classes_included_in_course')); $this->assertTrue($validator->errors()->has('pavao.materials_included_in_course')); } public function test_it_skips_a_block_that_was_not_sent(): void { $validator = $this->validatorFor([ 'irrecusavel' => [ 'registration_included_in_course' => true, 'registration_installments_allowed' => false, 'classes_included_in_course' => true, 'classes_installments_allowed' => false, 'materials_included_in_course' => true, 'materials_installments_allowed' => false, ], ]); $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course')); $this->assertFalse($validator->errors()->any()); } public function test_it_validates_pavao_and_irrecusavel_blocks_independently(): void { $validator = $this->validatorFor([ 'pavao' => [ 'registration_included_in_course' => true, 'registration_installments_allowed' => false, 'classes_included_in_course' => true, 'classes_installments_allowed' => false, 'materials_included_in_course' => true, 'materials_installments_allowed' => false, ], 'irrecusavel' => [ 'registration_included_in_course' => false, 'registration_installments_allowed' => false, 'classes_included_in_course' => true, 'classes_installments_allowed' => false, 'materials_included_in_course' => true, 'materials_installments_allowed' => false, ], ]); $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course')); $this->assertTrue($validator->errors()->has('irrecusavel.registration_included_in_course')); } private function validatorFor(array $data): Validator { $request = TestableProposalPricingRequest::create('/', 'POST', $data); $validator = ValidatorFacade::make($request->all(), $request->rules()); $request->withValidator($validator); return $validator; } } class TestableProposalPricingRequest extends FormRequest { use ValidatesProposalPricing; public function rules(): array { return [ ...$this->proposalPricingRules('pavao', 'sometimes'), ...$this->proposalPricingRules('irrecusavel', 'sometimes', withCondition: true), ]; } public function withValidator(ValidatorContract $validator): void { $this->validateProposalPricingSections($validator, ['pavao', 'irrecusavel']); } }