Skip to content

Commit

Permalink
Merge pull request #219 from moufmouf/errors_on_bad_namespace
Browse files Browse the repository at this point in the history
Strengthening tests by throwing exceptions if a cache error occurs
  • Loading branch information
moufmouf authored Jan 13, 2020
2 parents 528ceb1 + 6386e43 commit 4fe8fcb
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 8 deletions.
15 changes: 12 additions & 3 deletions tests/AbstractQueryProviderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use phpDocumentor\Reflection\TypeResolver as PhpDocumentorTypeResolver;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
use SplFileInfo;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\Psr16Adapter;
use Symfony\Component\Cache\Psr16Cache;
Expand All @@ -25,6 +26,7 @@
use TheCodingMachine\GraphQLite\Fixtures\TestObject;
use TheCodingMachine\GraphQLite\Fixtures\TestObject2;
use TheCodingMachine\GraphQLite\Fixtures\Types\TestFactory;
use TheCodingMachine\GraphQLite\Loggers\ExceptionLogger;
use TheCodingMachine\GraphQLite\Mappers\CannotMapTypeException;
use TheCodingMachine\GraphQLite\Mappers\CannotMapTypeExceptionInterface;
use TheCodingMachine\GraphQLite\Mappers\Parameters\ResolveInfoParameterHandler;
Expand Down Expand Up @@ -121,6 +123,9 @@ protected function getInputTestObjectType(): MockResolvableInputObjectType
protected function getTypeMapper()
{
if ($this->typeMapper === null) {
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());

$this->typeMapper = new RecursiveTypeMapper(new class($this->getTestObjectType(), $this->getTestObjectType2(), $this->getInputTestObjectType()/*, $this->getInputTestObjectType2()*/) implements TypeMapperInterface {
/**
* @var ObjectType
Expand Down Expand Up @@ -233,7 +238,7 @@ public function decorateInputTypeForName(string $typeName, ResolvableMutableInpu
throw CannotMapTypeException::createForDecorateName($typeName, $type);
}

}, new NamingStrategy(), new Psr16Cache(new ArrayAdapter()), $this->getTypeRegistry());
}, new NamingStrategy(), new Psr16Cache($arrayAdapter), $this->getTypeRegistry());
}
return $this->typeMapper;
}
Expand Down Expand Up @@ -282,12 +287,16 @@ protected function getParameterMiddlewarePipe(): ParameterMiddlewarePipe

protected function buildFieldsBuilder(): FieldsBuilder
{
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());
$psr16Cache = new Psr16Cache($arrayAdapter);

$fieldMiddlewarePipe = new FieldMiddlewarePipe();
$fieldMiddlewarePipe->pipe(new AuthorizationFieldMiddleware(
new VoidAuthenticationService(),
new VoidAuthorizationService()
));
$expressionLanguage = new ExpressionLanguage(new Psr16Adapter(new Psr16Cache(new ArrayAdapter())), [new SecurityExpressionLanguageProvider()]);
$expressionLanguage = new ExpressionLanguage(new Psr16Adapter($psr16Cache), [new SecurityExpressionLanguageProvider()]);
$fieldMiddlewarePipe->pipe(new SecurityFieldMiddleware($expressionLanguage, new VoidAuthenticationService(), new VoidAuthorizationService()));

$parameterMiddlewarePipe = new ParameterMiddlewarePipe();
Expand All @@ -298,7 +307,7 @@ protected function buildFieldsBuilder(): FieldsBuilder
$this->getTypeMapper(),
$this->getArgumentResolver(),
$this->getTypeResolver(),
new CachedDocBlockFactory(new Psr16Cache(new ArrayAdapter())),
new CachedDocBlockFactory($psr16Cache),
new NamingStrategy(),
$this->buildRootTypeMapper(),
$this->getParameterMiddlewarePipe(),
Expand Down
21 changes: 16 additions & 5 deletions tests/Integration/EndToEndTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use TheCodingMachine\GraphQLite\GraphQLRuntimeException;
use TheCodingMachine\GraphQLite\InputTypeGenerator;
use TheCodingMachine\GraphQLite\InputTypeUtils;
use TheCodingMachine\GraphQLite\Loggers\ExceptionLogger;
use TheCodingMachine\GraphQLite\Mappers\CannotMapTypeException;
use TheCodingMachine\GraphQLite\Mappers\CompositeTypeMapper;
use TheCodingMachine\GraphQLite\Mappers\GlobTypeMapper;
Expand Down Expand Up @@ -140,17 +141,21 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
return new VoidAuthenticationService();
},
RecursiveTypeMapperInterface::class => function(ContainerInterface $container) {
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());
return new RecursiveTypeMapper(
$container->get(TypeMapperInterface::class),
$container->get(NamingStrategyInterface::class),
new Psr16Cache(new ArrayAdapter()),
new Psr16Cache($arrayAdapter),
$container->get(TypeRegistry::class)
);
},
TypeMapperInterface::class => function(ContainerInterface $container) {
return new CompositeTypeMapper();
},
GlobTypeMapper::class => function(ContainerInterface $container) {
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());
return new GlobTypeMapper('TheCodingMachine\\GraphQLite\\Fixtures\\Integration\\Types',
$container->get(TypeGenerator::class),
$container->get(InputTypeGenerator::class),
Expand All @@ -159,10 +164,12 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
$container->get(AnnotationReader::class),
$container->get(NamingStrategyInterface::class),
$container->get(RecursiveTypeMapperInterface::class),
new Psr16Cache(new ArrayAdapter())
new Psr16Cache($arrayAdapter)
);
},
GlobTypeMapper::class.'2' => function(ContainerInterface $container) {
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());
return new GlobTypeMapper('TheCodingMachine\\GraphQLite\\Fixtures\\Integration\\Models',
$container->get(TypeGenerator::class),
$container->get(InputTypeGenerator::class),
Expand All @@ -171,7 +178,7 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
$container->get(AnnotationReader::class),
$container->get(NamingStrategyInterface::class),
$container->get(RecursiveTypeMapperInterface::class),
new Psr16Cache(new ArrayAdapter())
new Psr16Cache($arrayAdapter)
);
},
PorpaginasTypeMapper::class => function(ContainerInterface $container) {
Expand Down Expand Up @@ -209,7 +216,9 @@ public function createContainer(array $overloadedServices = []): ContainerInterf
return new NamingStrategy();
},
CachedDocBlockFactory::class => function() {
return new CachedDocBlockFactory(new Psr16Cache(new ArrayAdapter()));
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());
return new CachedDocBlockFactory(new Psr16Cache($arrayAdapter));
},
RootTypeMapperInterface::class => function(ContainerInterface $container) {
return new NullableTypeMapperAdapter();
Expand Down Expand Up @@ -1369,7 +1378,9 @@ public function getUser(): ?object

public function testInputOutputNameConflict(): void
{
$schemaFactory = new SchemaFactory(new Psr16Cache(new ArrayAdapter()), new BasicAutoWiringContainer(new EmptyContainer()));
$arrayAdapter = new ArrayAdapter();
$arrayAdapter->setLogger(new ExceptionLogger());
$schemaFactory = new SchemaFactory(new Psr16Cache($arrayAdapter), new BasicAutoWiringContainer(new EmptyContainer()));
$schemaFactory->addControllerNamespace('TheCodingMachine\\GraphQLite\\Fixtures\\InputOutputNameConflict\\Controllers');
$schemaFactory->addTypeNamespace('TheCodingMachine\\GraphQLite\\Fixtures\\InputOutputNameConflict\\Types');

Expand Down
30 changes: 30 additions & 0 deletions tests/Loggers/ExceptionLogger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php


namespace TheCodingMachine\GraphQLite\Loggers;


use Psr\Log\AbstractLogger;
use Psr\Log\LogLevel;
use Throwable;
use function in_array;

/**
* A logger that throws an exception on WARN, ERROR, FATAL.
* Useful to detect errors in PSR-16 caches (that never throw exceptions but that log things)
*/
class ExceptionLogger extends AbstractLogger
{
/**
* @inheritDoc
*/
public function log($level, $message, array $context = array())
{
if (in_array($level, [LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR, LogLevel::WARNING])) {
if (isset($context['exception']) && $context['exception'] instanceof Throwable) {
throw $context['exception'];
}
throw new \Exception($message);
}
}
}

0 comments on commit 4fe8fcb

Please sign in to comment.