ClassPackageUnitQuantityClassesTest.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace Tests\Unit;
  3. use App\Http\Requests\ClassPackageUnitRequest;
  4. use App\Models\ClassPackageUnit;
  5. use App\Models\City;
  6. use App\Models\Country;
  7. use App\Models\State;
  8. use App\Models\Unit;
  9. use App\Services\ClassPackageUnitService;
  10. use Illuminate\Foundation\Testing\RefreshDatabase;
  11. use Illuminate\Support\Facades\Validator;
  12. use Tests\TestCase;
  13. /**
  14. * Regressão do bug: criar um Pacote de Aulas sem "Qtd. Aulas" quebrava com
  15. * SQLSTATE[23502] not null violation em quantity_classes, porque o campo
  16. * nunca estava nas rules() do FormRequest — FormRequest::validated() descarta
  17. * silenciosamente qualquer chave que não apareça em rules().
  18. */
  19. class ClassPackageUnitQuantityClassesTest extends TestCase
  20. {
  21. use RefreshDatabase;
  22. public function test_store_request_requires_quantity_classes(): void
  23. {
  24. $request = ClassPackageUnitRequest::create('/class-package', 'POST', [
  25. 'name' => 'Pacote Teste 1',
  26. 'class_duration_minutes' => 120,
  27. ]);
  28. $validator = Validator::make($request->all(), $request->rules());
  29. $this->assertTrue($validator->fails());
  30. $this->assertArrayHasKey('quantity_classes', $validator->errors()->toArray());
  31. }
  32. public function test_store_request_passes_when_quantity_classes_is_present(): void
  33. {
  34. $request = ClassPackageUnitRequest::create('/class-package', 'POST', [
  35. 'name' => 'Pacote Teste 1',
  36. 'quantity_classes' => 24,
  37. 'class_duration_minutes' => 120,
  38. ]);
  39. $validator = Validator::make($request->all(), $request->rules());
  40. $this->assertFalse($validator->fails());
  41. }
  42. public function test_service_persists_quantity_classes(): void
  43. {
  44. $unit = $this->makeUnit();
  45. $service = new ClassPackageUnitService(new \App\Services\ProposalPricingService());
  46. $packageUnit = $service->create([
  47. 'unit_id' => $unit->id,
  48. 'name' => 'Pacote Teste 1',
  49. 'quantity_classes' => 24,
  50. 'class_duration_minutes' => 120,
  51. ]);
  52. $this->assertInstanceOf(ClassPackageUnit::class, $packageUnit);
  53. $this->assertSame(24, $packageUnit->fresh()->quantity_classes);
  54. }
  55. private function makeUnit(): Unit
  56. {
  57. $country = Country::create(['name' => 'Brasil', 'code' => 'BR']);
  58. $state = State::create(['name' => 'Paraná', 'code' => 'PR', 'country_id' => $country->id]);
  59. $city = City::create(['name' => 'Maringá', 'country_id' => $country->id, 'state_id' => $state->id]);
  60. return Unit::create([
  61. 'fantasy_name' => 'Unidade Teste',
  62. 'social_reason' => 'Unidade Teste LTDA',
  63. 'cnpj' => '00000000000191',
  64. 'street' => 'Rua Teste',
  65. 'neighborhood' => 'Centro',
  66. 'postal_code' => '87000000',
  67. 'city_id' => $city->id,
  68. 'state_id' => $state->id,
  69. 'email' => 'unidade@teste.com',
  70. 'name_responsible' => 'Responsável Teste',
  71. ]);
  72. }
  73. }