Files
crewli/api/tests/Feature/FormBuilder/ValidationRules/SchemaSnapshotValidationRulesParityTest.php

84 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Feature\FormBuilder\ValidationRules;
use App\Enums\FormBuilder\FormFieldType;
use App\Enums\FormBuilder\FormFieldValidationRuleType;
use App\Enums\FormBuilder\FormSchemaSnapshotMode;
use App\Enums\FormBuilder\FormSubmissionMode;
use App\Models\FormBuilder\FormField;
use App\Models\FormBuilder\FormFieldValidationRule;
use App\Models\FormBuilder\FormSchema;
use App\Models\Organisation;
use App\Services\FormBuilder\FormSubmissionService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
/**
* `form_submissions.schema_snapshot.fields[*].validation_rules` is now
* sourced from the relational table via
* `FormFieldValidationRuleService::toJsonShape()`. Given a field with
* known rules, the snapshot JSON embeds the canonical shape — parity
* check against a freshly-rendered resource output.
*/
final class SchemaSnapshotValidationRulesParityTest extends TestCase
{
use RefreshDatabase;
public function test_snapshot_embeds_canonical_validation_rules_shape(): void
{
$org = Organisation::factory()->create();
$schema = FormSchema::factory()->create([
'organisation_id' => $org->id,
'submission_mode' => FormSubmissionMode::SINGLE,
'snapshot_mode' => FormSchemaSnapshotMode::ON_SUBMIT,
]);
$field = FormField::factory()->create([
'form_schema_id' => $schema->id,
'field_type' => FormFieldType::TEXT->value,
'slug' => 'voornaam',
]);
FormFieldValidationRule::factory()->forField($field)
->ofType(FormFieldValidationRuleType::MinLength, ['value' => 2])->create();
FormFieldValidationRule::factory()->forField($field)
->ofType(FormFieldValidationRuleType::MaxLength, ['value' => 40])->create();
$service = app(FormSubmissionService::class);
$snapshot = $this->invokeBuildSnapshot($service, $schema);
$fieldEntry = collect($snapshot['fields'])->firstWhere('slug', 'voornaam');
$this->assertNotNull($fieldEntry);
$this->assertSame([
'min_length' => 2,
'max_length' => 40,
], $fieldEntry['validation_rules']);
}
public function test_snapshot_validation_rules_null_when_no_rules(): void
{
$org = Organisation::factory()->create();
$schema = FormSchema::factory()->create(['organisation_id' => $org->id]);
FormField::factory()->create([
'form_schema_id' => $schema->id,
'slug' => 'noot',
]);
$service = app(FormSubmissionService::class);
$snapshot = $this->invokeBuildSnapshot($service, $schema);
$entry = collect($snapshot['fields'])->firstWhere('slug', 'noot');
$this->assertNull($entry['validation_rules']);
}
/** @return array<string, mixed> */
private function invokeBuildSnapshot(FormSubmissionService $service, FormSchema $schema): array
{
$ref = new \ReflectionMethod($service, 'buildSnapshot');
$ref->setAccessible(true);
return $ref->invoke($service, $schema);
}
}