From 5d736b509f73230fe75db8383adbbc1078b81c73 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Wed, 25 Sep 2024 16:18:58 +0200 Subject: [PATCH 1/7] chore: add ddev configuration --- .ddev/config.yaml | 277 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 .ddev/config.yaml diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 00000000..e66a8810 --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,277 @@ +name: apiato-core +type: php +docroot: "" +php_version: "8.1" +webserver_type: nginx-fpm +xdebug_enabled: false +additional_hostnames: [] +additional_fqdns: [] +omit_containers: [db] +use_dns_when_possible: true +composer_version: "2" +web_environment: [] +corepack_enable: false + +# Key features of DDEV's config.yaml: + +# name: # Name of the project, automatically provides +# http://projectname.ddev.site and https://projectname.ddev.site + +# type: # backdrop, craftcms, django4, drupal, drupal6, drupal7, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress +# See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more +# information on the different project types +# "drupal" covers recent Drupal 8+ + +# docroot: # Relative path to the directory containing index.php. + +# php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4" + +# You can explicitly specify the webimage but this +# is not recommended, as the images are often closely tied to DDEV's' behavior, +# so this can break upgrades. + +# webimage: # nginx/php docker image. + +# database: +# type: # mysql, mariadb, postgres +# version: # database version, like "10.11" or "8.0" +# MariaDB versions can be 5.5-10.8, 10.11, and 11.4. +# MySQL versions can be 5.5-8.0. +# PostgreSQL versions can be 9-16. + +# router_http_port: # Port to be used for http (defaults to global configuration, usually 80) +# router_https_port: # Port for https (defaults to global configuration, usually 443) + +# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, +# as leaving Xdebug enabled all the time is a big performance hit. + +# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, +# as leaving Xhprof enabled all the time is a big performance hit. + +# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn + +# timezone: Europe/Berlin +# This is the timezone used in the containers and by PHP; +# it can be set to any valid timezone, +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# For example Europe/Dublin or MST7MDT + +# composer_root: +# Relative path to the Composer root directory from the project root. This is +# the directory which contains the composer.json and where all Composer related +# commands are executed. + +# composer_version: "2" +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 +# to use the latest major version available at the time your container is built. +# It is also possible to use each other Composer version channel. This includes: +# - 2.2 (latest Composer LTS version) +# - stable +# - preview +# - snapshot +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". +# To reinstall Composer after the image was built, run "ddev debug refresh". + +# nodejs_version: "20" +# change from the default system Node.js version to any other version. +# See https://ddev.readthedocs.io/en/stable/users/configuration/config/#nodejs_version for more information +# and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation, +# Note that using of 'ddev nvm' is discouraged because "nodejs_version" is much easier to use, +# can specify any version, and is more robust than using 'nvm'. + +# corepack_enable: false +# Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm + +# additional_hostnames: +# - somename +# - someothername +# would provide http and https URLs for "somename.ddev.site" +# and "someothername.ddev.site". + +# additional_fqdns: +# - example.com +# - sub1.example.com +# would provide http and https URLs for "example.com" and "sub1.example.com" +# Please take care with this because it can cause great confusion. + +# upload_dirs: "custom/upload/dir" +# +# upload_dirs: +# - custom/upload/dir +# - ../private +# +# would set the destination paths for ddev import-files to /custom/upload/dir +# When Mutagen is enabled this path is bind-mounted so that all the files +# in the upload_dirs don't have to be synced into Mutagen. + +# disable_upload_dirs_warning: false +# If true, turns off the normal warning that says +# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" + +# ddev_version_constraint: "" +# Example: +# ddev_version_constraint: ">= 1.22.4" +# This will enforce that the running ddev version is within this constraint. +# See https://github.com/Masterminds/semver#checking-version-constraints for +# supported constraint formats + +# working_dir: +# web: /var/www/html +# db: /home +# would set the default working directory for the web and db services. +# These values specify the destination directory for ddev ssh and the +# directory in which commands passed into ddev exec are run. + +# omit_containers: [db, ddev-ssh-agent] +# Currently only these containers are supported. Some containers can also be +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit +# the "db" container, several standard features of DDEV that access the +# database container will be unusable. In the global configuration it is also +# possible to omit ddev-router, but not here. + +# performance_mode: "global" +# DDEV offers performance optimization strategies to improve the filesystem +# performance depending on your host system. Should be configured globally. +# +# If set, will override the global config. Possible values are: +# - "global": uses the value from the global config. +# - "none": disables performance optimization for this project. +# - "mutagen": enables Mutagen for this project. +# - "nfs": enables NFS for this project. +# +# See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs +# See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen + +# fail_on_hook_fail: False +# Decide whether 'ddev start' should be interrupted by a failing hook + +# host_https_port: "59002" +# The host port binding for https can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_webserver_port: "59001" +# The host port binding for the ddev-webserver can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_db_port: "59002" +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic +# unless explicitly specified. + +# mailpit_http_port: "8025" +# mailpit_https_port: "8026" +# The Mailpit ports can be changed from the default 8025 and 8026 + +# host_mailpit_port: "8025" +# The mailpit port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be bound directly to localhost if specified here. + +# webimage_extra_packages: [php7.4-tidy, php-bcmath] +# Extra Debian packages that are needed in the webimage can be added here + +# dbimage_extra_packages: [telnet,netcat] +# Extra Debian packages that are needed in the dbimage can be added here + +# use_dns_when_possible: true +# If the host has internet access and the domain configured can +# successfully be looked up, DNS will be used for hostname resolution +# instead of editing /etc/hosts +# Defaults to true + +# project_tld: ddev.site +# The top-level domain used for project URLs +# The default "ddev.site" allows DNS lookup via a wildcard +# If you prefer you can change this to "ddev.local" to preserve +# pre-v1.9 behavior. + +# ngrok_args: --basic-auth username:pass1234 +# Provide extra flags to the "ngrok http" command, see +# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" + +# disable_settings_management: false +# If true, DDEV will not create CMS-specific settings files like +# Drupal's settings.php/settings.ddev.php or TYPO3's additional.php +# In this case the user must provide all such settings. + +# You can inject environment variables into the web container with: +# web_environment: +# - SOMEENV=somevalue +# - SOMEOTHERENV=someothervalue + +# no_project_mount: false +# (Experimental) If true, DDEV will not mount the project into the web container; +# the user is responsible for mounting it manually or via a script. +# This is to enable experimentation with alternate file mounting strategies. +# For advanced users only! + +# bind_all_interfaces: false +# If true, host ports will be bound on all network interfaces, +# not the localhost interface only. This means that ports +# will be available on the local network if the host firewall +# allows it. + +# default_container_timeout: 120 +# The default time that DDEV waits for all containers to become ready can be increased from +# the default 120. This helps in importing huge databases, for example. + +#web_extra_exposed_ports: +#- name: nodejs +# container_port: 3000 +# http_port: 2999 +# https_port: 3000 +#- name: something +# container_port: 4000 +# https_port: 4000 +# http_port: 3999 +# Allows a set of extra ports to be exposed via ddev-router +# Fill in all three fields even if you don’t intend to use the https_port! +# If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. +# +# The port behavior on the ddev-webserver must be arranged separately, for example +# using web_extra_daemons. +# For example, with a web app on port 3000 inside the container, this config would +# expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 +# web_extra_exposed_ports: +# - name: myapp +# container_port: 3000 +# http_port: 9998 +# https_port: 9999 + +#web_extra_daemons: +#- name: "http-1" +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" +# directory: /var/www/html +#- name: "http-2" +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" +# directory: /var/www/html + +# override_config: false +# By default, config.*.yaml files are *merged* into the configuration +# But this means that some things can't be overridden +# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge +# and you can't erase existing hooks or all environment variables. +# However, with "override_config: true" in a particular config.*.yaml file, +# 'use_dns_when_possible: false' can override the existing values, and +# hooks: +# post-start: [] +# or +# web_environment: [] +# or +# additional_hostnames: [] +# can have their intended affect. 'override_config' affects only behavior of the +# config.*.yaml file it exists in. + +# Many DDEV commands can be extended to run tasks before or after the +# DDEV command is executed, for example "post-start", "post-import-db", +# "pre-composer", "post-composer" +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more +# information on the commands that can be extended and the tasks you can define +# for them. Example: +#hooks: From 4515ecc79cec3282b21c320bdc18a910974bd9da Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 15:02:59 +0330 Subject: [PATCH 2/7] test: add missing coverage attributes --- tests/Unit/Services/ResponseTest.php | 2 ++ tests/Unit/Traits/ResponseTraitTest.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tests/Unit/Services/ResponseTest.php b/tests/Unit/Services/ResponseTest.php index 2001d568..05bac0d5 100644 --- a/tests/Unit/Services/ResponseTest.php +++ b/tests/Unit/Services/ResponseTest.php @@ -11,8 +11,10 @@ use Apiato\Core\Tests\Unit\UnitTestCase; use Illuminate\Support\Facades\Config; use Illuminate\Testing\Fluent\AssertableJson; +use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +#[CoversClass(Response::class)] class ResponseTest extends UnitTestCase { private const FIELDSET_KEY = 'fieldset'; diff --git a/tests/Unit/Traits/ResponseTraitTest.php b/tests/Unit/Traits/ResponseTraitTest.php index 5991266a..92f2d21a 100644 --- a/tests/Unit/Traits/ResponseTraitTest.php +++ b/tests/Unit/Traits/ResponseTraitTest.php @@ -8,7 +8,9 @@ use Apiato\Core\Tests\Infrastructure\Doubles\UserTransformer; use Apiato\Core\Tests\Unit\UnitTestCase; use Apiato\Core\Traits\ResponseTrait; +use PHPUnit\Framework\Attributes\CoversClass; +#[CoversClass(ResponseTrait::class)] class ResponseTraitTest extends UnitTestCase { private $trait; From 63d5b5d5ef3a944a372ae3c850f64021f38d898f Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 15:03:40 +0330 Subject: [PATCH 3/7] test: remove group attribute we dont group tests anymore --- tests/Unit/Abstracts/Repositories/RepositoryTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Unit/Abstracts/Repositories/RepositoryTest.php b/tests/Unit/Abstracts/Repositories/RepositoryTest.php index db023f9e..ac7a046f 100644 --- a/tests/Unit/Abstracts/Repositories/RepositoryTest.php +++ b/tests/Unit/Abstracts/Repositories/RepositoryTest.php @@ -10,9 +10,7 @@ use Illuminate\Support\Collection; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\Attributes\Group; -#[Group('ship')] #[CoversClass(Repository::class)] final class RepositoryTest extends UnitTestCase { From d6658de08715ec494d3e3378400785680b905b71 Mon Sep 17 00:00:00 2001 From: Rafael Carrasco Date: Sun, 29 Sep 2024 08:54:15 -0300 Subject: [PATCH 4/7] fix: nullabe arrays of decoded ids were retrieved as [null] (#211) * fix: nullabe arrays of decoded ids were retrieved as [null] * test: add covers attribute --------- Co-authored-by: Mohammad Alavi --- src/Traits/HashIdTrait.php | 5 ++++ tests/Unit/Traits/HashIdTraitTest.php | 36 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/Unit/Traits/HashIdTraitTest.php diff --git a/src/Traits/HashIdTrait.php b/src/Traits/HashIdTrait.php index a2a720e6..fa87bb35 100644 --- a/src/Traits/HashIdTrait.php +++ b/src/Traits/HashIdTrait.php @@ -143,6 +143,11 @@ private function locateAndDecodeIds($requestData, $key): mixed */ private function processField($data, $keysTodo, $currentFieldName): mixed { + // is the current field a null?! we can give it back and chill out + if(is_null($data)) { + return $data; + } + // check if there are no more fields to be processed if (empty($keysTodo)) { // there are no more keys left - so basically we need to decode this entry diff --git a/tests/Unit/Traits/HashIdTraitTest.php b/tests/Unit/Traits/HashIdTraitTest.php new file mode 100644 index 00000000..0f2192d4 --- /dev/null +++ b/tests/Unit/Traits/HashIdTraitTest.php @@ -0,0 +1,36 @@ +trait = new class { + use HashIdTrait; + }; + } + + public function testProcessFieldShouldNotWrapANullInAnArray(): void + { + $data = null; + $keysTodo = ['*']; + $currentFieldName = null; + $reflection = new ReflectionClass($this->trait); + $method = $reflection->getMethod('processField'); + + $result = $method->invoke($this->trait, $data, $keysTodo, $currentFieldName); + + $this->assertNull($result); + } +} From e3205d67792e5d329dbd6b7b8fb4f9c4e762bbdd Mon Sep 17 00:00:00 2001 From: Mohammad-Alavi Date: Sun, 29 Sep 2024 11:54:28 +0000 Subject: [PATCH 5/7] style: apply automated php-cs-fixer changes --- src/Traits/HashIdTrait.php | 4 ++-- tests/Unit/Traits/HashIdTraitTest.php | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Traits/HashIdTrait.php b/src/Traits/HashIdTrait.php index fa87bb35..34c292b7 100644 --- a/src/Traits/HashIdTrait.php +++ b/src/Traits/HashIdTrait.php @@ -144,8 +144,8 @@ private function locateAndDecodeIds($requestData, $key): mixed private function processField($data, $keysTodo, $currentFieldName): mixed { // is the current field a null?! we can give it back and chill out - if(is_null($data)) { - return $data; + if (is_null($data)) { + return $data; } // check if there are no more fields to be processed diff --git a/tests/Unit/Traits/HashIdTraitTest.php b/tests/Unit/Traits/HashIdTraitTest.php index 0f2192d4..7e843aa3 100644 --- a/tests/Unit/Traits/HashIdTraitTest.php +++ b/tests/Unit/Traits/HashIdTraitTest.php @@ -5,7 +5,6 @@ use Apiato\Core\Tests\Unit\UnitTestCase; use Apiato\Core\Traits\HashIdTrait; use PHPUnit\Framework\Attributes\CoversClass; -use ReflectionClass; #[CoversClass(HashIdTrait::class)] class HashIdTraitTest extends UnitTestCase @@ -26,7 +25,7 @@ public function testProcessFieldShouldNotWrapANullInAnArray(): void $data = null; $keysTodo = ['*']; $currentFieldName = null; - $reflection = new ReflectionClass($this->trait); + $reflection = new \ReflectionClass($this->trait); $method = $reflection->getMethod('processField'); $result = $method->invoke($this->trait, $data, $keysTodo, $currentFieldName); From 0bc73c8e03a49ef116b5d320c2000a4c033473cb Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 15:52:36 +0330 Subject: [PATCH 6/7] feat: ignore ddev generated files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ffa641b0..e0b4b1a9 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ aliases /psalm_cache/ .bash_aliases .DS_Store +.ddev From 7ef3525075809ad2ebd5aac1387e52c5e0d2e326 Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 16:00:27 +0330 Subject: [PATCH 7/7] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e0b4b1a9..eddce977 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ aliases /psalm_cache/ .bash_aliases .DS_Store -.ddev +/.ddev/* +!/.ddev/config.yaml