StudentContractRequestTest.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace Tests\Unit\Http\Requests;
  3. use App\Http\Requests\StudentContractRequest;
  4. use App\Models\StudentContract;
  5. use Carbon\CarbonImmutable;
  6. use Illuminate\Support\Facades\Validator as ValidatorFacade;
  7. use Illuminate\Validation\Validator;
  8. use Tests\TestCase;
  9. class StudentContractRequestTest extends TestCase
  10. {
  11. protected function setUp(): void
  12. {
  13. parent::setUp();
  14. app()->setLocale('pt');
  15. CarbonImmutable::setTestNow('2026-08-10 12:00:00');
  16. }
  17. protected function tearDown(): void
  18. {
  19. CarbonImmutable::setTestNow();
  20. parent::tearDown();
  21. }
  22. public function test_it_does_not_allow_changing_the_contract_start_date(): void
  23. {
  24. $validator = $this->validatorFor([
  25. 'signature_date' => '2025-01-11',
  26. ]);
  27. $this->assertSame(
  28. ['A data de início do contrato não pode ser alterada.'],
  29. $validator->errors()->get('signature_date'),
  30. );
  31. }
  32. public function test_it_allows_sending_the_unchanged_contract_start_date(): void
  33. {
  34. $validator = $this->validatorFor([
  35. 'signature_date' => '2025-01-10',
  36. ]);
  37. $this->assertFalse($validator->errors()->has('signature_date'));
  38. }
  39. public function test_it_does_not_allow_reducing_the_contract_end_date(): void
  40. {
  41. $validator = $this->validatorFor([
  42. 'end_date' => '2026-11-30',
  43. ]);
  44. $this->assertSame(
  45. ['A data de fim do contrato não pode ser reduzida.'],
  46. $validator->errors()->get('end_date'),
  47. );
  48. }
  49. public function test_it_allows_renewal_up_to_one_year_from_today(): void
  50. {
  51. $validator = $this->validatorFor([
  52. 'end_date' => '2027-08-10',
  53. ]);
  54. $this->assertFalse($validator->errors()->has('end_date'));
  55. }
  56. public function test_it_rejects_renewal_beyond_one_year_from_today(): void
  57. {
  58. $validator = $this->validatorFor([
  59. 'end_date' => '2027-08-11',
  60. ]);
  61. $this->assertSame(
  62. ['A data de fim do contrato pode ser prorrogada no máximo até 10/08/2027.'],
  63. $validator->errors()->get('end_date'),
  64. );
  65. }
  66. private function validatorFor(array $data): Validator
  67. {
  68. $contract = new StudentContract;
  69. $contract->signature_date = '2025-01-10';
  70. $contract->end_date = '2026-12-01';
  71. $request = TestableStudentContractRequest::create('/', 'PUT', $data);
  72. $request->contract = $contract;
  73. $validator = ValidatorFacade::make($request->all(), $request->rules());
  74. foreach ($request->after() as $callback) {
  75. $validator->after($callback);
  76. }
  77. return $validator;
  78. }
  79. }
  80. class TestableStudentContractRequest extends StudentContractRequest
  81. {
  82. public ?StudentContract $contract = null;
  83. protected function contractBeingUpdated(): ?StudentContract
  84. {
  85. return $this->contract;
  86. }
  87. }