From c75d78bcdffae807d13cad05f4869a8a8947439d Mon Sep 17 00:00:00 2001 From: Sztig Date: Fri, 22 May 2026 16:42:30 +0200 Subject: [PATCH 1/3] fixed preserving default value in buildSPIFieldDefinitionFromUpdateStruct when not set --- src/lib/Repository/Mapper/ContentTypeDomainMapper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/Repository/Mapper/ContentTypeDomainMapper.php b/src/lib/Repository/Mapper/ContentTypeDomainMapper.php index 9b8aff1b15..66424d7830 100644 --- a/src/lib/Repository/Mapper/ContentTypeDomainMapper.php +++ b/src/lib/Repository/Mapper/ContentTypeDomainMapper.php @@ -425,8 +425,9 @@ public function buildSPIFieldDefinitionFromUpdateStruct( $spiFieldDefinition->fieldTypeConstraints->validators = $validatorConfiguration; $spiFieldDefinition->fieldTypeConstraints->fieldSettings = $fieldSettings; + $defaultValue = $fieldDefinitionUpdateStruct->defaultValue ?? $fieldDefinition->defaultValue; $spiFieldDefinition->defaultValue = $fieldType->toPersistenceValue( - $fieldType->acceptValue($fieldDefinitionUpdateStruct->defaultValue) + $fieldType->acceptValue($defaultValue) ); return $spiFieldDefinition; From cbf40ccd333907903fc498e5b44ddde3040b179c Mon Sep 17 00:00:00 2001 From: Sztig Date: Fri, 22 May 2026 16:43:29 +0200 Subject: [PATCH 2/3] added test coverage for default value preservation in buildSPIFieldDefinitionFromUpdateStruct when not set --- .../Repository/ContentTypeServiceTest.php | 23 ++++ .../Mapper/ContentTypeDomainMapperTest.php | 109 ++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php diff --git a/tests/integration/Core/Repository/ContentTypeServiceTest.php b/tests/integration/Core/Repository/ContentTypeServiceTest.php index d5b47f6b9a..803b17b926 100644 --- a/tests/integration/Core/Repository/ContentTypeServiceTest.php +++ b/tests/integration/Core/Repository/ContentTypeServiceTest.php @@ -2440,6 +2440,29 @@ public function testUpdateFieldDefinitionWithEmptyStruct() ); } + public function testUpdateFieldDefinitionPreservesDefaultValueWhenNotInUpdateStruct(): void + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $contentTypeDraft = $this->createContentTypeDraft(); + $fieldDefinition = $contentTypeDraft->getFieldDefinition('body'); + + self::assertNotNull($fieldDefinition); + self::assertNotNull($fieldDefinition->defaultValue); + + $updateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $updateStruct->position = 100; + + $contentTypeService->updateFieldDefinition($contentTypeDraft, $fieldDefinition, $updateStruct); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft($contentTypeDraft->id); + $updatedFieldDefinition = $contentTypeDraft->getFieldDefinition('body'); + + self::assertNotNull($updatedFieldDefinition); + self::assertEquals($fieldDefinition->defaultValue, $updatedFieldDefinition->defaultValue); + self::assertSame(100, $updatedFieldDefinition->position); + } + /** * Test for the updateFieldDefinition() method with already defined field identifier. * diff --git a/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php b/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php new file mode 100644 index 0000000000..d184859b3b --- /dev/null +++ b/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php @@ -0,0 +1,109 @@ +fieldTypeRegistry = $this->createMock(FieldTypeRegistry::class); + + $this->mapper = new ContentTypeDomainMapper( + $this->createMock(SPITypeHandler::class), + $this->createMock(SPILanguageHandler::class), + $this->fieldTypeRegistry, + ); + } + + public function testBuildSPIFieldDefinitionFromUpdateStructPreservesDefaultValueWhenNotSet(): void + { + $existingDefaultValue = new TextLineValue('Foo'); + $persistedValue = new FieldValue(['data' => 'Foo']); + + $this->configureFieldTypeRegistry($existingDefaultValue, $persistedValue); + + $updateStruct = new FieldDefinitionUpdateStruct(); + $updateStruct->position = 100; + + $spiFieldDefinition = $this->mapper->buildSPIFieldDefinitionFromUpdateStruct( + $updateStruct, + $this->buildFieldDefinition($existingDefaultValue), + 'eng-GB' + ); + + self::assertSame($persistedValue, $spiFieldDefinition->defaultValue); + self::assertSame(100, $spiFieldDefinition->position); + } + + public function testBuildSPIFieldDefinitionFromUpdateStructOverridesDefaultValueWhenExplicitlySet(): void + { + $newDefaultValue = new TextLineValue('Bar'); + $persistedValue = new FieldValue(['data' => 'Bar']); + + $this->configureFieldTypeRegistry($newDefaultValue, $persistedValue); + + $updateStruct = new FieldDefinitionUpdateStruct(); + $updateStruct->defaultValue = $newDefaultValue; + + $spiFieldDefinition = $this->mapper->buildSPIFieldDefinitionFromUpdateStruct( + $updateStruct, + $this->buildFieldDefinition(new TextLineValue('Foo')), + 'eng-GB' + ); + + self::assertSame($persistedValue, $spiFieldDefinition->defaultValue); + } + + private function buildFieldDefinition(TextLineValue $defaultValue): FieldDefinition + { + return new FieldDefinition([ + 'id' => 1, + 'identifier' => 'my_name', + 'fieldTypeIdentifier' => 'ezstring', + 'defaultValue' => $defaultValue, + 'isTranslatable' => false, + 'isRequired' => false, + 'isInfoCollector' => false, + 'isThumbnail' => false, + 'isSearchable' => true, + 'position' => 1, + ]); + } + + private function configureFieldTypeRegistry(TextLineValue $expectedInput, FieldValue $persistedValue): void + { + $fieldType = $this->createMock(FieldTypeInterface::class); + $fieldType->method('validateValidatorConfiguration')->willReturn([]); + $fieldType->method('validateFieldSettings')->willReturn([]); + $fieldType->method('isSearchable')->willReturn(true); + $fieldType->expects(self::once())->method('acceptValue')->with($expectedInput)->willReturn($expectedInput); + $fieldType->expects(self::once())->method('toPersistenceValue')->with($expectedInput)->willReturn($persistedValue); + + $this->fieldTypeRegistry->method('getFieldType')->with('ezstring')->willReturn($fieldType); + } +} From 5b9b38117c21709085e3fb270107bc86f72bef1d Mon Sep 17 00:00:00 2001 From: Sztig Date: Mon, 25 May 2026 16:21:00 +0200 Subject: [PATCH 3/3] implemented suggested changes --- .../Core/Repository/ContentTypeServiceTest.php | 1 + .../Mapper/ContentTypeDomainMapperTest.php | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/integration/Core/Repository/ContentTypeServiceTest.php b/tests/integration/Core/Repository/ContentTypeServiceTest.php index 803b17b926..1bd52d800f 100644 --- a/tests/integration/Core/Repository/ContentTypeServiceTest.php +++ b/tests/integration/Core/Repository/ContentTypeServiceTest.php @@ -2450,6 +2450,7 @@ public function testUpdateFieldDefinitionPreservesDefaultValueWhenNotInUpdateStr self::assertNotNull($fieldDefinition); self::assertNotNull($fieldDefinition->defaultValue); + self::assertSame(2, $fieldDefinition->position); $updateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); $updateStruct->position = 100; diff --git a/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php b/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php index d184859b3b..9be69a9e88 100644 --- a/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php +++ b/tests/lib/Repository/Mapper/ContentTypeDomainMapperTest.php @@ -101,8 +101,16 @@ private function configureFieldTypeRegistry(TextLineValue $expectedInput, FieldV $fieldType->method('validateValidatorConfiguration')->willReturn([]); $fieldType->method('validateFieldSettings')->willReturn([]); $fieldType->method('isSearchable')->willReturn(true); - $fieldType->expects(self::once())->method('acceptValue')->with($expectedInput)->willReturn($expectedInput); - $fieldType->expects(self::once())->method('toPersistenceValue')->with($expectedInput)->willReturn($persistedValue); + $fieldType + ->expects(self::once()) + ->method('acceptValue') + ->with($expectedInput) + ->willReturn($expectedInput); + $fieldType + ->expects(self::once()) + ->method('toPersistenceValue') + ->with($expectedInput) + ->willReturn($persistedValue); $this->fieldTypeRegistry->method('getFieldType')->with('ezstring')->willReturn($fieldType); }