|
5 | 5 | use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; |
6 | 6 | use GraphQL\Deferred; |
7 | 7 | use GraphQL\GraphQL; |
| 8 | +use GraphQL\Language\AST\DocumentNode; |
8 | 9 | use GraphQL\Tests\Executor\TestClasses\Cat; |
9 | 10 | use GraphQL\Tests\Executor\TestClasses\Dog; |
10 | 11 | use GraphQL\Tests\PsrValidationCacheAdapter; |
|
16 | 17 | use Symfony\Component\Cache\Adapter\ArrayAdapter; |
17 | 18 | use Symfony\Component\Cache\Psr16Cache; |
18 | 19 |
|
| 20 | +final class SpyValidationCacheAdapter extends PsrValidationCacheAdapter |
| 21 | +{ |
| 22 | + public int $isValidatedCalls = 0; |
| 23 | + public int $markValidatedCalls = 0; |
| 24 | + |
| 25 | + public function isValidated(Schema $schema, DocumentNode $ast): bool |
| 26 | + { |
| 27 | + $this->isValidatedCalls++; |
| 28 | + return parent::isValidated($schema, $ast); |
| 29 | + } |
| 30 | + |
| 31 | + public function markValidated(Schema $schema, DocumentNode $ast): void |
| 32 | + { |
| 33 | + $this->markValidatedCalls++; |
| 34 | + parent::markValidated($schema, $ast); |
| 35 | + } |
| 36 | +} |
| 37 | + |
| 38 | + |
19 | 39 | final class ValidationWithCacheTest extends TestCase |
20 | 40 | { |
21 | 41 | use ArraySubsetAsserts; |
22 | 42 |
|
23 | 43 | public function testIsValidationCachedWithAdapter(): void |
24 | 44 | { |
25 | | - $cache = new PsrValidationCacheAdapter(new Psr16Cache(new ArrayAdapter())); |
| 45 | + $cache = new SpyValidationCacheAdapter(new Psr16Cache(new ArrayAdapter())); |
26 | 46 | $petType = new InterfaceType([ |
27 | 47 | 'name' => 'Pet', |
28 | 48 | 'fields' => [ |
@@ -78,11 +98,14 @@ public function testIsValidationCachedWithAdapter(): void |
78 | 98 | } |
79 | 99 | }'; |
80 | 100 |
|
| 101 | + // make the same call twice in a row. We'll then inspect the cache object to count calls |
81 | 102 | GraphQL::executeQuery( $schema, $query, null, null, null, null, null, null, $cache)->toArray(); |
82 | | - |
83 | | - // TODO: use a spy or something to prove that the validation only happens once |
84 | 103 | $result = GraphQL::executeQuery( $schema, $query, null, null, null, null, null, null, $cache)->toArray(); |
85 | 104 |
|
| 105 | + // ✅ Assert that validation only happened once |
| 106 | + self::assertEquals(2, $cache->isValidatedCalls, 'Should check cache twice'); |
| 107 | + self::assertEquals(1, $cache->markValidatedCalls, 'Should mark as validated once'); |
| 108 | + |
86 | 109 | $expected = [ |
87 | 110 | 'data' => [ |
88 | 111 | 'pets' => [ |
|
0 commit comments