fix(api): accept submitter details on public draft PUT and submit POST
S3a PR 1 frontend sends public_submitter_name and public_submitter_email on draft saves (PUT) and final submit (POST /submit), but the matching SavePublicDraftRequest and SubmitPublicSubmissionRequest did not whitelist these fields — Laravel's validated() silently stripped them, preventing mid-form name/email updates from persisting. Align both form requests with StartPublicDraftRequest to accept the same submitter fields with identical rules (string, max:150 / email, max:255, nullable). Controller copies present keys onto the submission model and saves when dirty, matching standard Laravel update() semantics — missing keys leave prior values untouched. Closes the backend gap identified in PR 1 smoke test.
This commit is contained in:
@@ -191,6 +191,103 @@ final class PublicFormDraftLifecycleTest extends TestCase
|
||||
$response->assertStatus(404);
|
||||
}
|
||||
|
||||
public function test_put_persists_submitter_details(): void
|
||||
{
|
||||
$submission = $this->startDraft();
|
||||
|
||||
$this->putJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}",
|
||||
[
|
||||
'public_submitter_name' => 'Backend Fix Test',
|
||||
'public_submitter_email' => 'backendfix@test.nl',
|
||||
],
|
||||
)->assertOk();
|
||||
|
||||
$fresh = $submission->fresh();
|
||||
$this->assertSame('Backend Fix Test', $fresh->public_submitter_name);
|
||||
$this->assertSame('backendfix@test.nl', $fresh->public_submitter_email);
|
||||
}
|
||||
|
||||
public function test_put_without_submitter_details_leaves_existing_values_untouched(): void
|
||||
{
|
||||
$submission = $this->startDraft();
|
||||
|
||||
$this->putJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}",
|
||||
[
|
||||
'public_submitter_name' => 'Original Name',
|
||||
'public_submitter_email' => 'original@test.nl',
|
||||
],
|
||||
)->assertOk();
|
||||
|
||||
// Second PUT omits the submitter keys — must not null them out.
|
||||
$this->putJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}",
|
||||
['values' => ['naam' => 'Bart']],
|
||||
)->assertOk();
|
||||
|
||||
$fresh = $submission->fresh();
|
||||
$this->assertSame('Original Name', $fresh->public_submitter_name);
|
||||
$this->assertSame('original@test.nl', $fresh->public_submitter_email);
|
||||
}
|
||||
|
||||
public function test_submit_persists_submitter_details(): void
|
||||
{
|
||||
$submission = $this->startDraft();
|
||||
|
||||
$this->putJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}",
|
||||
['values' => ['naam' => 'Bart', 'email' => 'bart@example.nl']],
|
||||
)->assertOk();
|
||||
|
||||
$this->postJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}/submit",
|
||||
[
|
||||
'public_submitter_name' => 'Submit Name',
|
||||
'public_submitter_email' => 'submit@test.nl',
|
||||
],
|
||||
)->assertCreated();
|
||||
|
||||
$fresh = $submission->fresh();
|
||||
$this->assertSame('submitted', $fresh->status->value);
|
||||
$this->assertSame('Submit Name', $fresh->public_submitter_name);
|
||||
$this->assertSame('submit@test.nl', $fresh->public_submitter_email);
|
||||
}
|
||||
|
||||
public function test_submit_rejects_invalid_submitter_email(): void
|
||||
{
|
||||
$submission = $this->startDraft();
|
||||
|
||||
$response = $this->postJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}/submit",
|
||||
[
|
||||
'values' => ['naam' => 'Bart', 'email' => 'bart@example.nl'],
|
||||
'public_submitter_email' => 'not-an-email',
|
||||
],
|
||||
);
|
||||
|
||||
$response->assertStatus(422);
|
||||
$this->assertSame('VALIDATION_FAILED', $response->json('code'));
|
||||
$this->assertArrayHasKey('public_submitter_email', $response->json('errors'));
|
||||
}
|
||||
|
||||
public function test_submit_rejects_overlong_submitter_name(): void
|
||||
{
|
||||
$submission = $this->startDraft();
|
||||
|
||||
$response = $this->postJson(
|
||||
"/api/v1/public/forms/{$this->schema->public_token}/submissions/{$submission->id}/submit",
|
||||
[
|
||||
'values' => ['naam' => 'Bart', 'email' => 'bart@example.nl'],
|
||||
'public_submitter_name' => str_repeat('a', 151),
|
||||
],
|
||||
);
|
||||
|
||||
$response->assertStatus(422);
|
||||
$this->assertSame('VALIDATION_FAILED', $response->json('code'));
|
||||
$this->assertArrayHasKey('public_submitter_name', $response->json('errors'));
|
||||
}
|
||||
|
||||
private function startDraft(): FormSubmission
|
||||
{
|
||||
$response = $this->postJson(
|
||||
|
||||
Reference in New Issue
Block a user