| Q |
A |
| API Platform version |
4.3, 4.4, main |
| PHP version |
8.4 / 8.5 |
ResourceMetadataCompatibilityTest fails as soon as ApiPlatform\Elasticsearch\State\Options is autoloadable, which is the case for anyone running the component tests from the monorepo root:
$ vendor/bin/phpunit src/Metadata/Tests/Extractor/ResourceMetadataCompatibilityTest.php
There were 2 failures:
1) …::testValidMetadata#0 with data ('…XmlResourceExtractor', …XmlResourceAdapter)
Failed asserting that two objects are equal.
- 'stateOptions' => null
+ 'stateOptions' => ApiPlatform\Elasticsearch\State\Options Object (...)
Both data sets fail, and the rendered diff also shows unrelated keys such as strictQueryParameterValidation, which sends you looking in the wrong place — removing src/Elasticsearch/State/Options.php makes the whole test green again, so stateOptions is the only real difference.
Cause
The fixture declares stateOptions: {elasticsearchOptions: {index: foo_index}}, and both extractors build the real object when the component is installed:
// src/Metadata/Extractor/XmlResourceExtractor.php:477
if (isset($stateOptions->elasticsearchOptions) && class_exists(ElasticsearchOptions::class)) {
return new ElasticsearchOptions(...);
}
The expectation, on the other hand, returns null unconditionally:
// src/Metadata/Tests/Extractor/ResourceMetadataCompatibilityTest.php:731
case 'elasticsearchOptions':
return null;
So the assertion only holds when api-platform/elasticsearch is absent. CI never notices, because phpunit-components runs each component from its own directory with its own vendor/, where the class does not exist. $configuration is even read and then unused, which suggests the null was a placeholder.
Beyond the failure, this means the elasticsearchOptions branch of buildStateOptions() has no assertion on it in any environment.
Fix
Mirror the extractors: build the options when the class exists, keep returning null otherwise. The test then passes both from the monorepo root and in the isolated component job. PR follows.
ResourceMetadataCompatibilityTestfails as soon asApiPlatform\Elasticsearch\State\Optionsis autoloadable, which is the case for anyone running the component tests from the monorepo root:Both data sets fail, and the rendered diff also shows unrelated keys such as
strictQueryParameterValidation, which sends you looking in the wrong place — removingsrc/Elasticsearch/State/Options.phpmakes the whole test green again, sostateOptionsis the only real difference.Cause
The fixture declares
stateOptions: {elasticsearchOptions: {index: foo_index}}, and both extractors build the real object when the component is installed:The expectation, on the other hand, returns
nullunconditionally:So the assertion only holds when
api-platform/elasticsearchis absent. CI never notices, becausephpunit-componentsruns each component from its own directory with its ownvendor/, where the class does not exist.$configurationis even read and then unused, which suggests thenullwas a placeholder.Beyond the failure, this means the
elasticsearchOptionsbranch ofbuildStateOptions()has no assertion on it in any environment.Fix
Mirror the extractors: build the options when the class exists, keep returning
nullotherwise. The test then passes both from the monorepo root and in the isolated component job. PR follows.