create(); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); FormFieldBinding::factory()->forField($field)->entityOwned('person', 'email')->create([ 'merge_strategy' => FormFieldBindingMergeStrategy::Overwrite->value, ]); $schema->load('fields.bindings'); $result = $this->guard()->evaluate($schema); $this->assertTrue($result->passed); } public function test_fails_with_scalar_target_reason(): void { $schema = FormSchema::factory()->create(); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); FormFieldBinding::factory()->forField($field)->entityOwned('person', 'email')->create([ 'merge_strategy' => FormFieldBindingMergeStrategy::Append->value, ]); $schema->load('fields.bindings'); $result = $this->guard()->evaluate($schema); $this->assertFalse($result->passed); $this->assertSame('scalar_target', $result->context['reason']); } public function test_passes_with_collection_target(): void { // Sessie 3a.5: v1 registry has no collection targets in any // production entity. Inject a synthetic collection target via // Config::set so the guard's collection-allowed branch stays // under test. Tracked: BACKLOG FORM-BINDING-JSON-PATH. config()->set('form_builder.binding_targets.test_entity', [ 'tags' => ['type' => 'collection', 'php' => 'array', 'identity_key_eligible' => false], ]); $schema = FormSchema::factory()->create(); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); FormFieldBinding::factory()->forField($field)->entityOwned('test_entity', 'tags')->create([ 'merge_strategy' => FormFieldBindingMergeStrategy::Append->value, ]); $schema->load('fields.bindings'); $result = $this->guard()->evaluate($schema); $this->assertTrue($result->passed); } public function test_fails_with_unknown_target_reason(): void { $schema = FormSchema::factory()->create(); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); FormFieldBinding::factory()->forField($field)->entityOwned('person', 'unknown_attr')->create([ 'merge_strategy' => FormFieldBindingMergeStrategy::Append->value, ]); $schema->load('fields.bindings'); $result = $this->guard()->evaluate($schema); $this->assertFalse($result->passed); $this->assertSame('unknown_target', $result->context['reason']); } private function guard(): AppendStrategyRequiresCollectionTarget { return new AppendStrategyRequiresCollectionTarget( $this->app->make(BindingTypeRegistry::class), ); } }