ValidatesProposalPricingTest.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace Tests\Unit\Http\Requests\Concerns;
  3. use App\Http\Requests\Concerns\ValidatesProposalPricing;
  4. use Illuminate\Contracts\Validation\Validator as ValidatorContract;
  5. use Illuminate\Foundation\Http\FormRequest;
  6. use Illuminate\Support\Facades\Validator as ValidatorFacade;
  7. use Illuminate\Validation\Validator;
  8. use Tests\TestCase;
  9. class ValidatesProposalPricingTest extends TestCase
  10. {
  11. public function test_it_rejects_the_registration_section_when_neither_option_is_selected(): void
  12. {
  13. $validator = $this->validatorFor([
  14. 'pavao' => [
  15. 'registration_included_in_course' => false,
  16. 'registration_installments_allowed' => false,
  17. ],
  18. ]);
  19. $this->assertSame(
  20. ['Selecione exatamente uma opção: incluso no valor do curso ou permite parcelar.'],
  21. $validator->errors()->get('pavao.registration_included_in_course'),
  22. );
  23. }
  24. public function test_it_rejects_the_registration_section_when_both_options_are_selected(): void
  25. {
  26. $validator = $this->validatorFor([
  27. 'pavao' => [
  28. 'registration_included_in_course' => true,
  29. 'registration_installments_allowed' => true,
  30. ],
  31. ]);
  32. $this->assertTrue($validator->errors()->has('pavao.registration_included_in_course'));
  33. }
  34. public function test_it_accepts_the_registration_section_when_exactly_one_option_is_selected(): void
  35. {
  36. $validator = $this->validatorFor([
  37. 'pavao' => [
  38. 'registration_included_in_course' => true,
  39. 'registration_installments_allowed' => false,
  40. ],
  41. ]);
  42. $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
  43. }
  44. public function test_it_validates_the_classes_and_materials_sections_independently(): void
  45. {
  46. $validator = $this->validatorFor([
  47. 'pavao' => [
  48. 'registration_included_in_course' => true,
  49. 'registration_installments_allowed' => false,
  50. 'classes_included_in_course' => false,
  51. 'classes_installments_allowed' => false,
  52. 'materials_included_in_course' => true,
  53. 'materials_installments_allowed' => true,
  54. ],
  55. ]);
  56. $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
  57. $this->assertTrue($validator->errors()->has('pavao.classes_included_in_course'));
  58. $this->assertTrue($validator->errors()->has('pavao.materials_included_in_course'));
  59. }
  60. public function test_it_skips_a_block_that_was_not_sent(): void
  61. {
  62. $validator = $this->validatorFor([
  63. 'irrecusavel' => [
  64. 'registration_included_in_course' => true,
  65. 'registration_installments_allowed' => false,
  66. 'classes_included_in_course' => true,
  67. 'classes_installments_allowed' => false,
  68. 'materials_included_in_course' => true,
  69. 'materials_installments_allowed' => false,
  70. ],
  71. ]);
  72. $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
  73. $this->assertFalse($validator->errors()->any());
  74. }
  75. public function test_it_validates_pavao_and_irrecusavel_blocks_independently(): void
  76. {
  77. $validator = $this->validatorFor([
  78. 'pavao' => [
  79. 'registration_included_in_course' => true,
  80. 'registration_installments_allowed' => false,
  81. 'classes_included_in_course' => true,
  82. 'classes_installments_allowed' => false,
  83. 'materials_included_in_course' => true,
  84. 'materials_installments_allowed' => false,
  85. ],
  86. 'irrecusavel' => [
  87. 'registration_included_in_course' => false,
  88. 'registration_installments_allowed' => false,
  89. 'classes_included_in_course' => true,
  90. 'classes_installments_allowed' => false,
  91. 'materials_included_in_course' => true,
  92. 'materials_installments_allowed' => false,
  93. ],
  94. ]);
  95. $this->assertFalse($validator->errors()->has('pavao.registration_included_in_course'));
  96. $this->assertTrue($validator->errors()->has('irrecusavel.registration_included_in_course'));
  97. }
  98. private function validatorFor(array $data): Validator
  99. {
  100. $request = TestableProposalPricingRequest::create('/', 'POST', $data);
  101. $validator = ValidatorFacade::make($request->all(), $request->rules());
  102. $request->withValidator($validator);
  103. return $validator;
  104. }
  105. }
  106. class TestableProposalPricingRequest extends FormRequest
  107. {
  108. use ValidatesProposalPricing;
  109. public function rules(): array
  110. {
  111. return [
  112. ...$this->proposalPricingRules('pavao', 'sometimes'),
  113. ...$this->proposalPricingRules('irrecusavel', 'sometimes', withCondition: true),
  114. ];
  115. }
  116. public function withValidator(ValidatorContract $validator): void
  117. {
  118. $this->validateProposalPricingSections($validator, ['pavao', 'irrecusavel']);
  119. }
  120. }