-
Notifications
You must be signed in to change notification settings - Fork 52
Description
For my use case I'm encountering challenges importing schemas that contain a lot of references, so I wanted to try an approach where I would import the schema initially without resolving references and get those filled in later. Unfortunately, I found that even if I set the dereference option to false in the context, references are still attempting to be resolved. Below is a test example I put together to demonstrate:
<?php
/**
* Integration test for expected behavior from schemas.
*
* @coversNothing
*/
class SchemaIntegrationTest extends UnitTestCase {
use ProphecyTrait;
protected string $schemaWithReferenceJson = <<<JSON
{
"\$schema": "http://json-schema.org/draft-04/schema#",
"category": "test",
"title": "Schema with reference",
"type": "object",
"format": "grid",
"properties": {
"reference_property": {
"\$ref": "my/example/reference"
}
}
}
JSON;
/**
* Test schema dereferencing behavior.
*/
public function testSchemaDereferencing() {
/** @var \Swaggest\JsonSchema\RemoteRefProvider $refProvider */
$refProvider = $this->prophesize(RemoteRefProvider::class);
$refProvider->getSchemaData('my/example/reference')
->willReturn((object) [])
->shouldNotBeCalled();
$context = new Context();
$context->setRemoteRefProvider($refProvider->reveal());
$context->dereference = FALSE;
$schema_data = json_decode($this->schemaWithReferenceJson);
$schema = Schema::import($schema_data, $context);
$schema_output = json_encode($schema);
$this->assertStringContainsString('my/example/reference', $schema_output);
}
}This test fails with the following output:
Failed asserting that '{"$schema":"http://json-schema.org/draft-04/schema#","title":"Schema with reference","properties":{"reference_property":{}},"type":"object","format":"grid","category":"test"}' contains "my/example/reference".
If I comment out the final assertion that causes the test to fail immediately, I get the following output from the Prophecy prediction checks confirming that the ref provider was called:
Some predictions failed:
Double\RemoteRefProvider\P1:
No calls expected that match:
Double\RemoteRefProvider\P1->getSchemaData(exact("my/example/reference"))
but 1 was made:
- getSchemaData("my/example/reference") @ vendor/swaggest/json-schema/src/RefResolver.php:196
/var/www/html/vendor/phpspec/prophecy-phpunit/src/ProphecyTrait.php:61
/var/www/html/vendor/phpunit/phpunit/src/Framework/TestResult.php:726
/var/www/html/vendor/phpunit/phpunit/src/Framework/TestSuite.php:670
/var/www/html/vendor/phpunit/phpunit/src/Framework/TestSuite.php:670
/var/www/html/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:673
/var/www/html/vendor/phpunit/phpunit/src/TextUI/Command.php:143
/var/www/html/vendor/phpunit/phpunit/src/TextUI/Command.php:96