Просмотр исходного кода

fix: validate quantity_classes on class package unit creation

ClassPackageUnitRequest::rules() never declared quantity_classes, so
FormRequest::validated() silently dropped it before reaching the
controller/service, causing a not-null violation on insert whenever
the field was omitted.
alvesantos 2 дней назад
Родитель
Сommit
0c82d58908

+ 1 - 0
app/Http/Requests/ClassPackageUnitRequest.php

@@ -17,6 +17,7 @@ public function rules(): array
         return [
             'name'                    => "$required|string|max:255",
             'visible'                 => 'sometimes|boolean',
+            'quantity_classes'        => "$required|integer|min:1",
             'class_duration_minutes'  => "$required|integer|min:1|max:1440",
 
             // 'weekday'           => 'nullable|integer|min:0|max:6|required_with:start_time',

+ 88 - 0
tests/Unit/ClassPackageUnitQuantityClassesTest.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace Tests\Unit;
+
+use App\Http\Requests\ClassPackageUnitRequest;
+use App\Models\ClassPackageUnit;
+use App\Models\City;
+use App\Models\Country;
+use App\Models\State;
+use App\Models\Unit;
+use App\Services\ClassPackageUnitService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Support\Facades\Validator;
+use Tests\TestCase;
+
+/**
+ * Regressão do bug: criar um Pacote de Aulas sem "Qtd. Aulas" quebrava com
+ * SQLSTATE[23502] not null violation em quantity_classes, porque o campo
+ * nunca estava nas rules() do FormRequest — FormRequest::validated() descarta
+ * silenciosamente qualquer chave que não apareça em rules().
+ */
+class ClassPackageUnitQuantityClassesTest extends TestCase
+{
+    use RefreshDatabase;
+
+    public function test_store_request_requires_quantity_classes(): void
+    {
+        $request = ClassPackageUnitRequest::create('/class-package', 'POST', [
+            'name'                   => 'Pacote Teste 1',
+            'class_duration_minutes' => 120,
+        ]);
+
+        $validator = Validator::make($request->all(), $request->rules());
+
+        $this->assertTrue($validator->fails());
+        $this->assertArrayHasKey('quantity_classes', $validator->errors()->toArray());
+    }
+
+    public function test_store_request_passes_when_quantity_classes_is_present(): void
+    {
+        $request = ClassPackageUnitRequest::create('/class-package', 'POST', [
+            'name'                   => 'Pacote Teste 1',
+            'quantity_classes'       => 24,
+            'class_duration_minutes' => 120,
+        ]);
+
+        $validator = Validator::make($request->all(), $request->rules());
+
+        $this->assertFalse($validator->fails());
+    }
+
+    public function test_service_persists_quantity_classes(): void
+    {
+        $unit = $this->makeUnit();
+
+        $service = new ClassPackageUnitService(new \App\Services\ProposalPricingService());
+
+        $packageUnit = $service->create([
+            'unit_id'                => $unit->id,
+            'name'                   => 'Pacote Teste 1',
+            'quantity_classes'       => 24,
+            'class_duration_minutes' => 120,
+        ]);
+
+        $this->assertInstanceOf(ClassPackageUnit::class, $packageUnit);
+        $this->assertSame(24, $packageUnit->fresh()->quantity_classes);
+    }
+
+    private function makeUnit(): Unit
+    {
+        $country = Country::create(['name' => 'Brasil', 'code' => 'BR']);
+        $state   = State::create(['name' => 'Paraná', 'code' => 'PR', 'country_id' => $country->id]);
+        $city    = City::create(['name' => 'Maringá', 'country_id' => $country->id, 'state_id' => $state->id]);
+
+        return Unit::create([
+            'fantasy_name'     => 'Unidade Teste',
+            'social_reason'    => 'Unidade Teste LTDA',
+            'cnpj'             => '00000000000191',
+            'street'           => 'Rua Teste',
+            'neighborhood'     => 'Centro',
+            'postal_code'      => '87000000',
+            'city_id'          => $city->id,
+            'state_id'         => $state->id,
+            'email'            => 'unidade@teste.com',
+            'name_responsible' => 'Responsável Teste',
+        ]);
+    }
+}