From dabde7e2e25c9b6d6c1f063f9332bbab7ffb9d31 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Thu, 18 Jan 2018 15:05:18 +1300 Subject: [PATCH] BUG Fix cors breaking if referer header is present BUG Prevent un-extendable config by shifting defaults into PHP BUG Remove dependency on Doctrine module breaking with --prefer-dist BUG Fix tests not checking cors port ENHANCEMENT Clean up Controller::index() method and make lovely ENHANCEMENT Optimise all imports Fixes #118 --- _config/config.yml | 14 - examples/code/MemberTypeCreator.php | 2 +- .../code/PaginatedReadMembersQueryCreator.php | 2 +- examples/code/Post.php | 4 +- examples/code/ReadMembersQueryCreator.php | 2 +- src/Controller.php | 247 ++++++++++++------ src/FieldCreator.php | 2 +- src/Manager.php | 16 +- src/OperationResolver.php | 2 +- src/Pagination/Connection.php | 12 +- src/Pagination/PageInfoTypeCreator.php | 2 +- src/Pagination/PaginatedQueryCreator.php | 2 +- src/Pagination/SortInputTypeCreator.php | 4 +- .../Extensions/TypeCreatorExtension.php | 10 +- .../Scaffolders/ArgumentScaffolder.php | 2 +- src/Scaffolding/Scaffolders/CRUD/Create.php | 8 +- src/Scaffolding/Scaffolders/CRUD/Delete.php | 8 +- src/Scaffolding/Scaffolders/CRUD/Read.php | 10 +- src/Scaffolding/Scaffolders/CRUD/Update.php | 8 +- .../Scaffolders/DataObjectScaffolder.php | 41 +-- .../Scaffolders/OperationScaffolder.php | 14 +- .../Scaffolders/PaginationScaffolder.php | 4 +- .../Scaffolders/QueryScaffolder.php | 2 +- .../Scaffolders/SchemaScaffolder.php | 16 +- .../Scaffolders/UnionScaffolder.php | 10 +- src/Scaffolding/Util/ArrayTypeParser.php | 8 +- src/Scaffolding/Util/OperationList.php | 2 +- src/Scaffolding/Util/StringTypeParser.php | 4 +- src/TypeCreator.php | 4 +- src/Util/CaseInsensitiveFieldAccessor.php | 4 +- tests/ConnectionTest.php | 2 +- tests/ControllerTest.php | 95 ++++++- tests/Fake/DataObjectFake.php | 2 +- tests/Fake/PaginatedQueryFake.php | 2 +- tests/ManagerTest.php | 15 +- .../Extensions/TypeCreatorExtensionTest.php | 4 +- .../Scaffolders/ArgumentScaffolderTest.php | 4 +- .../Scaffolders/CRUD/CreateTest.php | 14 +- .../Scaffolders/CRUD/DeleteTest.php | 16 +- .../Scaffolding/Scaffolders/CRUD/ReadTest.php | 12 +- .../Scaffolders/CRUD/UpdateTest.php | 16 +- .../Scaffolders/DataObjectScaffolderTest.php | 25 +- .../Scaffolders/MutationScaffolderTest.php | 4 +- .../Scaffolders/OperationScaffolderTest.php | 18 +- .../Scaffolders/QueryScaffolderTest.php | 6 +- .../Scaffolders/SchemaScaffolderTest.php | 28 +- .../Scaffolders/UnionScaffolderTest.php | 8 +- .../Scaffolding/Util/ArrayTypeParserTest.php | 4 +- tests/Scaffolding/Util/OperationListTest.php | 2 +- .../Scaffolding/Util/StringTypeParserTest.php | 4 +- tests/TypeCreatorTest.php | 2 +- .../Util/CaseInsensitiveFieldAccessorTest.php | 4 +- 52 files changed, 459 insertions(+), 294 deletions(-) diff --git a/_config/config.yml b/_config/config.yml index 49f8a4e10..c650ee822 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -1,12 +1,6 @@ --- Name: graphqlconfig --- -# Minimum fields that any type will expose. Useful for implicitly -# created types, e.g. exposing a has_one. -SilverStripe\GraphQL\Scaffolding\Scaffolders\DataObjectScaffolder: - default_fields: - ID: ID - # Define the type parsers SilverStripe\Core\Injector\Injector: SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface.string: @@ -30,11 +24,3 @@ SilverStripe\ORM\FieldType\DBPrimaryKey: SilverStripe\ORM\FieldType\DBForeignKey: graphql_type: ID -## CORS default config -SilverStripe\GraphQL\Controller: - cors: - Enabled: false # Off by default - Allow-Origin: # Deny all by default - Allow-Headers: 'Authorization, Content-Type' - Allow-Methods: 'GET, POST, OPTIONS' - Max-Age: 86400 # 86,400 seconds = 1 day. diff --git a/examples/code/MemberTypeCreator.php b/examples/code/MemberTypeCreator.php index 53fee1142..712b59f0a 100644 --- a/examples/code/MemberTypeCreator.php +++ b/examples/code/MemberTypeCreator.php @@ -3,8 +3,8 @@ namespace MyProject\GraphQL; use GraphQL\Type\Definition\Type; -use SilverStripe\GraphQL\TypeCreator; use SilverStripe\GraphQL\Pagination\Connection; +use SilverStripe\GraphQL\TypeCreator; class MemberTypeCreator extends TypeCreator { diff --git a/examples/code/PaginatedReadMembersQueryCreator.php b/examples/code/PaginatedReadMembersQueryCreator.php index 6132bad4f..94d20f289 100644 --- a/examples/code/PaginatedReadMembersQueryCreator.php +++ b/examples/code/PaginatedReadMembersQueryCreator.php @@ -2,9 +2,9 @@ namespace MyProject\GraphQL; use GraphQL\Type\Definition\Type; -use SilverStripe\Security\Member; use SilverStripe\GraphQL\Pagination\Connection; use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator; +use SilverStripe\Security\Member; class PaginatedReadMembersQueryCreator extends PaginatedQueryCreator { diff --git a/examples/code/Post.php b/examples/code/Post.php index b62298606..ab4875186 100644 --- a/examples/code/Post.php +++ b/examples/code/Post.php @@ -2,11 +2,11 @@ namespace MyProject; -use SilverStripe\ORM\DataObject; +use SilverStripe\Assets\File; use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffoldingProvider; use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; +use SilverStripe\ORM\DataObject; use SilverStripe\Security\Member; -use SilverStripe\Assets\File; class Post extends DataObject implements ScaffoldingProvider { diff --git a/examples/code/ReadMembersQueryCreator.php b/examples/code/ReadMembersQueryCreator.php index 1532a6914..12c8f27a5 100644 --- a/examples/code/ReadMembersQueryCreator.php +++ b/examples/code/ReadMembersQueryCreator.php @@ -4,9 +4,9 @@ use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Type\Definition\Type; -use SilverStripe\Security\Member; use SilverStripe\GraphQL\OperationResolver; use SilverStripe\GraphQL\QueryCreator; +use SilverStripe\Security\Member; class ReadMembersQueryCreator extends QueryCreator implements OperationResolver { diff --git a/src/Controller.php b/src/Controller.php index 748275f85..9b498f896 100644 --- a/src/Controller.php +++ b/src/Controller.php @@ -2,15 +2,16 @@ namespace SilverStripe\GraphQL; +use Exception; use SilverStripe\Control\Controller as BaseController; +use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; use SilverStripe\Core\Config\Config; -use SilverStripe\Control\Director; use SilverStripe\GraphQL\Auth\Handler; -use SilverStripe\Versioned\Versioned; -use Exception; +use SilverStripe\Security\Member; use SilverStripe\Security\Permission; +use SilverStripe\Versioned\Versioned; /** * Top level controller for handling graphql requests. @@ -19,6 +20,20 @@ */ class Controller extends BaseController { + /** + * Cors default config + * + * @config + * @var array + */ + private static $cors = [ + 'Enabled' => false, // Off by default + 'Allow-Origin' => [], // List of all allowed origins; Deny by default + 'Allow-Headers' => 'Authorization, Content-Type', + 'Allow-Methods' => 'GET, POST, OPTIONS', + 'Max-Age' => 86400, // 86,400 seconds = 1 day. + ]; + /** * @var Manager */ @@ -39,56 +54,22 @@ public function index(HTTPRequest $request) // Check for a possible CORS preflight request and handle if necessary // Refer issue 66: https://github.com/silverstripe/silverstripe-graphql/issues/66 - $corsConfig = Config::inst()->get(self::class, 'cors'); - $corsEnabled = true; // Default to have CORS turned on. - - if ($corsConfig && isset($corsConfig['Enabled']) && !$corsConfig['Enabled']) { - // Dev has turned off CORS - $corsEnabled = false; - } - if ($corsEnabled && $request->httpMethod() == 'OPTIONS') { - // CORS config is enabled and the request is an OPTIONS pre-flight. - // Process the CORS config and add appropriate headers. - $response = new HTTPResponse(); - return $this->addCorsHeaders($request, $response); - } elseif (!$corsEnabled && $request->httpMethod() == 'OPTIONS') { - // CORS is disabled but we have received an OPTIONS request. This is not a valid request method in this - // situation. Return a 405 Method Not Allowed response. - return $this->httpError(405, "Method Not Allowed"); - } - - $contentType = $request->getHeader('Content-Type') ?: $request->getHeader('content-type'); - $isJson = preg_match('#^application/json\b#', $contentType); - if ($isJson) { - $rawBody = $request->getBody(); - $data = json_decode($rawBody ?: '', true); - $query = isset($data['query']) ? $data['query'] : null; - $variables = isset($data['variables']) ? (array) $data['variables'] : null; - } else { - $query = $request->requestVar('query'); - $variables = json_decode($request->requestVar('variables'), true); + if ($request->httpMethod() === 'OPTIONS') { + return $this->handleOptions($request); } - $this->setManager($manager = $this->getManager()); - + // Main query handling try { - // Check authentication - $member = $this->getAuthHandler()->requireAuthentication($request); + $manager = $this->getManager(); + + // Check and validate user for this request + $member = $this->getRequestUser($request); if ($member) { $manager->setMember($member); } - // Check authorisation - $permissions = $request->param('Permissions'); - if ($permissions) { - if (!$member) { - throw new Exception("Authentication required"); - } - $allowed = Permission::checkMember($member, $permissions); - if (!$allowed) { - throw new Exception("Not authorised"); - } - } + // Parse input + list($query, $variables) = $this->getRequestQueryVariables($request); // Run query $result = $manager->query($query, $variables); @@ -123,16 +104,18 @@ public function getManager() // Get a service rather than an instance (to allow procedural configuration) $config = Config::inst()->get(static::class, 'schema'); $manager = Manager::createFromConfig($config); - + $this->setManager($manager); return $manager; } /** * @param Manager $manager + * @return $this */ public function setManager($manager) { $this->manager = $manager; + return $this; } /** @@ -155,45 +138,157 @@ public function getAuthHandler() public function addCorsHeaders(HTTPRequest $request, HTTPResponse $response) { $corsConfig = Config::inst()->get(static::class, 'cors'); + + // If CORS is disabled don't add the extra headers. Simply return the response untouched. if (empty($corsConfig['Enabled'])) { - // If CORS is disabled don't add the extra headers. Simply return the response untouched. return $response; } - // Allow Origins header. - if (is_string($corsConfig['Allow-Origin'])) { - $allowedOrigins = [$corsConfig['Allow-Origin']]; - } else { - $allowedOrigins = $corsConfig['Allow-Origin']; - } - if (!empty($allowedOrigins)) { - $origin = $request->getHeader('Origin'); - if ($origin) { - $originAuthorised = false; - foreach ($allowedOrigins as $allowedOrigin) { - if ($allowedOrigin == $origin || $allowedOrigin === '*') { - $response->addHeader("Access-Control-Allow-Origin", $origin); - $originAuthorised = true; - break; - } - } - - if (!$originAuthorised) { - return $this->httpError(403, "Access Forbidden"); - } - } else { - // No Origin header present in Request. - return $this->httpError(403, "Access Forbidden"); - } - } else { - // No allowed origins, ergo all origins forbidden. - return $this->httpError(403, "Access Forbidden"); + // Calculate origin + $origin = $this->getRequestOrigin($request); + + // Check if valid + $allowedOrigins = (array)$corsConfig['Allow-Origin']; + $originAuthorised = $this->validateOrigin($origin, $allowedOrigins); + if (!$originAuthorised) { + $this->httpError(403, "Access Forbidden"); } + $response->addHeader('Access-Control-Allow-Origin', $origin); $response->addHeader('Access-Control-Allow-Headers', $corsConfig['Allow-Headers']); $response->addHeader('Access-Control-Allow-Methods', $corsConfig['Allow-Methods']); $response->addHeader('Access-Control-Max-Age', $corsConfig['Max-Age']); return $response; } + + /** + * Validate an origin matches a set of allowed origins + * + * @param string $origin Origin string + * @param array $allowedOrigins List of allowed origins + * @return bool + */ + protected function validateOrigin($origin, $allowedOrigins) + { + if (empty($allowedOrigins) || empty($origin)) { + return false; + } + foreach ($allowedOrigins as $allowedOrigin) { + if ($allowedOrigin === '*') { + return true; + } + if (strcasecmp($allowedOrigin, $origin) === 0) { + return true; + } + } + return false; + } + + /** + * Get (or infer) value of Origin header + * + * @param HTTPRequest $request + * @return string|null + */ + protected function getRequestOrigin(HTTPRequest $request) + { + // Prefer Origin header + $origin = $request->getHeader('Origin'); + if ($origin) { + return $origin; + } + + // Check referer + $referer = $request->getHeader('Referer'); + if ($referer) { + // Extract protocol, hostname, and port + $refererParts = parse_url($referer); + if (!$refererParts) { + return null; + } + // Rebuild + $origin = $refererParts['scheme'] . '://' . $refererParts['host']; + if (isset($refererParts['port'])) { + $origin .= ':' . $refererParts['port']; + } + return $origin; + } + + return null; + } + + /** + * Response for HTTP OPTIONS request + * + * @param HTTPRequest $request + * @return HTTPResponse + */ + protected function handleOptions(HTTPRequest $request) + { + $response = HTTPResponse::create(); + $corsConfig = Config::inst()->get(self::class, 'cors'); + if ($corsConfig['Enabled']) { + // CORS config is enabled and the request is an OPTIONS pre-flight. + // Process the CORS config and add appropriate headers. + $this->addCorsHeaders($request, $response); + } else { + // CORS is disabled but we have received an OPTIONS request. This is not a valid request method in this + // situation. Return a 405 Method Not Allowed response. + $this->httpError(405, "Method Not Allowed"); + } + return $response; + } + + /** + * Parse query and variables from the given request + * + * @param HTTPRequest $request + * @return array Array containing query and variables as a pair + */ + protected function getRequestQueryVariables(HTTPRequest $request) + { + $contentType = $request->getHeader('content-type'); + $isJson = preg_match('#^application/json\b#', $contentType); + if ($isJson) { + $rawBody = $request->getBody(); + $data = json_decode($rawBody ?: '', true); + $query = isset($data['query']) ? $data['query'] : null; + $variables = isset($data['variables']) ? (array)$data['variables'] : null; + } else { + $query = $request->requestVar('query'); + $variables = json_decode($request->requestVar('variables'), true); + } + return [$query, $variables]; + } + + /** + * Get user and validate for this request + * + * @param HTTPRequest $request + * @return Member + */ + protected function getRequestUser(HTTPRequest $request) + { + // Check authentication + $member = $this->getAuthHandler()->requireAuthentication($request); + + // Check authorisation + $permissions = $request->param('Permissions'); + if (!$permissions) { + return $member; + } + + // If permissions requested require authentication + if (!$member) { + throw new Exception("Authentication required"); + } + + // Check authorisation for this member + $allowed = Permission::checkMember($member, $permissions); + if (!$allowed) { + throw new Exception("Not authorised"); + } + return $member; + } } diff --git a/src/FieldCreator.php b/src/FieldCreator.php index c0aaa6f87..86406e49f 100644 --- a/src/FieldCreator.php +++ b/src/FieldCreator.php @@ -2,8 +2,8 @@ namespace SilverStripe\GraphQL; -use SilverStripe\Core\Injector\Injectable; use GraphQL\Type\Definition\Type; +use SilverStripe\Core\Injector\Injectable; /** * Base type for query types within graphql. I.e. mutations or queries diff --git a/src/Manager.php b/src/Manager.php index 8d67154db..f58c1b609 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -2,21 +2,21 @@ namespace SilverStripe\GraphQL; -use Doctrine\Instantiator\Exception\InvalidArgumentException; +use Closure; +use GraphQL\Error\Error; use GraphQL\Executor\ExecutionResult; +use GraphQL\GraphQL; use GraphQL\Language\SourceLocation; use GraphQL\Schema; -use GraphQL\GraphQL; -use SilverStripe\Core\Injector\Injector; -use SilverStripe\Core\Injector\Injectable; use GraphQL\Type\Definition\ObjectType; -use GraphQL\Error\Error; use GraphQL\Type\Definition\Type; -use SilverStripe\ORM\ValidationException; -use SilverStripe\Security\Member; +use InvalidArgumentException; +use SilverStripe\Core\Injector\Injectable; +use SilverStripe\Core\Injector\Injector; use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffoldingProvider; use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use Closure; +use SilverStripe\ORM\ValidationException; +use SilverStripe\Security\Member; use SilverStripe\Security\Security; /** diff --git a/src/OperationResolver.php b/src/OperationResolver.php index 004c93e14..9a94439e9 100644 --- a/src/OperationResolver.php +++ b/src/OperationResolver.php @@ -2,8 +2,8 @@ namespace SilverStripe\GraphQL; -use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Executor\Executor; +use GraphQL\Type\Definition\ResolveInfo; /** * Standard resolve callback for Mutations or Queries diff --git a/src/Pagination/Connection.php b/src/Pagination/Connection.php index f00c98c8d..df1e1f95d 100644 --- a/src/Pagination/Connection.php +++ b/src/Pagination/Connection.php @@ -2,16 +2,16 @@ namespace SilverStripe\GraphQL\Pagination; +use GraphQL\Type\Definition\ObjectType; +use GraphQL\Type\Definition\ResolveInfo; +use GraphQL\Type\Definition\Type; +use InvalidArgumentException; +use SilverStripe\Core\Injector\Injectable; use SilverStripe\Core\Injector\Injector; use SilverStripe\GraphQL\OperationResolver; -use SilverStripe\Core\Injector\Injectable; -use SilverStripe\ORM\SS_List; use SilverStripe\ORM\Limitable; use SilverStripe\ORM\Sortable; -use GraphQL\Type\Definition\Type; -use GraphQL\Type\Definition\ObjectType; -use GraphQL\Type\Definition\ResolveInfo; -use InvalidArgumentException; +use SilverStripe\ORM\SS_List; /** * A connection to a list of items on a object type. Collections are paginated diff --git a/src/Pagination/PageInfoTypeCreator.php b/src/Pagination/PageInfoTypeCreator.php index 12aef3b4a..cd478c0bc 100644 --- a/src/Pagination/PageInfoTypeCreator.php +++ b/src/Pagination/PageInfoTypeCreator.php @@ -2,8 +2,8 @@ namespace SilverStripe\GraphQL\Pagination; -use GraphQL\Type\Definition\Type; use GraphQL\Type\Definition\ObjectType; +use GraphQL\Type\Definition\Type; use SilverStripe\GraphQL\TypeCreator; /** diff --git a/src/Pagination/PaginatedQueryCreator.php b/src/Pagination/PaginatedQueryCreator.php index 0f67c5305..5d149b1a0 100644 --- a/src/Pagination/PaginatedQueryCreator.php +++ b/src/Pagination/PaginatedQueryCreator.php @@ -2,9 +2,9 @@ namespace SilverStripe\GraphQL\Pagination; +use GraphQL\Type\Definition\ResolveInfo; use SilverStripe\GraphQL\OperationResolver; use SilverStripe\GraphQL\QueryCreator; -use GraphQL\Type\Definition\ResolveInfo; /** * A helper class for making a paginated query. A paginated query uses the diff --git a/src/Pagination/SortInputTypeCreator.php b/src/Pagination/SortInputTypeCreator.php index 4385b0a75..8876a621e 100644 --- a/src/Pagination/SortInputTypeCreator.php +++ b/src/Pagination/SortInputTypeCreator.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL\Pagination; -use GraphQL\Type\Definition\Type; +use GraphQL\Type\Definition\EnumType; use GraphQL\Type\Definition\InputObjectType; +use GraphQL\Type\Definition\Type; use SilverStripe\Core\Injector\Injector; -use GraphQL\Type\Definition\EnumType; use SilverStripe\GraphQL\TypeCreator; /** diff --git a/src/Scaffolding/Extensions/TypeCreatorExtension.php b/src/Scaffolding/Extensions/TypeCreatorExtension.php index 0061b3b81..a00c9e7d9 100644 --- a/src/Scaffolding/Extensions/TypeCreatorExtension.php +++ b/src/Scaffolding/Extensions/TypeCreatorExtension.php @@ -2,15 +2,15 @@ namespace SilverStripe\GraphQL\Scaffolding\Extensions; +use Exception; use SilverStripe\Core\Config\Config; -use SilverStripe\GraphQL\Scaffolding\Interfaces\ManagerMutatorInterface; -use SilverStripe\GraphQL\Scaffolding\Util\StringTypeParser; -use SilverStripe\ORM\DataExtension; use SilverStripe\Core\Injector\Injector; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Interfaces\ManagerMutatorInterface; use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; -use SilverStripe\GraphQL\Manager; -use Exception; +use SilverStripe\GraphQL\Scaffolding\Util\StringTypeParser; +use SilverStripe\ORM\DataExtension; /** * Adds functionality to associate an object with a given GraphQL type, either diff --git a/src/Scaffolding/Scaffolders/ArgumentScaffolder.php b/src/Scaffolding/Scaffolders/ArgumentScaffolder.php index 858481901..09d2b04f7 100644 --- a/src/Scaffolding/Scaffolders/ArgumentScaffolder.php +++ b/src/Scaffolding/Scaffolders/ArgumentScaffolder.php @@ -3,9 +3,9 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders; use GraphQL\Type\Definition\Type; +use SilverStripe\Core\Injector\Injector; use SilverStripe\GraphQL\Scaffolding\Interfaces\ConfigurationApplier; use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; -use SilverStripe\Core\Injector\Injector; class ArgumentScaffolder implements ConfigurationApplier { diff --git a/src/Scaffolding/Scaffolders/CRUD/Create.php b/src/Scaffolding/Scaffolders/CRUD/Create.php index 2acdcbb19..a98c6ec33 100644 --- a/src/Scaffolding/Scaffolders/CRUD/Create.php +++ b/src/Scaffolding/Scaffolders/CRUD/Create.php @@ -2,14 +2,14 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD; -use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; -use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; +use Exception; use GraphQL\Type\Definition\InputObjectType; use GraphQL\Type\Definition\Type; use SilverStripe\Core\Injector\Injector; +use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use Exception; +use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObjectSchema; use SilverStripe\ORM\FieldType\DBField; diff --git a/src/Scaffolding/Scaffolders/CRUD/Delete.php b/src/Scaffolding/Scaffolders/CRUD/Delete.php index aae90f49d..8c578bf62 100644 --- a/src/Scaffolding/Scaffolders/CRUD/Delete.php +++ b/src/Scaffolding/Scaffolders/CRUD/Delete.php @@ -2,13 +2,13 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; -use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; -use SilverStripe\ORM\DataList; +use Exception; use GraphQL\Type\Definition\Type; use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use Exception; +use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; +use SilverStripe\ORM\DataList; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; diff --git a/src/Scaffolding/Scaffolders/CRUD/Read.php b/src/Scaffolding/Scaffolders/CRUD/Read.php index bfb02d75a..400b44fdd 100644 --- a/src/Scaffolding/Scaffolders/CRUD/Read.php +++ b/src/Scaffolding/Scaffolders/CRUD/Read.php @@ -2,17 +2,17 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD; +use Exception; use GraphQL\Type\Definition\Type; +use SilverStripe\Core\ClassInfo; +use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; use SilverStripe\GraphQL\Scaffolding\Scaffolders\QueryScaffolder; use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; -use SilverStripe\ORM\DataList; use SilverStripe\GraphQL\Scaffolding\Scaffolders\UnionScaffolder; +use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; -use SilverStripe\GraphQL\Manager; -use SilverStripe\Core\ClassInfo; -use Exception; +use SilverStripe\ORM\DataList; /** * Scaffolds a generic read operation for DataObjects. diff --git a/src/Scaffolding/Scaffolders/CRUD/Update.php b/src/Scaffolding/Scaffolders/CRUD/Update.php index e3652e43f..179cc60f1 100644 --- a/src/Scaffolding/Scaffolders/CRUD/Update.php +++ b/src/Scaffolding/Scaffolders/CRUD/Update.php @@ -2,15 +2,15 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD; +use Exception; +use GraphQL\Type\Definition\InputObjectType; +use GraphQL\Type\Definition\Type; use SilverStripe\Core\Injector\Injector; use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; -use GraphQL\Type\Definition\InputObjectType; use SilverStripe\ORM\DataList; -use GraphQL\Type\Definition\Type; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use Exception; use SilverStripe\ORM\DataObjectSchema; use SilverStripe\ORM\FieldType\DBField; diff --git a/src/Scaffolding/Scaffolders/DataObjectScaffolder.php b/src/Scaffolding/Scaffolders/DataObjectScaffolder.php index 2d5d19ce8..eeb80a388 100644 --- a/src/Scaffolding/Scaffolders/DataObjectScaffolder.php +++ b/src/Scaffolding/Scaffolders/DataObjectScaffolder.php @@ -2,27 +2,27 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders; -use Doctrine\Instantiator\Exception\InvalidArgumentException; use Exception; -use SilverStripe\ORM\DataList; -use SilverStripe\ORM\DataObject; -use SilverStripe\ORM\ArrayList; -use SilverStripe\ORM\SS_List; -use SilverStripe\View\ArrayData; -use SilverStripe\ORM\DataObjectInterface; -use SilverStripe\ORM\FieldType\DBField; -use SilverStripe\GraphQL\Manager; use GraphQL\Type\Definition\ObjectType; -use SilverStripe\GraphQL\Scaffolding\Util\OperationList; -use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; -use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; -use SilverStripe\Core\Config\Config; +use InvalidArgumentException; use SilverStripe\Core\ClassInfo; -use SilverStripe\GraphQL\Scaffolding\Traits\Chainable; +use SilverStripe\Core\Config\Config; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Interfaces\ConfigurationApplier; use SilverStripe\GraphQL\Scaffolding\Interfaces\ManagerMutatorInterface; use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffolderInterface; +use SilverStripe\GraphQL\Scaffolding\Traits\Chainable; +use SilverStripe\GraphQL\Scaffolding\Traits\DataObjectTypeTrait; +use SilverStripe\GraphQL\Scaffolding\Util\OperationList; +use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; use SilverStripe\ORM\ArrayLib; -use SilverStripe\GraphQL\Scaffolding\Interfaces\ConfigurationApplier; +use SilverStripe\ORM\ArrayList; +use SilverStripe\ORM\DataList; +use SilverStripe\ORM\DataObject; +use SilverStripe\ORM\DataObjectInterface; +use SilverStripe\ORM\FieldType\DBField; +use SilverStripe\ORM\SS_List; +use SilverStripe\View\ArrayData; /** * Scaffolds a DataObjectTypeCreator. @@ -32,6 +32,17 @@ class DataObjectScaffolder implements ManagerMutatorInterface, ScaffolderInterfa use DataObjectTypeTrait; use Chainable; + /** + * Minimum fields that any type will expose. Useful for implicitly + * created types, e.g. exposing a has_one. + * + * @config + * @var array + */ + private static $default_fields = [ + 'ID' => 'ID', + ]; + /** * @var ArrayList */ diff --git a/src/Scaffolding/Scaffolders/OperationScaffolder.php b/src/Scaffolding/Scaffolders/OperationScaffolder.php index 6fa665977..0bd8f445a 100644 --- a/src/Scaffolding/Scaffolders/OperationScaffolder.php +++ b/src/Scaffolding/Scaffolders/OperationScaffolder.php @@ -2,17 +2,17 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders; -use Doctrine\Instantiator\Exception\InvalidArgumentException; -use SilverStripe\GraphQL\Scaffolding\Interfaces\ResolverInterface; +use Exception; +use InvalidArgumentException; use SilverStripe\Core\Injector\Injector; -use SilverStripe\GraphQL\Scaffolding\Traits\Chainable; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; +use SilverStripe\GraphQL\Scaffolding\Interfaces\ConfigurationApplier; +use SilverStripe\GraphQL\Scaffolding\Interfaces\ResolverInterface; use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; -use SilverStripe\GraphQL\Scaffolding\Interfaces\ConfigurationApplier; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; +use SilverStripe\GraphQL\Scaffolding\Traits\Chainable; use SilverStripe\ORM\ArrayList; -use Exception; /** * Provides functionality common to both operation scaffolders. Cannot diff --git a/src/Scaffolding/Scaffolders/PaginationScaffolder.php b/src/Scaffolding/Scaffolders/PaginationScaffolder.php index c387b3134..f7387f7f8 100644 --- a/src/Scaffolding/Scaffolders/PaginationScaffolder.php +++ b/src/Scaffolding/Scaffolders/PaginationScaffolder.php @@ -2,9 +2,9 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders; -use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator; -use SilverStripe\GraphQL\Pagination\Connection; use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Pagination\Connection; +use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator; class PaginationScaffolder extends PaginatedQueryCreator { diff --git a/src/Scaffolding/Scaffolders/QueryScaffolder.php b/src/Scaffolding/Scaffolders/QueryScaffolder.php index 578bef7d6..98ad38af9 100644 --- a/src/Scaffolding/Scaffolders/QueryScaffolder.php +++ b/src/Scaffolding/Scaffolders/QueryScaffolder.php @@ -4,11 +4,11 @@ use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; +use InvalidArgumentException; use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Pagination\Connection; use SilverStripe\GraphQL\Scaffolding\Interfaces\ManagerMutatorInterface; use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffolderInterface; -use Doctrine\Instantiator\Exception\InvalidArgumentException; /** * Scaffolds a GraphQL query field. diff --git a/src/Scaffolding/Scaffolders/SchemaScaffolder.php b/src/Scaffolding/Scaffolders/SchemaScaffolder.php index fb347399d..56415368c 100644 --- a/src/Scaffolding/Scaffolders/SchemaScaffolder.php +++ b/src/Scaffolding/Scaffolders/SchemaScaffolder.php @@ -2,20 +2,18 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders; +use InvalidArgumentException; use League\Flysystem\Exception; +use SilverStripe\Core\Config\Config; use SilverStripe\Core\Injector\Injector; -use Doctrine\Instantiator\Exception\InvalidArgumentException; use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\Extensions\TypeCreatorExtension; use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; +use SilverStripe\GraphQL\Scaffolding\Interfaces\ManagerMutatorInterface; use SilverStripe\GraphQL\Scaffolding\Interfaces\ResolverInterface; use SilverStripe\GraphQL\Scaffolding\Util\OperationList; use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; -use SilverStripe\GraphQL\Scaffolding\Interfaces\ManagerMutatorInterface; use SilverStripe\ORM\ArrayLib; -use SilverStripe\Core\ClassInfo; -use SilverStripe\ORM\FieldType\DBField; -use SilverStripe\Core\Config\Config; use SilverStripe\View\ViewableData; /** @@ -34,6 +32,14 @@ class SchemaScaffolder implements ManagerMutatorInterface const ALL = '*'; + /** + * List of fixed types + * + * @config + * @var array + */ + private static $fixed_types = []; + /** * @var DataObjectScaffolder[] */ diff --git a/src/Scaffolding/Scaffolders/UnionScaffolder.php b/src/Scaffolding/Scaffolders/UnionScaffolder.php index c45ae05f2..a58c37a4d 100644 --- a/src/Scaffolding/Scaffolders/UnionScaffolder.php +++ b/src/Scaffolding/Scaffolders/UnionScaffolder.php @@ -2,13 +2,13 @@ namespace SilverStripe\GraphQL\Scaffolding\Scaffolders; -use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffolderInterface; +use Exception; +use GraphQL\Type\Definition\UnionType; use SilverStripe\Core\ClassInfo; -use SilverStripe\ORM\DataObject; -use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; use SilverStripe\GraphQL\Manager; -use GraphQL\Type\Definition\UnionType; -use \Exception; +use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffolderInterface; +use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; +use SilverStripe\ORM\DataObject; class UnionScaffolder implements ScaffolderInterface { diff --git a/src/Scaffolding/Util/ArrayTypeParser.php b/src/Scaffolding/Util/ArrayTypeParser.php index 9d5b64567..9e743ad86 100644 --- a/src/Scaffolding/Util/ArrayTypeParser.php +++ b/src/Scaffolding/Util/ArrayTypeParser.php @@ -2,12 +2,12 @@ namespace SilverStripe\GraphQL\Scaffolding\Util; -use GraphQL\Type\Definition\Type; -use Doctrine\Instantiator\Exception\InvalidArgumentException; -use SilverStripe\ORM\ArrayLib; use GraphQL\Type\Definition\ObjectType; -use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; +use GraphQL\Type\Definition\Type; +use InvalidArgumentException; use SilverStripe\Core\Injector\Injector; +use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; +use SilverStripe\ORM\ArrayLib; /** * Parses a map of type, e.g. Int!(20) into an array defining the arg type diff --git a/src/Scaffolding/Util/OperationList.php b/src/Scaffolding/Util/OperationList.php index 4ed3d3ac8..066d22bea 100644 --- a/src/Scaffolding/Util/OperationList.php +++ b/src/Scaffolding/Util/OperationList.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL\Scaffolding\Util; +use InvalidArgumentException; use SilverStripe\GraphQL\Scaffolding\Interfaces\CRUDInterface; use SilverStripe\GraphQL\Scaffolding\Scaffolders\OperationScaffolder; use SilverStripe\ORM\ArrayList; -use Doctrine\Instantiator\Exception\InvalidArgumentException; /** * An array list designed to work with OperationScaffolders diff --git a/src/Scaffolding/Util/StringTypeParser.php b/src/Scaffolding/Util/StringTypeParser.php index 616ec6cd6..ed1af9131 100644 --- a/src/Scaffolding/Util/StringTypeParser.php +++ b/src/Scaffolding/Util/StringTypeParser.php @@ -3,9 +3,9 @@ namespace SilverStripe\GraphQL\Scaffolding\Util; use GraphQL\Type\Definition\Type; -use Doctrine\Instantiator\Exception\InvalidArgumentException; -use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; +use InvalidArgumentException; use SilverStripe\Core\Injector\Injectable; +use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; /** * Parses a type, e.g. Int!(20) into an array defining the arg type diff --git a/src/TypeCreator.php b/src/TypeCreator.php index df3c996d1..c5b121b81 100644 --- a/src/TypeCreator.php +++ b/src/TypeCreator.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL; +use GraphQL\Type\Definition\InputObjectType; +use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use SilverStripe\Core\Injector\Injectable; -use GraphQL\Type\Definition\ObjectType; -use GraphQL\Type\Definition\InputObjectType; /** * Represents a GraphQL type in a way that allows customization through diff --git a/src/Util/CaseInsensitiveFieldAccessor.php b/src/Util/CaseInsensitiveFieldAccessor.php index 3c821c77c..83438ab17 100644 --- a/src/Util/CaseInsensitiveFieldAccessor.php +++ b/src/Util/CaseInsensitiveFieldAccessor.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL\Util; -use SilverStripe\ORM\DataObject; +use InvalidArgumentException; use SilverStripe\Core\ClassInfo; +use SilverStripe\ORM\DataObject; use SilverStripe\View\ViewableData; -use InvalidArgumentException; /** * Infer original field name casing from case insensitive field comparison. diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 82f8d068a..3f42d9ceb 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -7,6 +7,7 @@ use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Type\Definition\Type; +use InvalidArgumentException; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Pagination\Connection; @@ -15,7 +16,6 @@ use SilverStripe\GraphQL\Tests\Fake\PaginatedQueryFake; use SilverStripe\GraphQL\Tests\Fake\TypeCreatorFake; use SilverStripe\ORM\ArrayList; -use InvalidArgumentException; class ConnectionTest extends SapphireTest { diff --git a/tests/ControllerTest.php b/tests/ControllerTest.php index ebced98de..e260345c9 100644 --- a/tests/ControllerTest.php +++ b/tests/ControllerTest.php @@ -186,7 +186,7 @@ public function testAddCorsHeadersOriginAllowed() { Config::modify()->set(Controller::class, 'cors', [ 'Enabled' => true, - 'Allow-Origin' => 'localhost', + 'Allow-Origin' => 'http://localhost', 'Allow-Headers' => 'Authorization, Content-Type', 'Allow-Methods' => 'GET, POST, OPTIONS', 'Max-Age' => 86400 @@ -194,7 +194,7 @@ public function testAddCorsHeadersOriginAllowed() $controller = new Controller(); $request = new HTTPRequest('GET', ''); - $request->addHeader('Origin', 'localhost'); + $request->addHeader('Origin', 'http://localhost'); $response = new HTTPResponse(); $response = $controller->addCorsHeaders($request, $response); @@ -202,12 +202,86 @@ public function testAddCorsHeadersOriginAllowed() $this->assertEquals('200', $response->getStatusCode()); // Check returned headers. A valid origin should return 4 headers. - $this->assertEquals('localhost', $response->getHeader('Access-Control-Allow-Origin')); + $this->assertEquals('http://localhost', $response->getHeader('Access-Control-Allow-Origin')); + $this->assertEquals('Authorization, Content-Type', $response->getHeader('Access-Control-Allow-Headers')); + $this->assertEquals('GET, POST, OPTIONS', $response->getHeader('Access-Control-Allow-Methods')); + $this->assertEquals(86400, $response->getHeader('Access-Control-Max-Age')); + } + + public function testAddCorsHeadersRefererAllowed() + { + Config::modify()->set(Controller::class, 'cors', [ + 'Enabled' => true, + 'Allow-Origin' => 'http://localhost', + 'Allow-Headers' => 'Authorization, Content-Type', + 'Allow-Methods' => 'GET, POST, OPTIONS', + 'Max-Age' => 86400 + ]); + + $controller = new Controller(); + $request = new HTTPRequest('GET', ''); + $request->addHeader('Referer', 'http://localhost/some-url/?bob=1'); + $response = new HTTPResponse(); + $response = $controller->addCorsHeaders($request, $response); + + $this->assertTrue($response instanceof HTTPResponse); + $this->assertEquals('200', $response->getStatusCode()); + + // Check returned headers. A valid origin should return 4 headers. + $this->assertEquals('http://localhost', $response->getHeader('Access-Control-Allow-Origin')); + $this->assertEquals('Authorization, Content-Type', $response->getHeader('Access-Control-Allow-Headers')); + $this->assertEquals('GET, POST, OPTIONS', $response->getHeader('Access-Control-Allow-Methods')); + $this->assertEquals(86400, $response->getHeader('Access-Control-Max-Age')); + } + + public function testAddCorsHeadersRefererPortAllowed() + { + Config::modify()->set(Controller::class, 'cors', [ + 'Enabled' => true, + 'Allow-Origin' => 'http://localhost:8181', + 'Allow-Headers' => 'Authorization, Content-Type', + 'Allow-Methods' => 'GET, POST, OPTIONS', + 'Max-Age' => 86400 + ]); + + $controller = new Controller(); + $request = new HTTPRequest('GET', ''); + $request->addHeader('Referer', 'http://localhost:8181/some-url/?bob=1'); + $response = new HTTPResponse(); + $response = $controller->addCorsHeaders($request, $response); + + $this->assertTrue($response instanceof HTTPResponse); + $this->assertEquals('200', $response->getStatusCode()); + + // Check returned headers. A valid origin should return 4 headers. + $this->assertEquals('http://localhost:8181', $response->getHeader('Access-Control-Allow-Origin')); $this->assertEquals('Authorization, Content-Type', $response->getHeader('Access-Control-Allow-Headers')); $this->assertEquals('GET, POST, OPTIONS', $response->getHeader('Access-Control-Allow-Methods')); $this->assertEquals(86400, $response->getHeader('Access-Control-Max-Age')); } + /** + * Test fail on referer port + */ + public function testAddCorsHeadersRefererPortDisallowed() + { + $this->expectException(HTTPResponse_Exception::class); + + Config::modify()->set(Controller::class, 'cors', [ + 'Enabled' => true, + 'Allow-Origin' => 'http://localhost:9090', + 'Allow-Headers' => 'Authorization, Content-Type', + 'Allow-Methods' => 'GET, POST, OPTIONS', + 'Max-Age' => 86400 + ]); + + $controller = new Controller(); + $request = new HTTPRequest('GET', ''); + $request->addHeader('Referer', 'http://localhost:8080/some-url/?bob=1'); + $response = new HTTPResponse(); + $controller->addCorsHeaders($request, $response); + } + public function testAddCorsHeadersOriginAllowedWildcard() { Controller::config()->set('cors', [ @@ -244,18 +318,16 @@ public function testAddCorsHeadersOriginMissing() $controller = new Controller(); $request = new HTTPRequest('GET', ''); $response = new HTTPResponse(); - $response = $controller->addCorsHeaders($request, $response); - - $this->assertTrue($response instanceof HTTPResponse); - $this->assertEquals('403', $response->getStatusCode()); + $controller->addCorsHeaders($request, $response); } /** - * {@inheritDoc} - * @expectedException \SilverStripe\Control\HTTPResponse_Exception + * HTTP OPTIONS without cors should error */ public function testAddCorsHeadersResponseCORSDisabled() { + $this->expectException(HTTPResponse_Exception::class); + Config::modify()->set(Controller::class, 'cors', [ 'Enabled' => false ]); @@ -263,10 +335,7 @@ public function testAddCorsHeadersResponseCORSDisabled() $controller = new Controller(); $request = new HTTPRequest('OPTIONS', ''); $request->addHeader('Origin', 'localhost'); - $response = $controller->index($request); - - $this->assertTrue($response instanceof HTTPResponse); - $this->assertEquals('405', $response->getStatusCode()); + $controller->index($request); } protected function getType(Manager $manager) diff --git a/tests/Fake/DataObjectFake.php b/tests/Fake/DataObjectFake.php index 3f80d0463..b568d67f6 100644 --- a/tests/Fake/DataObjectFake.php +++ b/tests/Fake/DataObjectFake.php @@ -4,9 +4,9 @@ use SilverStripe\Assets\File; use SilverStripe\Dev\TestOnly; +use SilverStripe\ORM\DataObject; use SilverStripe\ORM\ManyManyList; use SilverStripe\Security\Member; -use SilverStripe\ORM\DataObject; /** * @property string $MyField diff --git a/tests/Fake/PaginatedQueryFake.php b/tests/Fake/PaginatedQueryFake.php index 01bbafb63..0399cb541 100644 --- a/tests/Fake/PaginatedQueryFake.php +++ b/tests/Fake/PaginatedQueryFake.php @@ -4,8 +4,8 @@ use GraphQL\Type\Definition\Type; use SilverStripe\Dev\TestOnly; -use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator; use SilverStripe\GraphQL\Pagination\Connection; +use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator; class PaginatedQueryFake extends PaginatedQueryCreator implements TestOnly { diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 6c389ee22..192b07a44 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -2,19 +2,18 @@ namespace SilverStripe\GraphQL\Tests; +use GraphQL\Error\Error; +use GraphQL\Language\SourceLocation; +use GraphQL\Schema; +use GraphQL\Type\Definition\Type; use SilverStripe\Core\Injector\Injector; +use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Manager; -use SilverStripe\GraphQL\Tests\Fake\TypeCreatorFake; -use SilverStripe\GraphQL\Tests\Fake\QueryCreatorFake; use SilverStripe\GraphQL\Tests\Fake\MutationCreatorFake; -use GraphQL\Type\Definition\Type; -use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Tests\Fake\QueryCreatorFake; +use SilverStripe\GraphQL\Tests\Fake\TypeCreatorFake; use SilverStripe\Security\IdentityStore; use SilverStripe\Security\Member; -use GraphQL\Error\Error; -use GraphQL\Schema; -use GraphQL\Language\SourceLocation; -use SilverStripe\Security\Security; class ManagerTest extends SapphireTest { diff --git a/tests/Scaffolding/Extensions/TypeCreatorExtensionTest.php b/tests/Scaffolding/Extensions/TypeCreatorExtensionTest.php index bf99753d2..52e41b72b 100644 --- a/tests/Scaffolding/Extensions/TypeCreatorExtensionTest.php +++ b/tests/Scaffolding/Extensions/TypeCreatorExtensionTest.php @@ -2,14 +2,14 @@ namespace SilverStripe\GraphQL\Tests\Scaffolding\Extensions; +use GraphQL\Type\Definition\IntType; use GraphQL\Type\Definition\ObjectType; +use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\Extensions\TypeCreatorExtension; use SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface; use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; -use SilverStripe\Core\Config\Config; -use GraphQL\Type\Definition\IntType; use SilverStripe\ORM\FieldType\DBInt; class TypeCreatorExtensionTest extends SapphireTest diff --git a/tests/Scaffolding/Scaffolders/ArgumentScaffolderTest.php b/tests/Scaffolding/Scaffolders/ArgumentScaffolderTest.php index 6c57dea1f..0a3d8ae46 100644 --- a/tests/Scaffolding/Scaffolders/ArgumentScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/ArgumentScaffolderTest.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; +use GraphQL\Type\Definition\NonNull; +use GraphQL\Type\Definition\StringType; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Scaffolding\Scaffolders\ArgumentScaffolder; -use GraphQL\Type\Definition\StringType; -use GraphQL\Type\Definition\NonNull; class ArgumentScaffolderTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/CRUD/CreateTest.php b/tests/Scaffolding/Scaffolders/CRUD/CreateTest.php index f6ca6a916..678185234 100644 --- a/tests/Scaffolding/Scaffolders/CRUD/CreateTest.php +++ b/tests/Scaffolding/Scaffolders/CRUD/CreateTest.php @@ -2,18 +2,18 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders\CRUD; +use Exception; +use GraphQL\Type\Definition\IntType; +use GraphQL\Type\Definition\NonNull; use GraphQL\Type\Definition\ObjectType; -use SilverStripe\GraphQL\Manager; +use GraphQL\Type\Definition\ResolveInfo; +use GraphQL\Type\Definition\StringType; use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; -use GraphQL\Type\Definition\StringType; -use GraphQL\Type\Definition\NonNull; -use GraphQL\Type\Definition\IntType; -use GraphQL\Type\Definition\ResolveInfo; use SilverStripe\Security\Member; -use Exception; class CreateTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/CRUD/DeleteTest.php b/tests/Scaffolding/Scaffolders/CRUD/DeleteTest.php index a6fa4bd3e..2f443b90a 100644 --- a/tests/Scaffolding/Scaffolders/CRUD/DeleteTest.php +++ b/tests/Scaffolding/Scaffolders/CRUD/DeleteTest.php @@ -2,18 +2,18 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders\CRUD; -use SilverStripe\GraphQL\Manager; -use SilverStripe\Dev\SapphireTest; -use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; -use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; -use GraphQL\Type\Definition\NonNull; -use GraphQL\Type\Definition\ListOfType; +use Exception; use GraphQL\Type\Definition\IDType; +use GraphQL\Type\Definition\ListOfType; +use GraphQL\Type\Definition\NonNull; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\ResolveInfo; +use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; +use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; +use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; use SilverStripe\Security\Member; -use Exception; class DeleteTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/CRUD/ReadTest.php b/tests/Scaffolding/Scaffolders/CRUD/ReadTest.php index 632a7c893..92aa62418 100644 --- a/tests/Scaffolding/Scaffolders/CRUD/ReadTest.php +++ b/tests/Scaffolding/Scaffolders/CRUD/ReadTest.php @@ -2,15 +2,15 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders\CRUD; -use SilverStripe\GraphQL\Manager; +use GraphQL\Type\Definition\ObjectType; +use GraphQL\Type\Definition\ResolveInfo; use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\DataObjectScaffolder; use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; -use SilverStripe\GraphQL\Tests\Fake\FakeRedirectorPage; use SilverStripe\GraphQL\Tests\Fake\FakePage; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\DataObjectScaffolder; -use GraphQL\Type\Definition\ObjectType; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; -use GraphQL\Type\Definition\ResolveInfo; +use SilverStripe\GraphQL\Tests\Fake\FakeRedirectorPage; use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; use SilverStripe\Security\Member; diff --git a/tests/Scaffolding/Scaffolders/CRUD/UpdateTest.php b/tests/Scaffolding/Scaffolders/CRUD/UpdateTest.php index 3a532ab54..e1764e87f 100644 --- a/tests/Scaffolding/Scaffolders/CRUD/UpdateTest.php +++ b/tests/Scaffolding/Scaffolders/CRUD/UpdateTest.php @@ -2,18 +2,18 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders\CRUD; -use SilverStripe\GraphQL\Manager; -use SilverStripe\Dev\SapphireTest; -use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; -use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; -use GraphQL\Type\Definition\StringType; -use GraphQL\Type\Definition\NonNull; +use Exception; use GraphQL\Type\Definition\IntType; +use GraphQL\Type\Definition\NonNull; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\ResolveInfo; +use GraphQL\Type\Definition\StringType; +use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; +use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; +use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; use SilverStripe\Security\Member; -use Exception; class UpdateTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/DataObjectScaffolderTest.php b/tests/Scaffolding/Scaffolders/DataObjectScaffolderTest.php index c37c41922..b30d2b39f 100644 --- a/tests/Scaffolding/Scaffolders/DataObjectScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/DataObjectScaffolderTest.php @@ -2,26 +2,25 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; +use Exception; +use GraphQL\Type\Definition\ObjectType; +use GraphQL\Type\Definition\ResolveInfo; +use InvalidArgumentException; use SilverStripe\Core\Config\Config; -use SilverStripe\Core\Injector\Injector; -use SilverStripe\GraphQL\Manager; use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; use SilverStripe\GraphQL\Scaffolding\Scaffolders\DataObjectScaffolder; use SilverStripe\GraphQL\Scaffolding\Scaffolders\OperationScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\QueryScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; -use SilverStripe\GraphQL\Tests\Fake\FakeSiteTree; use SilverStripe\GraphQL\Tests\Fake\FakePage; use SilverStripe\GraphQL\Tests\Fake\FakeRedirectorPage; -use Doctrine\Instantiator\Exception\InvalidArgumentException; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\QueryScaffolder; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; -use GraphQL\Type\Definition\ObjectType; -use GraphQL\Type\Definition\ResolveInfo; -use Exception; +use SilverStripe\GraphQL\Tests\Fake\FakeSiteTree; use SilverStripe\ORM\FieldType\DBInt; class DataObjectScaffolderTest extends SapphireTest diff --git a/tests/Scaffolding/Scaffolders/MutationScaffolderTest.php b/tests/Scaffolding/Scaffolders/MutationScaffolderTest.php index ab9ebeba4..29e45dafe 100644 --- a/tests/Scaffolding/Scaffolders/MutationScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/MutationScaffolderTest.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; -use SilverStripe\GraphQL\Manager; +use GraphQL\Type\Definition\ObjectType; use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; -use GraphQL\Type\Definition\ObjectType; class MutationScaffolderTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/OperationScaffolderTest.php b/tests/Scaffolding/Scaffolders/OperationScaffolderTest.php index 37cf454f2..67723fbfa 100644 --- a/tests/Scaffolding/Scaffolders/OperationScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/OperationScaffolderTest.php @@ -2,20 +2,20 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; +use Exception; +use GraphQL\Type\Definition\StringType; +use InvalidArgumentException; use SilverStripe\Dev\SapphireTest; -use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; -use SilverStripe\GraphQL\Tests\Fake\OperationScaffolderFake; -use SilverStripe\GraphQL\Tests\Fake\FakeResolver; -use Doctrine\Instantiator\Exception\InvalidArgumentException; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\OperationScaffolder; use SilverStripe\GraphQL\Scaffolding\Scaffolders\ArgumentScaffolder; use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete; -use GraphQL\Type\Definition\StringType; -use Exception; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\OperationScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; +use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; +use SilverStripe\GraphQL\Tests\Fake\FakeResolver; +use SilverStripe\GraphQL\Tests\Fake\OperationScaffolderFake; use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; /** diff --git a/tests/Scaffolding/Scaffolders/QueryScaffolderTest.php b/tests/Scaffolding/Scaffolders/QueryScaffolderTest.php index 3f720b172..88a0816a9 100644 --- a/tests/Scaffolding/Scaffolders/QueryScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/QueryScaffolderTest.php @@ -2,11 +2,11 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; -use SilverStripe\GraphQL\Manager; +use GraphQL\Type\Definition\ObjectType; +use InvalidArgumentException; use SilverStripe\Dev\SapphireTest; -use Doctrine\Instantiator\Exception\InvalidArgumentException; +use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\Scaffolders\QueryScaffolder; -use GraphQL\Type\Definition\ObjectType; class QueryScaffolderTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/SchemaScaffolderTest.php b/tests/Scaffolding/Scaffolders/SchemaScaffolderTest.php index cded93421..350db7199 100644 --- a/tests/Scaffolding/Scaffolders/SchemaScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/SchemaScaffolderTest.php @@ -2,28 +2,28 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; +use InvalidArgumentException; use League\Flysystem\Exception; -use SilverStripe\GraphQL\Manager; +use SilverStripe\Assets\File; +use SilverStripe\Core\Config\Config; +use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Manager; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; use SilverStripe\GraphQL\Scaffolding\Scaffolders\DataObjectScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\QueryScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; +use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; -use SilverStripe\GraphQL\Tests\Fake\FakeResolver; -use SilverStripe\GraphQL\Tests\Fake\FakeSiteTree; +use SilverStripe\GraphQL\Tests\Fake\FakeInt; use SilverStripe\GraphQL\Tests\Fake\FakePage; use SilverStripe\GraphQL\Tests\Fake\FakeRedirectorPage; -use SilverStripe\GraphQL\Tests\Fake\FakeInt; -use Doctrine\Instantiator\Exception\InvalidArgumentException; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\QueryScaffolder; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read; +use SilverStripe\GraphQL\Tests\Fake\FakeResolver; +use SilverStripe\GraphQL\Tests\Fake\FakeSiteTree; use SilverStripe\ORM\ArrayList; use SilverStripe\Security\Member; -use SilverStripe\Assets\File; -use SilverStripe\Core\Config\Config; -use SilverStripe\Core\Injector\Injector; -use SilverStripe\GraphQL\Scaffolding\Util\ScaffoldingUtil; class SchemaScaffolderTest extends SapphireTest { diff --git a/tests/Scaffolding/Scaffolders/UnionScaffolderTest.php b/tests/Scaffolding/Scaffolders/UnionScaffolderTest.php index 3e293dee3..b4c8cbfc7 100644 --- a/tests/Scaffolding/Scaffolders/UnionScaffolderTest.php +++ b/tests/Scaffolding/Scaffolders/UnionScaffolderTest.php @@ -2,16 +2,16 @@ namespace SilverStripe\GraphQL\Tests\Scaffolders; -use SilverStripe\GraphQL\Scaffolding\Scaffolders\UnionScaffolder; +use Exception; +use GraphQL\Type\Definition\ResolveInfo; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Manager; use SilverStripe\GraphQL\Scaffolding\Scaffolders\DataObjectScaffolder; +use SilverStripe\GraphQL\Scaffolding\Scaffolders\UnionScaffolder; +use SilverStripe\GraphQL\Tests\Fake\FakePage; use SilverStripe\GraphQL\Tests\Fake\FakeRedirectorPage; use SilverStripe\GraphQL\Tests\Fake\FakeSiteTree; -use SilverStripe\GraphQL\Tests\Fake\FakePage; use SilverStripe\GraphQL\Tests\Fake\RestrictedDataObjectFake; -use GraphQL\Type\Definition\ResolveInfo; -use Exception; class UnionScaffolderTest extends SapphireTest { diff --git a/tests/Scaffolding/Util/ArrayTypeParserTest.php b/tests/Scaffolding/Util/ArrayTypeParserTest.php index dd53dd082..f81b9a0d4 100644 --- a/tests/Scaffolding/Util/ArrayTypeParserTest.php +++ b/tests/Scaffolding/Util/ArrayTypeParserTest.php @@ -6,8 +6,8 @@ use GraphQL\Type\Definition\IntType; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\StringType; +use InvalidArgumentException; use SilverStripe\Dev\SapphireTest; -use Doctrine\Instantiator\Exception\InvalidArgumentException; use SilverStripe\GraphQL\Scaffolding\Util\ArrayTypeParser; /** @@ -30,7 +30,7 @@ public function testGetType() $type = $parser->getType(); $this->assertInstanceOf(ObjectType::class, $type); - + $this->assertInstanceOf(FieldDefinition::class, $type->getField('FieldOne')); $this->assertInstanceOf(FieldDefinition::class, $type->getField('FieldTwo')); diff --git a/tests/Scaffolding/Util/OperationListTest.php b/tests/Scaffolding/Util/OperationListTest.php index cf88f60e6..5940b4c69 100644 --- a/tests/Scaffolding/Util/OperationListTest.php +++ b/tests/Scaffolding/Util/OperationListTest.php @@ -2,8 +2,8 @@ namespace SilverStripe\GraphQL\Tests\Util; +use InvalidArgumentException; use SilverStripe\Dev\SapphireTest; -use Doctrine\Instantiator\Exception\InvalidArgumentException; use SilverStripe\GraphQL\Scaffolding\Scaffolders\MutationScaffolder; use SilverStripe\GraphQL\Scaffolding\Util\OperationList; diff --git a/tests/Scaffolding/Util/StringTypeParserTest.php b/tests/Scaffolding/Util/StringTypeParserTest.php index a2d8dce29..d588e1583 100644 --- a/tests/Scaffolding/Util/StringTypeParserTest.php +++ b/tests/Scaffolding/Util/StringTypeParserTest.php @@ -2,10 +2,10 @@ namespace SilverStripe\GraphQL\Tests\Util; +use GraphQL\Type\Definition\StringType; +use InvalidArgumentException; use SilverStripe\Dev\SapphireTest; -use Doctrine\Instantiator\Exception\InvalidArgumentException; use SilverStripe\GraphQL\Scaffolding\Util\StringTypeParser; -use GraphQL\Type\Definition\StringType; /** * @skipUpgrade diff --git a/tests/TypeCreatorTest.php b/tests/TypeCreatorTest.php index 7d9c145ca..d7d0314e0 100644 --- a/tests/TypeCreatorTest.php +++ b/tests/TypeCreatorTest.php @@ -3,10 +3,10 @@ namespace SilverStripe\GraphQL\Tests; use GraphQL\Type\Definition\InputObjectType; +use GraphQL\Type\Definition\Type; use PHPUnit_Framework_MockObject_MockObject; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\TypeCreator; -use GraphQL\Type\Definition\Type; class TypeCreatorTest extends SapphireTest { diff --git a/tests/Util/CaseInsensitiveFieldAccessorTest.php b/tests/Util/CaseInsensitiveFieldAccessorTest.php index 5cb658c0c..2a8e18dd9 100644 --- a/tests/Util/CaseInsensitiveFieldAccessorTest.php +++ b/tests/Util/CaseInsensitiveFieldAccessorTest.php @@ -2,9 +2,9 @@ namespace SilverStripe\GraphQL\Tests\Util; -use SilverStripe\GraphQL\Util\CaseInsensitiveFieldAccessor; -use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; use SilverStripe\Dev\SapphireTest; +use SilverStripe\GraphQL\Tests\Fake\DataObjectFake; +use SilverStripe\GraphQL\Util\CaseInsensitiveFieldAccessor; class CaseInsensitiveFieldAccessorTest extends SapphireTest {