Skip to content

Commit 6386e43

Browse files
committed
Strengthening tests by throwing exceptions if a cache error occurs
1 parent 01ffe2b commit 6386e43

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

tests/AbstractQueryProviderTest.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use phpDocumentor\Reflection\TypeResolver as PhpDocumentorTypeResolver;
1717
use PHPUnit\Framework\TestCase;
1818
use Psr\Container\ContainerInterface;
19+
use SplFileInfo;
1920
use Symfony\Component\Cache\Adapter\ArrayAdapter;
2021
use Symfony\Component\Cache\Adapter\Psr16Adapter;
2122
use Symfony\Component\Cache\Psr16Cache;
@@ -25,6 +26,7 @@
2526
use TheCodingMachine\GraphQLite\Fixtures\TestObject;
2627
use TheCodingMachine\GraphQLite\Fixtures\TestObject2;
2728
use TheCodingMachine\GraphQLite\Fixtures\Types\TestFactory;
29+
use TheCodingMachine\GraphQLite\Loggers\ExceptionLogger;
2830
use TheCodingMachine\GraphQLite\Mappers\CannotMapTypeException;
2931
use TheCodingMachine\GraphQLite\Mappers\CannotMapTypeExceptionInterface;
3032
use TheCodingMachine\GraphQLite\Mappers\Parameters\ResolveInfoParameterHandler;
@@ -121,6 +123,9 @@ protected function getInputTestObjectType(): MockResolvableInputObjectType
121123
protected function getTypeMapper()
122124
{
123125
if ($this->typeMapper === null) {
126+
$arrayAdapter = new ArrayAdapter();
127+
$arrayAdapter->setLogger(new ExceptionLogger());
128+
124129
$this->typeMapper = new RecursiveTypeMapper(new class($this->getTestObjectType(), $this->getTestObjectType2(), $this->getInputTestObjectType()/*, $this->getInputTestObjectType2()*/) implements TypeMapperInterface {
125130
/**
126131
* @var ObjectType
@@ -233,7 +238,7 @@ public function decorateInputTypeForName(string $typeName, ResolvableMutableInpu
233238
throw CannotMapTypeException::createForDecorateName($typeName, $type);
234239
}
235240

236-
}, new NamingStrategy(), new Psr16Cache(new ArrayAdapter()), $this->getTypeRegistry());
241+
}, new NamingStrategy(), new Psr16Cache($arrayAdapter), $this->getTypeRegistry());
237242
}
238243
return $this->typeMapper;
239244
}
@@ -282,12 +287,16 @@ protected function getParameterMiddlewarePipe(): ParameterMiddlewarePipe
282287

283288
protected function buildFieldsBuilder(): FieldsBuilder
284289
{
290+
$arrayAdapter = new ArrayAdapter();
291+
$arrayAdapter->setLogger(new ExceptionLogger());
292+
$psr16Cache = new Psr16Cache($arrayAdapter);
293+
285294
$fieldMiddlewarePipe = new FieldMiddlewarePipe();
286295
$fieldMiddlewarePipe->pipe(new AuthorizationFieldMiddleware(
287296
new VoidAuthenticationService(),
288297
new VoidAuthorizationService()
289298
));
290-
$expressionLanguage = new ExpressionLanguage(new Psr16Adapter(new Psr16Cache(new ArrayAdapter())), [new SecurityExpressionLanguageProvider()]);
299+
$expressionLanguage = new ExpressionLanguage(new Psr16Adapter($psr16Cache), [new SecurityExpressionLanguageProvider()]);
291300
$fieldMiddlewarePipe->pipe(new SecurityFieldMiddleware($expressionLanguage, new VoidAuthenticationService(), new VoidAuthorizationService()));
292301

293302
$parameterMiddlewarePipe = new ParameterMiddlewarePipe();
@@ -298,7 +307,7 @@ protected function buildFieldsBuilder(): FieldsBuilder
298307
$this->getTypeMapper(),
299308
$this->getArgumentResolver(),
300309
$this->getTypeResolver(),
301-
new CachedDocBlockFactory(new Psr16Cache(new ArrayAdapter())),
310+
new CachedDocBlockFactory($psr16Cache),
302311
new NamingStrategy(),
303312
$this->buildRootTypeMapper(),
304313
$this->getParameterMiddlewarePipe(),

tests/Integration/EndToEndTest.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use TheCodingMachine\GraphQLite\GraphQLRuntimeException;
2222
use TheCodingMachine\GraphQLite\InputTypeGenerator;
2323
use TheCodingMachine\GraphQLite\InputTypeUtils;
24+
use TheCodingMachine\GraphQLite\Loggers\ExceptionLogger;
2425
use TheCodingMachine\GraphQLite\Mappers\CannotMapTypeException;
2526
use TheCodingMachine\GraphQLite\Mappers\CompositeTypeMapper;
2627
use TheCodingMachine\GraphQLite\Mappers\GlobTypeMapper;
@@ -140,17 +141,21 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
140141
return new VoidAuthenticationService();
141142
},
142143
RecursiveTypeMapperInterface::class => function(ContainerInterface $container) {
144+
$arrayAdapter = new ArrayAdapter();
145+
$arrayAdapter->setLogger(new ExceptionLogger());
143146
return new RecursiveTypeMapper(
144147
$container->get(TypeMapperInterface::class),
145148
$container->get(NamingStrategyInterface::class),
146-
new Psr16Cache(new ArrayAdapter()),
149+
new Psr16Cache($arrayAdapter),
147150
$container->get(TypeRegistry::class)
148151
);
149152
},
150153
TypeMapperInterface::class => function(ContainerInterface $container) {
151154
return new CompositeTypeMapper();
152155
},
153156
GlobTypeMapper::class => function(ContainerInterface $container) {
157+
$arrayAdapter = new ArrayAdapter();
158+
$arrayAdapter->setLogger(new ExceptionLogger());
154159
return new GlobTypeMapper('TheCodingMachine\\GraphQLite\\Fixtures\\Integration\\Types',
155160
$container->get(TypeGenerator::class),
156161
$container->get(InputTypeGenerator::class),
@@ -159,10 +164,12 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
159164
$container->get(AnnotationReader::class),
160165
$container->get(NamingStrategyInterface::class),
161166
$container->get(RecursiveTypeMapperInterface::class),
162-
new Psr16Cache(new ArrayAdapter())
167+
new Psr16Cache($arrayAdapter)
163168
);
164169
},
165170
GlobTypeMapper::class.'2' => function(ContainerInterface $container) {
171+
$arrayAdapter = new ArrayAdapter();
172+
$arrayAdapter->setLogger(new ExceptionLogger());
166173
return new GlobTypeMapper('TheCodingMachine\\GraphQLite\\Fixtures\\Integration\\Models',
167174
$container->get(TypeGenerator::class),
168175
$container->get(InputTypeGenerator::class),
@@ -171,7 +178,7 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
171178
$container->get(AnnotationReader::class),
172179
$container->get(NamingStrategyInterface::class),
173180
$container->get(RecursiveTypeMapperInterface::class),
174-
new Psr16Cache(new ArrayAdapter())
181+
new Psr16Cache($arrayAdapter)
175182
);
176183
},
177184
PorpaginasTypeMapper::class => function(ContainerInterface $container) {
@@ -209,7 +216,9 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
209216
return new NamingStrategy();
210217
},
211218
CachedDocBlockFactory::class => function() {
212-
return new CachedDocBlockFactory(new Psr16Cache(new ArrayAdapter()));
219+
$arrayAdapter = new ArrayAdapter();
220+
$arrayAdapter->setLogger(new ExceptionLogger());
221+
return new CachedDocBlockFactory(new Psr16Cache($arrayAdapter));
213222
},
214223
RootTypeMapperInterface::class => function(ContainerInterface $container) {
215224
return new NullableTypeMapperAdapter();
@@ -1369,7 +1378,9 @@ public function getUser(): ?object
13691378

13701379
public function testInputOutputNameConflict(): void
13711380
{
1372-
$schemaFactory = new SchemaFactory(new Psr16Cache(new ArrayAdapter()), new BasicAutoWiringContainer(new EmptyContainer()));
1381+
$arrayAdapter = new ArrayAdapter();
1382+
$arrayAdapter->setLogger(new ExceptionLogger());
1383+
$schemaFactory = new SchemaFactory(new Psr16Cache($arrayAdapter), new BasicAutoWiringContainer(new EmptyContainer()));
13731384
$schemaFactory->addControllerNamespace('TheCodingMachine\\GraphQLite\\Fixtures\\InputOutputNameConflict\\Controllers');
13741385
$schemaFactory->addTypeNamespace('TheCodingMachine\\GraphQLite\\Fixtures\\InputOutputNameConflict\\Types');
13751386

tests/Loggers/ExceptionLogger.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
4+
namespace TheCodingMachine\GraphQLite\Loggers;
5+
6+
7+
use Psr\Log\AbstractLogger;
8+
use Psr\Log\LogLevel;
9+
use Throwable;
10+
use function in_array;
11+
12+
/**
13+
* A logger that throws an exception on WARN, ERROR, FATAL.
14+
* Useful to detect errors in PSR-16 caches (that never throw exceptions but that log things)
15+
*/
16+
class ExceptionLogger extends AbstractLogger
17+
{
18+
/**
19+
* @inheritDoc
20+
*/
21+
public function log($level, $message, array $context = array())
22+
{
23+
if (in_array($level, [LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR, LogLevel::WARNING])) {
24+
if (isset($context['exception']) && $context['exception'] instanceof Throwable) {
25+
throw $context['exception'];
26+
}
27+
throw new \Exception($message);
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)