schemaWithSnapshot(); $field = FormField::factory()->create([ 'form_schema_id' => $schema->id, 'field_type' => FormFieldType::EMAIL->value, 'slug' => 'email', 'label' => 'E-mail', ]); $binding = FormFieldBinding::factory()->forField($field)->entityOwned('person', 'email')->create(); $submission = $this->submitFor($schema); $snapshot = $submission->fresh()->schema_snapshot; $this->assertIsArray($snapshot); $embedded = collect($snapshot['fields'])->firstWhere('id', $field->id); $this->assertNotNull($embedded); $this->assertArrayNotHasKey('binding', $embedded); $this->assertCount(1, $embedded['bindings']); $shape = $embedded['bindings'][0]; $this->assertSame((string) $binding->id, $shape['id']); $this->assertSame('entity_owned', $shape['mode']); $this->assertSame('person', $shape['entity']); $this->assertSame('email', $shape['column']); $this->assertSame('overwrite', $shape['merge_strategy']); $this->assertSame(50, $shape['trust_level']); $this->assertFalse($shape['is_identity_key']); } public function test_snapshot_embeds_mirrored_binding_with_sync_direction(): void { $schema = $this->schemaWithSnapshot(); $field = FormField::factory()->create([ 'form_schema_id' => $schema->id, 'field_type' => FormFieldType::TEXT->value, 'slug' => 'noodcontact', 'label' => 'Noodcontact', ]); FormFieldBinding::factory()->forField($field)->mirrored('user_profile', 'emergency_contact_name')->create(); $submission = $this->submitFor($schema); $snapshot = $submission->fresh()->schema_snapshot; $embedded = collect($snapshot['fields'])->firstWhere('id', $field->id); $this->assertCount(1, $embedded['bindings']); $shape = $embedded['bindings'][0]; $this->assertSame('mirrored', $shape['mode']); $this->assertSame('user_profile', $shape['entity']); $this->assertSame('emergency_contact_name', $shape['column']); $this->assertSame('write_on_submit', $shape['sync_direction']); } public function test_snapshot_embeds_empty_bindings_for_form_owned_field(): void { $schema = $this->schemaWithSnapshot(); $field = FormField::factory()->create([ 'form_schema_id' => $schema->id, 'field_type' => FormFieldType::TEXT->value, 'slug' => 'motivatie', 'label' => 'Motivatie', ]); $submission = $this->submitFor($schema); $snapshot = $submission->fresh()->schema_snapshot; $embedded = collect($snapshot['fields'])->firstWhere('id', $field->id); $this->assertSame([], $embedded['bindings']); $this->assertArrayNotHasKey('binding', $embedded); } private function schemaWithSnapshot(): FormSchema { $org = Organisation::factory()->create(); return FormSchema::factory()->create([ 'organisation_id' => $org->id, 'purpose' => FormPurpose::USER_PROFILE->value, 'snapshot_mode' => FormSchemaSnapshotMode::ALWAYS->value, ]); } private function submitFor(FormSchema $schema): FormSubmission { $user = User::factory()->create(); $service = $this->app->make(FormSubmissionService::class); $submission = $service->createDraft($schema, $user, $user); return $service->submit($submission, $user); } }