From 118c2f00aece3fa5cbebe3d790a44b481c9e2ff2 Mon Sep 17 00:00:00 2001 From: Florian Engelhardt Date: Fri, 21 Feb 2020 10:29:53 +0100 Subject: [PATCH] OXDEV-3103 Update to reflect latest changes --- .php_cs | 15 -- .php_cs.dist | 231 ++++++++++++++++++ .travis.yml | 6 +- .travis.yml.dist | 6 +- README.md | 2 +- README.md.dist | 4 +- composer.json | 25 +- phpcs.xml.dist | 10 + phpstan.baseline.neon | 6 - phpstan.neon | 4 +- src/Controller/Category.php | 23 +- src/DataObject/Category.php | 70 ++---- src/Exception/CategoryNotFound.php | 22 ++ src/Framework/NamespaceMapper.php | 6 +- tests/Integration/Controller/CategoryTest.php | 13 +- tests/Unit/Framework/NamespaceMapperTest.php | 13 +- 16 files changed, 347 insertions(+), 109 deletions(-) delete mode 100644 .php_cs create mode 100644 .php_cs.dist create mode 100644 phpcs.xml.dist delete mode 100644 phpstan.baseline.neon create mode 100644 src/Exception/CategoryNotFound.php diff --git a/.php_cs b/.php_cs deleted file mode 100644 index 0580361..0000000 --- a/.php_cs +++ /dev/null @@ -1,15 +0,0 @@ -in('src/') -; - -return PhpCsFixer\Config::create() - ->setRules([ - '@PSR2' => true, - 'ordered_imports' => true, - 'no_unused_imports' => true, - 'array_syntax' => ['syntax' => 'short'], - ]) - ->setFinder($finder) -; diff --git a/.php_cs.dist b/.php_cs.dist new file mode 100644 index 0000000..2ca9f64 --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,231 @@ +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, + ]); diff --git a/.travis.yml b/.travis.yml index 7258831..8dbc582 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ php: - "7.1" - "7.2" - "7.3" - - "7.4snapshot" + - "7.4" cache: directories: @@ -17,8 +17,6 @@ cache: matrix: fast_finish: true - allow_failures: - - php: "7.4snapshot" before_script: - composer create-project oxid-esales/graphql-module --repository packages.json --remove-vcs -n @@ -27,4 +25,6 @@ script: - cd graphql-module - composer test:syntax - composer test:lint + - composer test:lint-fixer - composer test:static + - composer test:unit diff --git a/.travis.yml.dist b/.travis.yml.dist index 24415b5..a978d1c 100644 --- a/.travis.yml.dist +++ b/.travis.yml.dist @@ -9,7 +9,7 @@ php: - "7.1" - "7.2" - "7.3" - - "7.4snapshot" + - "7.4" cache: directories: @@ -17,8 +17,6 @@ cache: matrix: fast_finish: true - allow_failures: - - php: "7.4snapshot" before_script: - composer install --prefer-dist @@ -26,4 +24,6 @@ before_script: script: - composer test:syntax - composer test:lint + - composer test:lint-fixer - composer test:static + - composer test:unit diff --git a/README.md b/README.md index 8260327..3082e35 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This skeleton will set you up with a - including a sane `README.md` - pre setup `NamespaceMapper` - simple example controller -- nice developement expirience +- nice developement experience ## How to use diff --git a/README.md.dist b/README.md.dist index f210c57..b25edbb 100644 --- a/README.md.dist +++ b/README.md.dist @@ -21,13 +21,13 @@ TBD ## Testing -### Linting, Syntax and static analysis +### Linting, syntax, static analysis and unit tests ```bash $ composer test ``` -### Unit tests +### Integration tests - install this module into a running OXID eShop - change the `test_config.yml` diff --git a/composer.json b/composer.json index 4bbc541..bad4b1a 100644 --- a/composer.json +++ b/composer.json @@ -15,15 +15,16 @@ }, "require": { "php": "^7.1", - "oxid-esales/graphql-base": "^1.2" + "oxid-esales/graphql-base": "^2.3" }, "require-dev": { "phpunit/phpunit": "^7.5", - "squizlabs/php_codesniffer": "^3.5.1", + "squizlabs/php_codesniffer": "^3.5.2", "jakub-onderka/php-parallel-lint": "^1.0", "phpstan/phpstan": "^0.12", - "oxid-esales/oxideshop-ce": "6.5", - "oxid-esales/oxideshop-unified-namespace-generator": "^2.0" + "oxid-esales/oxideshop-ce": "^6.5", + "oxid-esales/oxideshop-unified-namespace-generator": "^2.0", + "friendsofphp/php-cs-fixer": "^2.16" }, "autoload": { "psr-4": { @@ -44,16 +45,24 @@ ], "post-create-project-cmd": [ "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:lint": "phpcs", + "test:lint-fixer": "php-cs-fixer fix --dry-run", "test:static": "phpstan analyse src/", "test:unit": "phpunit -c tests/phpunit.xml tests/Unit/", "test": [ - "@test:lint", "@test:syntax", + "@test:lint", + "@test:lint-fixer", "@test:static", "@test:unit" ] diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000..af7b4a0 --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,10 @@ + + + src/ + tests/ + + + + + + diff --git a/phpstan.baseline.neon b/phpstan.baseline.neon deleted file mode 100644 index 00d512b..0000000 --- a/phpstan.baseline.neon +++ /dev/null @@ -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 diff --git a/phpstan.neon b/phpstan.neon index 8edfb46..0c493f5 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,8 +1,6 @@ -includes: - - phpstan.baseline.neon - parameters: level: max inferPrivatePropertyTypeFromConstructor: true autoload_files: - vendor/oxid-esales/oxideshop-ce/source/oxfunctions.php + - vendor/oxid-esales/oxideshop-ce/source/overridablefunctions.php diff --git a/src/Controller/Category.php b/src/Controller/Category.php index 242d936..4520b36 100644 --- a/src/Controller/Category.php +++ b/src/Controller/Category.php @@ -1,11 +1,17 @@ load($id)) { - return null; + throw CategoryNotFound::byId($id); } - $category = CategoryDataObject::createFromModel($category); - return $category; + + return new CategoryDataObject( + $category + ); } } diff --git a/src/DataObject/Category.php b/src/DataObject/Category.php index 981597b..5e10694 100644 --- a/src/DataObject/Category.php +++ b/src/DataObject/Category.php @@ -1,78 +1,48 @@ id = $id; - $this->name = $name; - $this->parentid = $parentid; - $this->timestamp = $timestamp; + $this->category = $category; } - public static function createFromModel(CategoryModel $category): self + /** + * @Field + */ + public function getId(): ID { - return new self( - $category->getId(), - (string)$category->oxcategories__oxtitle, - (string)$category->oxcategories__oxpartentid, - new \DateTimeImmutable((string)$category->oxcategories__oxtimestamp) + return new ID( + $this->category->getId() ); } /** - * @Field(outputType="ID") + * @Field */ - public function getId(): string + public function getTitle(): string { - return $this->id; - } - - /** - * @Field() - */ - public function getName(): string - { - return $this->name; - } - - public function getParentid(): string - { - return $this->parentid; - } - - /** - * @Field() - */ - public function getTimestamp(): \DateTimeInterface - { - return $this->timestamp; + return (string) $this->category->getFieldData('oxtitle'); } } diff --git a/src/Exception/CategoryNotFound.php b/src/Exception/CategoryNotFound.php new file mode 100644 index 0000000..e0fb416 --- /dev/null +++ b/src/Exception/CategoryNotFound.php @@ -0,0 +1,22 @@ + __DIR__ . '/../Controller/' + '\\__Vendor__\\GraphQL\\__Package__\\Controller' => __DIR__ . '/../Controller/', ]; } public function getTypeNamespaceMapping(): array { return [ - '\\__Vendor__\\GraphQL\\__Package__\\DataObject' => __DIR__ . '/../DataObject/' + '\\__Vendor__\\GraphQL\\__Package__\\DataObject' => __DIR__ . '/../DataObject/', ]; } } diff --git a/tests/Integration/Controller/CategoryTest.php b/tests/Integration/Controller/CategoryTest.php index 8849c3e..3aea809 100644 --- a/tests/Integration/Controller/CategoryTest.php +++ b/tests/Integration/Controller/CategoryTest.php @@ -1,5 +1,10 @@ execQuery('query { category }'); - $this->assertEquals( + $result = $this->execQuery('query { category }'); + $this->assertSame( 400, - static::$queryResult['status'] + $result['status'] ); } } diff --git a/tests/Unit/Framework/NamespaceMapperTest.php b/tests/Unit/Framework/NamespaceMapperTest.php index 078a137..3484b8a 100644 --- a/tests/Unit/Framework/NamespaceMapperTest.php +++ b/tests/Unit/Framework/NamespaceMapperTest.php @@ -1,5 +1,10 @@ assertCount(