From dde4f4c5c324caa62a54af0f706ca47cc97bf67b Mon Sep 17 00:00:00 2001 From: "amelie.haladjian" Date: Mon, 18 Aug 2025 11:53:34 +0200 Subject: [PATCH] feat(api tester): handle new baseline for response schema validation --- src/Config/Filters.php | 31 +++++++++++- src/Preparator/TestCasesPreparator.php | 19 +++++++- src/Test/Suite.php | 1 + .../Config/schema-validation-baseline.yaml | 2 + tests/Preparator/ExamplesPreparatorTest.php | 48 +++++++++++++++++++ 5 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 tests/Fixtures/Config/schema-validation-baseline.yaml diff --git a/src/Config/Filters.php b/src/Config/Filters.php index 05805491..ea1f0f44 100644 --- a/src/Config/Filters.php +++ b/src/Config/Filters.php @@ -10,6 +10,8 @@ final class Filters { + public string $schemaValidationBaseline = 'api-tester.schema-baseline.yaml'; + /** * @var array> */ @@ -26,11 +28,16 @@ final class Filters * @param array> $include * @param array> $exclude */ - public function __construct(?array $include = null, ?array $exclude = null, string $baseline = null) - { + public function __construct( + ?array $include = null, + ?array $exclude = null, + string $baseline = null, + string $schemaValidationBaseline = null + ) { $this->include = $include ?? []; $this->exclude = $exclude ?? []; $this->baseline = $baseline ?? $this->baseline; + $this->schemaValidationBaseline = $schemaValidationBaseline ?? $this->schemaValidationBaseline; } /** @@ -68,6 +75,26 @@ public function getBaseLineExclude(): array return $baseline['exclude']; } + /** + * @return array + */ + public function getSchemaValidationBaseline(): array + { + if (!file_exists($this->schemaValidationBaseline)) { + return []; + } + + /** @var array{'exclude': ?array} */ + $baseline = Yaml::parseFile($this->schemaValidationBaseline); + + if (!isset($baseline['exclude'])) { + return []; + } + + /** @var array */ + return $baseline['exclude']; + } + public function getBaseline(): string { return $this->baseline; diff --git a/src/Preparator/TestCasesPreparator.php b/src/Preparator/TestCasesPreparator.php index 097c0707..51399d3d 100644 --- a/src/Preparator/TestCasesPreparator.php +++ b/src/Preparator/TestCasesPreparator.php @@ -30,11 +30,17 @@ abstract class TestCasesPreparator protected LoggerInterface $logger; + /** + * @var array + */ + protected array $schemaValidationBaseline; + public function __construct() { $this->tokens = new Tokens(); $this->config = $this->newConfigInstance(static::getConfigFQCN()); $this->logger = new NullLogger(); + $this->schemaValidationBaseline = []; } /** @@ -85,7 +91,10 @@ final public function doPrepare(Operations $operations): iterable $testCases = $this->prepare($operations); foreach ($testCases as $testCase) { $testCase->addExcludedFields($this->config->excludedFields); - $testCase->setSchemaValidation($this->config->schemaValidation); + if (!$this->config->schemaValidation + || in_array($testCase->getOperation(), $this->schemaValidationBaseline, true)) { + $testCase->setSchemaValidation(false); + } } return $testCases; @@ -130,6 +139,14 @@ final public function setLogger(LoggerInterface $logger): void $this->logger = $logger; } + /** + * @param array $schemaValidationBaseline + */ + final public function setSchemaValidationBaseline(array $schemaValidationBaseline): void + { + $this->schemaValidationBaseline = $schemaValidationBaseline; + } + /** * @return class-string */ diff --git a/src/Test/Suite.php b/src/Test/Suite.php index 6d17aa12..54198980 100644 --- a/src/Test/Suite.php +++ b/src/Test/Suite.php @@ -148,6 +148,7 @@ private function prepareTestCases(): void $allTests = collect(); foreach ($this->preparators as $preparator) { $preparator->setLogger($this->logger); + $preparator->setSchemaValidationBaseline($this->filters->getSchemaValidationBaseline()); $operations = $this->api->getOperations() ->map( static fn (Operation $op) => $op->setPreparator($preparator::getName()) diff --git a/tests/Fixtures/Config/schema-validation-baseline.yaml b/tests/Fixtures/Config/schema-validation-baseline.yaml new file mode 100644 index 00000000..875f15cd --- /dev/null +++ b/tests/Fixtures/Config/schema-validation-baseline.yaml @@ -0,0 +1,2 @@ +exclude: + - 'operationIdInBaseline' diff --git a/tests/Preparator/ExamplesPreparatorTest.php b/tests/Preparator/ExamplesPreparatorTest.php index 0d7be7c7..3d96045e 100644 --- a/tests/Preparator/ExamplesPreparatorTest.php +++ b/tests/Preparator/ExamplesPreparatorTest.php @@ -441,6 +441,54 @@ public function getExpectedTestSuites(): iterable ]; } + public function testSchemaValidationDisabledForBaselineOperation(): void + { + $preparator = new ExamplesPreparator(); + + $preparator->configure([ + 'schemaValidation' => true, + ]); + + $api = Api::create()->addOperation( + Operation::create('operationIdInBaseline', '/test') + ->addQueryParameter( + Parameter::create('foo') + ->setSchema( + new Schema([ + 'type' => 'string', + ]) + ) + ) + ->addResponse(DefinitionResponse::create(200)) + ->addExample( + OperationExample::create('200.default') + ->setQueryParameters([ + 'foo' => 'bar', + ]) + ->setResponse(new ResponseExample()) + ) + ); + $filters = new Filters( + schemaValidationBaseline: __DIR__ . '/../../tests/Fixtures/Config/schema-validation-baseline.yaml' + ); + $preparator->setSchemaValidationBaseline($filters->getSchemaValidationBaseline()); + + Assert::objectsEqual( + [ + new TestCase( + ExamplesPreparator::getName() . ' - operationIdInBaseline - 200.default', + OperationExample::create('operationIdInBaseline') + ->setPath('/test') + ->setQueryParameter('foo', 'bar') + ->setResponse(ResponseExample::create('200')), + schemaValidation: false + ), + ], + $preparator->doPrepare($api->getOperations()), + ['parent'] + ); + } + private function addTokens(ExamplesPreparator $preparator): void { $preparator->addToken(