ValidatesProposalPricingTest.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. public function test_it_accepts_an_explicitly_null_block_as_not_having_that_modality(): void
  99. {
  100. $validator = $this->validatorFor([
  101. 'pavao' => null,
  102. ]);
  103. $this->assertTrue($validator->passes());
  104. }
  105. public function test_it_requires_the_section_fields_once_the_block_is_sent(): void
  106. {
  107. $validator = $this->validatorFor([
  108. 'pavao' => [
  109. 'registration_value' => 100,
  110. ],
  111. ]);
  112. $this->assertFalse($validator->passes());
  113. $this->assertTrue($validator->errors()->has('pavao.registration_included_in_course'));
  114. $this->assertTrue($validator->errors()->has('pavao.classes_included_in_course'));
  115. $this->assertTrue($validator->errors()->has('pavao.materials_included_in_course'));
  116. }
  117. private function validatorFor(array $data): Validator
  118. {
  119. $request = TestableProposalPricingRequest::create('/', 'POST', $data);
  120. $validator = ValidatorFacade::make($request->all(), $request->rules());
  121. $request->withValidator($validator);
  122. return $validator;
  123. }
  124. }
  125. class TestableProposalPricingRequest extends FormRequest
  126. {
  127. use ValidatesProposalPricing;
  128. public function rules(): array
  129. {
  130. return [
  131. ...$this->proposalPricingRules('pavao'),
  132. ...$this->proposalPricingRules('irrecusavel', withCondition: true),
  133. ];
  134. }
  135. public function withValidator(ValidatorContract $validator): void
  136. {
  137. $this->validateProposalPricingSections($validator, ['pavao', 'irrecusavel']);
  138. }
  139. }