OXDEV-3103 Update to reflect latest changes

This commit is contained in:
Florian Engelhardt 2020-02-21 10:29:53 +01:00
parent 4509d3b871
commit 118c2f00ae
No known key found for this signature in database
GPG Key ID: 39B8DAD75A95B500
16 changed files with 347 additions and 109 deletions

15
.php_cs
View File

@ -1,15 +0,0 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in('src/')
;
return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'ordered_imports' => true,
'no_unused_imports' => true,
'array_syntax' => ['syntax' => 'short'],
])
->setFinder($finder)
;

231
.php_cs.dist Normal file
View File

@ -0,0 +1,231 @@
<?php
declare(strict_types=1);
$header = <<<'EOF'
All rights reserved.
See LICENSE file for license details.
EOF;
$finder = PhpCsFixer\Finder::create()
->files()
->in(__DIR__ . '/src')
->in(__DIR__ . '/tests/');
return PhpCsFixer\Config::create()
->setFinder($finder)
->setRiskyAllowed(true)
->setRules([
'@PSR2' => true,
'blank_line_after_opening_tag' => true,
'compact_nullable_typehint' => true,
'declare_equal_normalize' => [
'space' => 'none'
],
'function_typehint_space' => true,
'method_argument_space' => [
'on_multiline' => 'ensure_fully_multiline',
],
'new_with_braces' => true,
'no_empty_statement' => true,
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_whitespace_in_blank_line' => true,
'return_type_declaration' => [
'space_before' => 'none'
],
'single_trait_insert_per_statement' => true,
'align_multiline_comment' => [
'comment_type' => 'all_multiline'
],
'array_indentation' => true,
'array_syntax' => [
'syntax' => 'short'
],
'backtick_to_shell_exec' => true,
'binary_operator_spaces' => [
'operators' => [
'=' => 'align',
'=>' => 'align',
],
],
'blank_line_before_statement' => [
'statements' => [
'break',
'case',
'continue',
'declare',
'default',
'die',
'do',
'exit',
'for',
'foreach',
'if',
'include',
'include_once',
'require',
'require_once',
'return',
'switch',
'throw',
'try',
'while',
'yield',
],
],
'cast_spaces' => true,
'class_attributes_separation' => [
'elements' => [
'const',
'method',
'property'
]
],
'combine_consecutive_issets' => true,
'combine_consecutive_unsets' => true,
'concat_space' => [
'spacing' => 'one'
],
'declare_strict_types' => true,
'dir_constant' => true,
'global_namespace_import' => [
'import_classes' => true,
'import_constants' => true,
'import_functions' => true
],
'header_comment' => [
'header' => $header,
'separate' => 'both',
'location' => 'after_open',
'comment_type' => 'PHPDoc'
],
'is_null' => true,
'list_syntax' => [
'syntax' => 'short'
],
'logical_operators' => true,
'lowercase_cast' => true,
'lowercase_constants' => true,
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
'magic_constant_casing' => true,
'modernize_types_casting' => true,
'multiline_comment_opening_closing' => false,
'multiline_whitespace_before_semicolons' => true,
'native_function_casing' => true,
'no_alias_functions' => true,
'no_alternative_syntax' => true,
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_extra_blank_lines' => true,
'no_homoglyph_names' => true,
'no_mixed_echo_print' => [
'use' => 'print'
],
'no_multiline_whitespace_around_double_arrow' => true,
'no_null_property_initialization' => true,
'no_php4_constructor' => true,
'no_short_bool_cast' => true,
'no_short_echo_tag' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_superfluous_elseif' => true,
'no_superfluous_phpdoc_tags' => [
'allow_mixed' => true
],
'no_trailing_comma_in_list_call' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_unneeded_control_parentheses' => true,
'no_unneeded_curly_braces' => true,
'no_unneeded_final_method' => true,
'no_unreachable_default_argument_value' => true,
'no_unset_on_property' => true,
'no_unused_imports' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'no_whitespace_before_comma_in_array' => true,
'non_printable_character' => true,
'normalize_index_brace' => true,
'nullable_type_declaration_for_default_null_value' => true,
'object_operator_without_whitespace' => true,
'ordered_class_elements' => [
'order' => [
'use_trait',
'constant_public',
'constant_protected',
'constant_private',
'property_public_static',
'property_protected_static',
'property_private_static',
'property_public',
'property_protected',
'property_private',
'construct',
'destruct',
'magic',
'phpunit',
'method_public',
'method_protected',
'method_private',
'method_static',
'method_public_static',
'method_protected_static',
'method_private_static',
]
],
'ordered_imports' => [
'imports_order' => [
'const',
'class',
'function'
],
'sort_algorithm' => 'alpha'
],
'ordered_interfaces' => [
'direction' => 'ascend',
'order' => 'alpha',
],
'phpdoc_add_missing_param_annotation' => true,
'phpdoc_align' => true,
'phpdoc_annotation_without_dot' => true,
'phpdoc_indent' => true,
'phpdoc_no_access' => true,
'phpdoc_no_empty_return' => true,
'phpdoc_no_package' => true,
'phpdoc_order' => true,
'phpdoc_return_self_reference' => true,
'phpdoc_scalar' => true,
'phpdoc_separation' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_to_comment' => false,
'phpdoc_trim' => true,
'phpdoc_trim_consecutive_blank_line_separation' => true,
'phpdoc_types' => [
'groups' => [
'simple',
'meta'
]
],
'phpdoc_types_order' => true,
'phpdoc_var_without_name' => true,
'pow_to_exponentiation' => true,
'protected_to_private' => true,
'return_assignment' => true,
'self_accessor' => true,
'semicolon_after_instruction' => true,
'set_type_to_cast' => true,
'short_scalar_cast' => true,
'simplified_null_return' => false,
'single_blank_line_before_namespace' => true,
'single_quote' => true,
'standardize_not_equals' => true,
'ternary_to_null_coalescing' => true,
'trailing_comma_in_multiline_array' => true,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
'void_return' => true,
'whitespace_after_comma_in_array' => true,
]);

View File

@ -9,7 +9,7 @@ php:
- "7.1" - "7.1"
- "7.2" - "7.2"
- "7.3" - "7.3"
- "7.4snapshot" - "7.4"
cache: cache:
directories: directories:
@ -17,8 +17,6 @@ cache:
matrix: matrix:
fast_finish: true fast_finish: true
allow_failures:
- php: "7.4snapshot"
before_script: before_script:
- composer create-project oxid-esales/graphql-module --repository packages.json --remove-vcs -n - composer create-project oxid-esales/graphql-module --repository packages.json --remove-vcs -n
@ -27,4 +25,6 @@ script:
- cd graphql-module - cd graphql-module
- composer test:syntax - composer test:syntax
- composer test:lint - composer test:lint
- composer test:lint-fixer
- composer test:static - composer test:static
- composer test:unit

View File

@ -9,7 +9,7 @@ php:
- "7.1" - "7.1"
- "7.2" - "7.2"
- "7.3" - "7.3"
- "7.4snapshot" - "7.4"
cache: cache:
directories: directories:
@ -17,8 +17,6 @@ cache:
matrix: matrix:
fast_finish: true fast_finish: true
allow_failures:
- php: "7.4snapshot"
before_script: before_script:
- composer install --prefer-dist - composer install --prefer-dist
@ -26,4 +24,6 @@ before_script:
script: script:
- composer test:syntax - composer test:syntax
- composer test:lint - composer test:lint
- composer test:lint-fixer
- composer test:static - composer test:static
- composer test:unit

View File

@ -11,7 +11,7 @@ This skeleton will set you up with a
- including a sane `README.md` - including a sane `README.md`
- pre setup `NamespaceMapper` - pre setup `NamespaceMapper`
- simple example controller - simple example controller
- nice developement expirience - nice developement experience
## How to use ## How to use

View File

@ -21,13 +21,13 @@ TBD
## Testing ## Testing
### Linting, Syntax and static analysis ### Linting, syntax, static analysis and unit tests
```bash ```bash
$ composer test $ composer test
``` ```
### Unit tests ### Integration tests
- install this module into a running OXID eShop - install this module into a running OXID eShop
- change the `test_config.yml` - change the `test_config.yml`

View File

@ -15,15 +15,16 @@
}, },
"require": { "require": {
"php": "^7.1", "php": "^7.1",
"oxid-esales/graphql-base": "^1.2" "oxid-esales/graphql-base": "^2.3"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^7.5", "phpunit/phpunit": "^7.5",
"squizlabs/php_codesniffer": "^3.5.1", "squizlabs/php_codesniffer": "^3.5.2",
"jakub-onderka/php-parallel-lint": "^1.0", "jakub-onderka/php-parallel-lint": "^1.0",
"phpstan/phpstan": "^0.12", "phpstan/phpstan": "^0.12",
"oxid-esales/oxideshop-ce": "6.5", "oxid-esales/oxideshop-ce": "^6.5",
"oxid-esales/oxideshop-unified-namespace-generator": "^2.0" "oxid-esales/oxideshop-unified-namespace-generator": "^2.0",
"friendsofphp/php-cs-fixer": "^2.16"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@ -44,16 +45,24 @@
], ],
"post-create-project-cmd": [ "post-create-project-cmd": [
"OxidEsales\\GraphQL\\Skeleton\\Installer::postInstall", "OxidEsales\\GraphQL\\Skeleton\\Installer::postInstall",
"composer update" "composer update",
"@fix"
],
"fix:cbf": "phpcbf",
"fix:fixer": "php-cs-fixer fix",
"fix": [
"@fix:cbf",
"@fix:fixer"
], ],
"fix": "phpcbf --standard=PSR12 --extensions=php -p src/ tests/",
"test:lint": "phpcs --standard=PSR12 --extensions=php -p src/ tests/",
"test:syntax": "parallel-lint src/", "test:syntax": "parallel-lint src/",
"test:lint": "phpcs",
"test:lint-fixer": "php-cs-fixer fix --dry-run",
"test:static": "phpstan analyse src/", "test:static": "phpstan analyse src/",
"test:unit": "phpunit -c tests/phpunit.xml tests/Unit/", "test:unit": "phpunit -c tests/phpunit.xml tests/Unit/",
"test": [ "test": [
"@test:lint",
"@test:syntax", "@test:syntax",
"@test:lint",
"@test:lint-fixer",
"@test:static", "@test:static",
"@test:unit" "@test:unit"
] ]

10
phpcs.xml.dist Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHP_CodeSniffer" xsi:noNamespaceSchemaLocation="phpcs.xsd">
<file>src/</file>
<file>tests/</file>
<arg name="colors"/>
<arg name="parallel" value="75"/>
<arg name="extensions" value="php"/>
<arg value="np"/>
<rule ref="PSR12" />
</ruleset>

View File

@ -1,6 +0,0 @@
parameters:
ignoreErrors:
-
message: "#^Access to an undefined property OxidEsales\\\\EshopCommunity\\\\Application\\\\Model\\\\Category\\:\\:\\$oxcategories__.+\\.$#"
count: 3
path: src/DataObject/Category.php

View File

@ -1,8 +1,6 @@
includes:
- phpstan.baseline.neon
parameters: parameters:
level: max level: max
inferPrivatePropertyTypeFromConstructor: true inferPrivatePropertyTypeFromConstructor: true
autoload_files: autoload_files:
- vendor/oxid-esales/oxideshop-ce/source/oxfunctions.php - vendor/oxid-esales/oxideshop-ce/source/oxfunctions.php
- vendor/oxid-esales/oxideshop-ce/source/overridablefunctions.php

View File

@ -1,11 +1,17 @@
<?php <?php
/**
* All rights reserved.
* See LICENSE file for license details.
*/
declare(strict_types=1); declare(strict_types=1);
namespace __Vendor__\GraphQL\__Package__\Controller; namespace __Vendor__\GraphQL\__Package__\Controller;
use OxidEsales\EshopCommunity\Application\Model\Category as CategoryModel; use OxidEsales\Eshop\Application\Model\Category as CategoryEshopModel;
use __Vendor__\GraphQL\__Package__\DataObject\Category as CategoryDataObject; use __Vendor__\GraphQL\__Package__\DataObject\Category as CategoryDataObject;
use __Vendor__\GraphQL\__Package__\Exception\CategoryNotFound;
use TheCodingMachine\GraphQLite\Annotations\Query; use TheCodingMachine\GraphQLite\Annotations\Query;
class Category class Category
@ -15,14 +21,17 @@ class Category
* *
* @Query() * @Query()
*/ */
public function category(string $id): ?CategoryDataObject public function category(string $id): CategoryDataObject
{ {
/** @var CategoryModel */ /** @var CategoryEshopModel */
$category = oxNew(CategoryModel::class); $category = oxNew(CategoryEshopModel::class);
if (!$category->load($id)) { if (!$category->load($id)) {
return null; throw CategoryNotFound::byId($id);
} }
$category = CategoryDataObject::createFromModel($category);
return $category; return new CategoryDataObject(
$category
);
} }
} }

View File

@ -1,78 +1,48 @@
<?php <?php
/**
* All rights reserved.
* See LICENSE file for license details.
*/
declare(strict_types=1); declare(strict_types=1);
namespace __Vendor__\GraphQL\__Package__\DataObject; namespace __Vendor__\GraphQL\__Package__\DataObject;
use OxidEsales\EshopCommunity\Application\Model\Category as CategoryModel; use OxidEsales\Eshop\Application\Model\Category as CategoryEshopModel;
use TheCodingMachine\GraphQLite\Annotations\Field; use TheCodingMachine\GraphQLite\Annotations\Field;
use TheCodingMachine\GraphQLite\Annotations\Type; use TheCodingMachine\GraphQLite\Annotations\Type;
use TheCodingMachine\GraphQLite\Types\ID;
/** /**
* @Type() * @Type()
*/ */
class Category class Category
{ {
/** @var string */ /** @var CategoryEshopModel */
private $id; private $category;
/** @var string */
private $name;
/** @var string */
private $parentid;
/** @var \DateTimeInterface */
private $timestamp;
public function __construct( public function __construct(
string $id, CategoryEshopModel $category
string $name,
string $parentid,
\DateTimeInterface $timestamp
) { ) {
$this->id = $id; $this->category = $category;
$this->name = $name;
$this->parentid = $parentid;
$this->timestamp = $timestamp;
} }
public static function createFromModel(CategoryModel $category): self /**
* @Field
*/
public function getId(): ID
{ {
return new self( return new ID(
$category->getId(), $this->category->getId()
(string)$category->oxcategories__oxtitle,
(string)$category->oxcategories__oxpartentid,
new \DateTimeImmutable((string)$category->oxcategories__oxtimestamp)
); );
} }
/** /**
* @Field(outputType="ID") * @Field
*/ */
public function getId(): string public function getTitle(): string
{ {
return $this->id; return (string) $this->category->getFieldData('oxtitle');
}
/**
* @Field()
*/
public function getName(): string
{
return $this->name;
}
public function getParentid(): string
{
return $this->parentid;
}
/**
* @Field()
*/
public function getTimestamp(): \DateTimeInterface
{
return $this->timestamp;
} }
} }

View File

@ -0,0 +1,22 @@
<?php
/**
* All rights reserved.
* See LICENSE file for license details.
*/
declare(strict_types=1);
namespace __Vendor__\GraphQL\__Package__\Exception;
use OxidEsales\GraphQL\Base\Exception\NotFound;
use function sprintf;
final class CategoryNotFound extends NotFound
{
public static function byId(string $id): self
{
return new self(sprintf('Category was not found by id: %s', $id));
}
}

View File

@ -1,7 +1,7 @@
<?php <?php
/** /**
* Copyright © OXID eSales AG. All rights reserved. * All rights reserved.
* See LICENSE file for license details. * See LICENSE file for license details.
*/ */
@ -16,14 +16,14 @@ class NamespaceMapper implements NamespaceMapperInterface
public function getControllerNamespaceMapping(): array public function getControllerNamespaceMapping(): array
{ {
return [ return [
'\\__Vendor__\\GraphQL\\__Package__\\Controller' => __DIR__ . '/../Controller/' '\\__Vendor__\\GraphQL\\__Package__\\Controller' => __DIR__ . '/../Controller/',
]; ];
} }
public function getTypeNamespaceMapping(): array public function getTypeNamespaceMapping(): array
{ {
return [ return [
'\\__Vendor__\\GraphQL\\__Package__\\DataObject' => __DIR__ . '/../DataObject/' '\\__Vendor__\\GraphQL\\__Package__\\DataObject' => __DIR__ . '/../DataObject/',
]; ];
} }
} }

View File

@ -1,5 +1,10 @@
<?php <?php
/**
* All rights reserved.
* See LICENSE file for license details.
*/
declare(strict_types=1); declare(strict_types=1);
namespace __Vendor__\GraphQL\__Package__\Tests\Integration\Controller; namespace __Vendor__\GraphQL\__Package__\Tests\Integration\Controller;
@ -8,12 +13,12 @@ use OxidEsales\GraphQL\Base\Tests\Integration\TestCase;
class CategoryTest extends TestCase class CategoryTest extends TestCase
{ {
public function testGetSingleCategoryWithoutParam() public function testGetSingleCategoryWithoutParam(): void
{ {
$this->execQuery('query { category }'); $result = $this->execQuery('query { category }');
$this->assertEquals( $this->assertSame(
400, 400,
static::$queryResult['status'] $result['status']
); );
} }
} }

View File

@ -1,5 +1,10 @@
<?php <?php
/**
* All rights reserved.
* See LICENSE file for license details.
*/
declare(strict_types=1); declare(strict_types=1);
namespace __Vendor__\GraphQL\__Package__\Tests\Unit\Framework; namespace __Vendor__\GraphQL\__Package__\Tests\Unit\Framework;
@ -7,12 +12,12 @@ namespace __Vendor__\GraphQL\__Package__\Tests\Unit\Framework;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use __Vendor__\GraphQL\__Package__\Framework\NamespaceMapper; use __Vendor__\GraphQL\__Package__\Framework\NamespaceMapper;
class NamespaceMapperTest extends TestCase
{
/** /**
* @covers __Vendor__\GraphQL\__Package__\Framework\NamespaceMapper * @covers __Vendor__\GraphQL\__Package__\Framework\NamespaceMapper
*/ */
public function testFooBar() class NamespaceMapperTest extends TestCase
{
public function testFooBar(): void
{ {
$namespaceMapper = new NamespaceMapper(); $namespaceMapper = new NamespaceMapper();
$this->assertCount( $this->assertCount(