From a68c6d6a3d585fe3c8287001a2bf534f983ccf9c Mon Sep 17 00:00:00 2001 From: Luca Gallinari Date: Thu, 29 Aug 2024 11:54:35 +0200 Subject: [PATCH] Init commit --- .docker/nginx/nginx.conf | 48 ++ .docker/php/php.ini | 5 + .editorconfig | 82 ++++ .github/CODEOWNERS | 1 + .github/workflows/build.yml | 183 +++++++ .gitignore | 19 + Makefile | 36 ++ README.md | 212 ++++++++ behat.yml.dist | 62 +++ bin/create_node_symlink.php | 45 ++ composer.json | 112 +++++ config/config.php | 9 + config/packages/.gitignore | 0 config/services.php | 9 + config/services/cache.php | 11 + config/services/form.php | 17 + config/services/gateway_config.php | 19 + config/services/logger.php | 11 + config/services/validator.php | 18 + config/shop_ajax_routing.php | 9 + config/shop_routing.php | 9 + config/validation/PaymentMethod.xml | 11 + docker-compose.override.sample.yml | 13 + docker-compose.yml | 31 ++ e2e-test-server.sh | 5 + ecs.php | 20 + etc/build/.gitignore | 0 migrations/.gitkeep | 0 node_modules | 1 + phpspec.yml.dist | 4 + phpstan.neon | 20 + phpunit.xml.dist | 22 + psalm.xml | 15 + public/poll_payment.js | 19 + .../PausePayPaymentMethodsResolverSpec.php | 127 +++++ src/DependencyInjection/Configuration.php | 22 + .../WebgriffeSyliusPausePayExtension.php | 46 ++ ...SyliusPausePayGatewayConfigurationType.php | 40 ++ src/Payum/PausePayApi.php | 35 ++ src/Payum/PausePayGatewayFactory.php | 37 ++ src/Validator/PausePayPaymentMethodUnique.php | 20 + .../PausePayPaymentMethodUniqueValidator.php | 61 +++ src/WebgriffeSyliusPausePayPlugin.php | 19 + symfony.lock | 457 ++++++++++++++++++ templates/Process/index.html.twig | 25 + tests/Application/.env | 33 ++ tests/Application/.env.test | 11 + tests/Application/.eslintrc.js | 20 + tests/Application/.gitignore | 23 + tests/Application/Kernel.php | 97 ++++ tests/Application/assets/admin/entry.js | 0 tests/Application/assets/shop/entry.js | 0 tests/Application/bin/console | 38 ++ tests/Application/composer.json | 5 + .../config/api_platform/.gitignore | 0 tests/Application/config/bootstrap.php | 27 ++ tests/Application/config/bundles.php | 66 +++ tests/Application/config/jwt/private.pem | 54 +++ tests/Application/config/jwt/public.pem | 14 + .../Application/config/packages/_sylius.yaml | 18 + .../config/packages/api_platform.yaml | 10 + tests/Application/config/packages/assets.yaml | 7 + .../config/packages/dev/framework.yaml | 2 + .../config/packages/dev/jms_serializer.yaml | 12 + .../config/packages/dev/monolog.yaml | 9 + .../config/packages/dev/routing.yaml | 3 + .../config/packages/dev/web_profiler.yaml | 3 + .../Application/config/packages/doctrine.yaml | 27 ++ .../config/packages/doctrine_migrations.yaml | 4 + .../Application/config/packages/fos_rest.yaml | 11 + .../config/packages/framework.yaml | 9 + .../config/packages/jms_serializer.yaml | 4 + .../packages/lexik_jwt_authentication.yaml | 4 + .../config/packages/liip_imagine.yaml | 6 + tests/Application/config/packages/mailer.yaml | 3 + .../Application/config/packages/monolog.yaml | 7 + .../config/packages/prod/doctrine.yaml | 31 ++ .../config/packages/prod/jms_serializer.yaml | 10 + .../config/packages/prod/monolog.yaml | 10 + .../Application/config/packages/routing.yaml | 3 + .../Application/config/packages/security.yaml | 124 +++++ .../config/packages/staging/monolog.yaml | 10 + .../packages/stof_doctrine_extensions.yaml | 4 + .../config/packages/test/framework.yaml | 4 + .../config/packages/test/mailer.yaml | 5 + .../config/packages/test/monolog.yaml | 6 + .../config/packages/test/security.yaml | 6 + .../config/packages/test/sylius_theme.yaml | 3 + .../config/packages/test/sylius_uploader.yaml | 3 + .../config/packages/test/web_profiler.yaml | 6 + .../config/packages/test_cached/doctrine.yaml | 16 + .../config/packages/test_cached/fos_rest.yaml | 3 + .../packages/test_cached/framework.yaml | 2 + .../config/packages/test_cached/mailer.yaml | 2 + .../config/packages/test_cached/monolog.yaml | 6 + .../config/packages/test_cached/security.yaml | 2 + .../packages/test_cached/sylius_channel.yaml | 2 + .../packages/test_cached/sylius_theme.yaml | 3 + .../packages/test_cached/sylius_uploader.yaml | 2 + .../config/packages/test_cached/twig.yaml | 2 + .../config/packages/translation.yaml | 8 + tests/Application/config/packages/twig.yaml | 12 + .../config/packages/validator.yaml | 3 + .../webgriffe_sylius_pausepay_plugin.yaml | 2 + .../config/packages/webpack_encore.yaml | 5 + tests/Application/config/routes.yaml | 0 .../config/routes/dev/web_profiler.yaml | 7 + .../config/routes/liip_imagine.yaml | 2 + .../config/routes/sylius_admin.yaml | 3 + .../Application/config/routes/sylius_api.yaml | 3 + .../config/routes/sylius_shop.yaml | 14 + .../config/routes/test/routing.yaml | 5 + .../routes/test/sylius_test_plugin.yaml | 5 + .../config/routes/test_cached/routing.yaml | 5 + .../test_cached/sylius_test_plugin.yaml | 5 + .../webgriffe_sylius_pausepay_plugin.yaml | 11 + .../Application/config/secrets/dev/.gitignore | 0 .../config/secrets/prod/.gitignore | 0 .../config/secrets/test/.gitignore | 0 .../config/secrets/test_cached/.gitignore | 0 .../config/serialization/.gitignore | 0 tests/Application/config/services.yaml | 4 + .../config/services/test/client.php | 17 + tests/Application/config/services_test.yaml | 9 + .../config/services_test_cached.yaml | 2 + tests/Application/package.json | 13 + tests/Application/public/.htaccess | 25 + tests/Application/public/favicon.ico | Bin 0 -> 32038 bytes tests/Application/public/index.php | 29 ++ tests/Application/public/robots.txt | 4 + tests/Application/templates/.gitignore | 0 .../SyliusAdminBundle/Layout/_logo.html.twig | 5 + .../Security/_content.html.twig | 6 + .../SyliusAdminBundle/_scripts.html.twig | 1 + .../SyliusAdminBundle/_styles.html.twig | 1 + .../Homepage/_banner.html.twig | 9 + .../Layout/Header/_logo.html.twig | 5 + .../SyliusShopBundle/_scripts.html.twig | 1 + .../SyliusShopBundle/_styles.html.twig | 1 + tests/Application/translations/.gitignore | 0 tests/Application/webpack.config.js | 49 ++ tests/Behat/Resources/services.php | 9 + tests/Behat/Resources/suites.yml | 0 143 files changed, 3039 insertions(+) create mode 100644 .docker/nginx/nginx.conf create mode 100644 .docker/php/php.ini create mode 100644 .editorconfig create mode 100644 .github/CODEOWNERS create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 behat.yml.dist create mode 100644 bin/create_node_symlink.php create mode 100644 composer.json create mode 100644 config/config.php create mode 100644 config/packages/.gitignore create mode 100644 config/services.php create mode 100644 config/services/cache.php create mode 100644 config/services/form.php create mode 100644 config/services/gateway_config.php create mode 100644 config/services/logger.php create mode 100644 config/services/validator.php create mode 100644 config/shop_ajax_routing.php create mode 100644 config/shop_routing.php create mode 100644 config/validation/PaymentMethod.xml create mode 100644 docker-compose.override.sample.yml create mode 100644 docker-compose.yml create mode 100755 e2e-test-server.sh create mode 100644 ecs.php create mode 100644 etc/build/.gitignore create mode 100644 migrations/.gitkeep create mode 120000 node_modules create mode 100644 phpspec.yml.dist create mode 100644 phpstan.neon create mode 100644 phpunit.xml.dist create mode 100644 psalm.xml create mode 100644 public/poll_payment.js create mode 100644 spec/Resolver/PausePayPaymentMethodsResolverSpec.php create mode 100644 src/DependencyInjection/Configuration.php create mode 100644 src/DependencyInjection/WebgriffeSyliusPausePayExtension.php create mode 100644 src/Form/Type/SyliusPausePayGatewayConfigurationType.php create mode 100644 src/Payum/PausePayApi.php create mode 100644 src/Payum/PausePayGatewayFactory.php create mode 100644 src/Validator/PausePayPaymentMethodUnique.php create mode 100644 src/Validator/PausePayPaymentMethodUniqueValidator.php create mode 100644 src/WebgriffeSyliusPausePayPlugin.php create mode 100644 symfony.lock create mode 100644 templates/Process/index.html.twig create mode 100644 tests/Application/.env create mode 100644 tests/Application/.env.test create mode 100644 tests/Application/.eslintrc.js create mode 100644 tests/Application/.gitignore create mode 100644 tests/Application/Kernel.php create mode 100644 tests/Application/assets/admin/entry.js create mode 100644 tests/Application/assets/shop/entry.js create mode 100755 tests/Application/bin/console create mode 100644 tests/Application/composer.json create mode 100644 tests/Application/config/api_platform/.gitignore create mode 100644 tests/Application/config/bootstrap.php create mode 100644 tests/Application/config/bundles.php create mode 100644 tests/Application/config/jwt/private.pem create mode 100644 tests/Application/config/jwt/public.pem create mode 100644 tests/Application/config/packages/_sylius.yaml create mode 100644 tests/Application/config/packages/api_platform.yaml create mode 100644 tests/Application/config/packages/assets.yaml create mode 100644 tests/Application/config/packages/dev/framework.yaml create mode 100644 tests/Application/config/packages/dev/jms_serializer.yaml create mode 100644 tests/Application/config/packages/dev/monolog.yaml create mode 100644 tests/Application/config/packages/dev/routing.yaml create mode 100644 tests/Application/config/packages/dev/web_profiler.yaml create mode 100644 tests/Application/config/packages/doctrine.yaml create mode 100644 tests/Application/config/packages/doctrine_migrations.yaml create mode 100644 tests/Application/config/packages/fos_rest.yaml create mode 100644 tests/Application/config/packages/framework.yaml create mode 100644 tests/Application/config/packages/jms_serializer.yaml create mode 100644 tests/Application/config/packages/lexik_jwt_authentication.yaml create mode 100644 tests/Application/config/packages/liip_imagine.yaml create mode 100644 tests/Application/config/packages/mailer.yaml create mode 100644 tests/Application/config/packages/monolog.yaml create mode 100644 tests/Application/config/packages/prod/doctrine.yaml create mode 100644 tests/Application/config/packages/prod/jms_serializer.yaml create mode 100644 tests/Application/config/packages/prod/monolog.yaml create mode 100644 tests/Application/config/packages/routing.yaml create mode 100644 tests/Application/config/packages/security.yaml create mode 100644 tests/Application/config/packages/staging/monolog.yaml create mode 100644 tests/Application/config/packages/stof_doctrine_extensions.yaml create mode 100644 tests/Application/config/packages/test/framework.yaml create mode 100644 tests/Application/config/packages/test/mailer.yaml create mode 100644 tests/Application/config/packages/test/monolog.yaml create mode 100644 tests/Application/config/packages/test/security.yaml create mode 100644 tests/Application/config/packages/test/sylius_theme.yaml create mode 100644 tests/Application/config/packages/test/sylius_uploader.yaml create mode 100644 tests/Application/config/packages/test/web_profiler.yaml create mode 100644 tests/Application/config/packages/test_cached/doctrine.yaml create mode 100644 tests/Application/config/packages/test_cached/fos_rest.yaml create mode 100644 tests/Application/config/packages/test_cached/framework.yaml create mode 100644 tests/Application/config/packages/test_cached/mailer.yaml create mode 100644 tests/Application/config/packages/test_cached/monolog.yaml create mode 100644 tests/Application/config/packages/test_cached/security.yaml create mode 100644 tests/Application/config/packages/test_cached/sylius_channel.yaml create mode 100644 tests/Application/config/packages/test_cached/sylius_theme.yaml create mode 100644 tests/Application/config/packages/test_cached/sylius_uploader.yaml create mode 100644 tests/Application/config/packages/test_cached/twig.yaml create mode 100644 tests/Application/config/packages/translation.yaml create mode 100644 tests/Application/config/packages/twig.yaml create mode 100644 tests/Application/config/packages/validator.yaml create mode 100644 tests/Application/config/packages/webgriffe_sylius_pausepay_plugin.yaml create mode 100644 tests/Application/config/packages/webpack_encore.yaml create mode 100644 tests/Application/config/routes.yaml create mode 100644 tests/Application/config/routes/dev/web_profiler.yaml create mode 100644 tests/Application/config/routes/liip_imagine.yaml create mode 100644 tests/Application/config/routes/sylius_admin.yaml create mode 100644 tests/Application/config/routes/sylius_api.yaml create mode 100644 tests/Application/config/routes/sylius_shop.yaml create mode 100644 tests/Application/config/routes/test/routing.yaml create mode 100644 tests/Application/config/routes/test/sylius_test_plugin.yaml create mode 100644 tests/Application/config/routes/test_cached/routing.yaml create mode 100644 tests/Application/config/routes/test_cached/sylius_test_plugin.yaml create mode 100644 tests/Application/config/routes/webgriffe_sylius_pausepay_plugin.yaml create mode 100644 tests/Application/config/secrets/dev/.gitignore create mode 100644 tests/Application/config/secrets/prod/.gitignore create mode 100644 tests/Application/config/secrets/test/.gitignore create mode 100644 tests/Application/config/secrets/test_cached/.gitignore create mode 100644 tests/Application/config/serialization/.gitignore create mode 100644 tests/Application/config/services.yaml create mode 100644 tests/Application/config/services/test/client.php create mode 100644 tests/Application/config/services_test.yaml create mode 100644 tests/Application/config/services_test_cached.yaml create mode 100644 tests/Application/package.json create mode 100644 tests/Application/public/.htaccess create mode 100644 tests/Application/public/favicon.ico create mode 100644 tests/Application/public/index.php create mode 100644 tests/Application/public/robots.txt create mode 100644 tests/Application/templates/.gitignore create mode 100644 tests/Application/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig create mode 100644 tests/Application/templates/bundles/SyliusAdminBundle/Security/_content.html.twig create mode 100644 tests/Application/templates/bundles/SyliusAdminBundle/_scripts.html.twig create mode 100644 tests/Application/templates/bundles/SyliusAdminBundle/_styles.html.twig create mode 100644 tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig create mode 100644 tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig create mode 100644 tests/Application/templates/bundles/SyliusShopBundle/_scripts.html.twig create mode 100644 tests/Application/templates/bundles/SyliusShopBundle/_styles.html.twig create mode 100644 tests/Application/translations/.gitignore create mode 100644 tests/Application/webpack.config.js create mode 100644 tests/Behat/Resources/services.php create mode 100644 tests/Behat/Resources/suites.yml diff --git a/.docker/nginx/nginx.conf b/.docker/nginx/nginx.conf new file mode 100644 index 0000000..6bfbd29 --- /dev/null +++ b/.docker/nginx/nginx.conf @@ -0,0 +1,48 @@ +user www-data; +worker_processes auto; +daemon off; +pid /run/nginx.pid; + +include /etc/nginx/modules-enabled/*.conf; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + server_tokens off; + + client_max_body_size 64m; + sendfile on; + tcp_nodelay on; + tcp_nopush on; + + gzip_vary on; + + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + server { + listen 80; + + root /app/tests/Application/public; + index index.php; + + location / { + try_files $uri /index.php$is_args$args; + } + + location ~ \.php$ { + include fastcgi_params; + + fastcgi_pass unix:/var/run/php8-fpm.sock; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $realpath_root; + } + } +} diff --git a/.docker/php/php.ini b/.docker/php/php.ini new file mode 100644 index 0000000..13f0abe --- /dev/null +++ b/.docker/php/php.ini @@ -0,0 +1,5 @@ +[PHP] +memory_limit=512M + +[date] +date.timezone=${PHP_DATE_TIMEZONE} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b5f72a5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,82 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.feature] +indent_style = space +indent_size = 4 + +[*.js] +indent_style = space +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 2 + +[*.md] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = false + +[*.neon] +indent_style = space +indent_size = 4 + +[*.php] +indent_style = space +indent_size = 4 + +[*.sh] +indent_style = space +indent_size = 4 + +[*.{yaml,yml}] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = false + +[.babelrc] +indent_style = space +indent_size = 2 + +[.gitmodules] +indent_style = tab +indent_size = 4 + +[.php_cs{,.dist}] +indent_style = space +indent_size = 4 + +[composer.json] +indent_style = space +indent_size = 4 + +[package.json] +indent_style = space +indent_size = 2 + +[phpspec.yml{,.dist}] +indent_style = space +indent_size = 4 + +[phpstan.neon] +indent_style = space +indent_size = 4 + +[phpunit.xml{,.dist}] +indent_style = space +indent_size = 4 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..3abb1fb --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @webgriffe/wg-devs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..5b6d023 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,183 @@ +name: Build + +on: + push: + branches-ignore: + - 'dependabot/**' + pull_request: ~ + release: + types: [ created ] + schedule: + - + cron: "0 1 * * 6" # Run at 1am every Saturday + workflow_dispatch: ~ + +jobs: + tests: + runs-on: ubuntu-latest + + name: "Sylius ${{ matrix.sylius }}, PHP ${{ matrix.php }}, Symfony ${{ matrix.symfony }}, MySQL ${{ matrix.mysql }} Node ${{ matrix.node }}" + + strategy: + fail-fast: false + matrix: + php: [ "8.0" ] + sylius: [ "1.11.11" ] + symfony: [ "^5.4" ] + node: [ "20.x" ] + mysql: [ "8.0" ] + + env: + APP_ENV: test + DATABASE_URL: "mysql://root:root@127.0.0.1/sylius?serverVersion=${{ matrix.mysql }}" + + steps: + - + uses: actions/checkout@v3 + + - + name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "${{ matrix.php }}" + extensions: intl + tools: flex,symfony + coverage: none + + - + name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "${{ matrix.node }}" + + - + name: Shutdown default MySQL + run: sudo service mysql stop + + - + name: Setup MySQL + uses: mirromutth/mysql-action@v1.1 + with: + mysql version: "${{ matrix.mysql }}" + mysql root password: "root" + + - + name: Output PHP version for Symfony CLI + run: php -v | head -n 1 | awk '{ print $2 }' > .php-version + + - + name: Install certificates + run: symfony server:ca:install + + - + name: Run Chrome Headless + run: google-chrome-stable --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --allow-insecure-localhost --disable-translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --window-size=2880,1800 --proxy-server='direct://' --proxy-bypass-list='*' http://127.0.0.1 > /dev/null 2>&1 & + + - + name: Run webserver + run: (cd tests/Application && symfony server:start --port=8080 --dir=public --daemon) + + - + name: Validate composer.json + run: composer validate --ansi --strict + + - + name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - + name: Cache Composer + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json **/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php-${{ matrix.php }}-composer- + + - + name: Configure global composer + run: | + composer global config --no-plugins allow-plugins.symfony/flex true + composer global require --no-progress --no-scripts --no-plugins "symfony/flex:^2.2.2" + + - + name: Restrict Symfony version + if: matrix.symfony != '' + run: | + composer config extra.symfony.require "${{ matrix.symfony }}" + + - + name: Restrict Sylius version + if: matrix.sylius != '' + run: composer require "sylius/sylius:${{ matrix.sylius }}" --no-update --no-scripts --no-interaction + + - + name: Install PHP dependencies + run: composer install --no-interaction + env: + SYMFONY_REQUIRE: ${{ matrix.symfony }} + + - + name: Get Yarn cache directory + id: yarn-cache + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + + - + name: Cache Yarn + uses: actions/cache@v4 + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ matrix.node }}-yarn-${{ hashFiles('**/package.json **/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node-${{ matrix.node }}-yarn- + + - + name: Install JS dependencies + run: (cd tests/Application && yarn install) + + - + name: Prepare test application database + run: | + (cd tests/Application && bin/console doctrine:database:create -vvv) + (cd tests/Application && bin/console doctrine:schema:create -vvv) + + - + name: Prepare test application assets + run: | + (cd tests/Application && bin/console assets:install public -vvv) + (cd tests/Application && bin/console sylius:install:assets -vvv) + (cd tests/Application && yarn build:prod) + + - + name: Prepare test application cache + run: (cd tests/Application && bin/console cache:warmup -vvv) + + - + name: Load fixtures in test application + run: (cd tests/Application && bin/console sylius:fixtures:load -n) + + - + name: Install certificates + run: symfony server:ca:install + + - + name: Run webserver + run: (cd tests/Application && symfony server:start --port=8080 --dir=public --daemon) + + - + name: Run Chrome Headless + run: google-chrome-stable --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --disable-translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --window-size=2880,1800 --proxy-server='direct://' --proxy-bypass-list='*' https://127.0.0.1 > /dev/null 2>&1 & + + - + name: Run tests + run: composer tests + + - + name: Upload Behat logs + uses: actions/upload-artifact@v3 + if: failure() + with: + name: Behat logs + path: etc/build/ + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e015742 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +/vendor/ +/node_modules/ +/composer.lock + +/etc/build/* +!/etc/build/.gitignore + +/tests/Application/yarn.lock + +/.phpunit.result.cache +/behat.yml +/phpspec.yml +/phpunit.xml +.phpunit.result.cache + +# Symfony CLI https://symfony.com/doc/current/setup/symfony_server.html#different-php-settings-per-project +/.php-version +/php.ini +/docker-compose.override.yml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..01d9607 --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +phpunit: + vendor/bin/phpunit + +phpspec: + vendor/bin/phpspec run --ansi --no-interaction -f dot + +phpstan: + vendor/bin/phpstan analyse + +psalm: + vendor/bin/psalm + +behat-js: + APP_ENV=test vendor/bin/behat --colors --strict --no-interaction -vvv -f progress + +install: + composer install --no-interaction --no-scripts + +backend: + tests/Application/bin/console sylius:install --no-interaction + tests/Application/bin/console sylius:fixtures:load default --no-interaction + +frontend: + (cd tests/Application && yarn install --pure-lockfile) + (cd tests/Application && GULP_ENV=prod yarn build) + +behat: + APP_ENV=test vendor/bin/behat --colors --strict --no-interaction -vvv -f progress + +init: install backend frontend + +ci: init phpstan psalm phpunit phpspec behat + +integration: init phpunit behat + +static: install phpspec phpstan psalm diff --git a/README.md b/README.md new file mode 100644 index 0000000..97676aa --- /dev/null +++ b/README.md @@ -0,0 +1,212 @@ +

+ + + +

+ +

Sylius PausePay Plugin

+ +

Sylius plugin for PausePay payment method.

+ + +## Installation + +1. Run: + ```bash + composer require webgriffe/sylius-pausepay-plugin + ``` + +2. Add `Webgriffe\SyliusPausePayPlugin\WebgriffeSyliusPausePayPlugin::class => ['all' => true]` to your `config/bundles.php`. + + Normally, the plugin is automatically added to the `config/bundles.php` file by the `composer require` command. If it is not, you have to add it manually. + +3. Create a new file config/packages/webgriffe_sylius_pausepay_plugin.yaml: + ```yaml + imports: + - { resource: "@WebgriffeSyliusPausePayPlugin/config/config.php" } + ``` + +4. Import the routes needed for cancelling the payments. Add the following to your config/routes.yaml file: + ```yaml + webgriffe_sylius_pausepay_plugin_shop: + resource: "@WebgriffeSyliusPausePayPlugin/config/shop_routing.php" + prefix: /{_locale} + requirements: + _locale: ^[A-Za-z]{2,4}(_([A-Za-z]{4}|[0-9]{3}))?(_([A-Za-z]{2}|[0-9]{3}))?$ + + webgriffe_sylius_pausepay_plugin_ajax: + resource: "@WebgriffeSyliusPausePayPlugin/config/shop_ajax_routing.php" + + sylius_shop_payum_cancel: + resource: "@PayumBundle/Resources/config/routing/cancel.xml" + + ``` + **NB:** The file shop_routing needs to be after the prefix _locale, so that messages can be displayed in the right + language. You should also include the cancel routes from the Payum bundle if you do not have it already! + +5. Add the WebhookToken entity. Create a new file `src/Entity/Payment/WebhookToken.php` with the following content: + ```php + + window.afterUrl = "{{ afterUrl }}"; + window.paymentStatusUrl = "{{ paymentStatusUrl }}"; + + {{ encore_entry_script_tags('webgriffe-sylius-pausepay-entry', null, 'sylius.shop') }} + {% endblock %} + ``` + +## Usage + +Access to the admin panel and go to the `Payment methods` section. Create a new payment method and select `PausePay` +as gateway. Then, configure the payment method with the required parameters. + +## Contributing + +For a comprehensive guide on Sylius Plugins development please go to Sylius documentation, +there you will find the Plugin Development Guide, that is full of examples. + +### Quickstart Installation + +#### Traditional + +1. Run `composer create-project sylius/plugin-skeleton ProjectName`. + +2. From the plugin skeleton root directory, run the following commands: + + ```bash + $ (cd tests/Application && yarn install) + $ (cd tests/Application && yarn build) + $ (cd tests/Application && APP_ENV=test bin/console assets:install public) + + $ (cd tests/Application && APP_ENV=test bin/console doctrine:database:create) + $ (cd tests/Application && APP_ENV=test bin/console doctrine:schema:create) + ``` + +To be able to set up a plugin's database, remember to configure you database credentials in `tests/Application/.env` and `tests/Application/.env.test`. + +#### Docker + +1. Execute `docker compose up -d` + +2. Initialize plugin `docker compose exec app make init` + +3. See your browser `open localhost` + +## Usage + +#### Running plugin tests + + - PHPUnit + + ```bash + vendor/bin/phpunit + ``` + + - PHPSpec + + ```bash + vendor/bin/phpspec run + ``` + + - Behat (non-JS scenarios) + + ```bash + vendor/bin/behat --strict --tags="~@javascript" + ``` + + - Behat (JS scenarios) + + 1. [Install Symfony CLI command](https://symfony.com/download). + + 2. Start Headless Chrome: + + ```bash + google-chrome-stable --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --allow-insecure-localhost --disable-translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --window-size=2880,1800 --proxy-server='direct://' --proxy-bypass-list='*' http://127.0.0.1 + ``` + + 3. Install SSL certificates (only once needed) and run test application's webserver on `127.0.0.1:8080`: + + ```bash + symfony server:ca:install + APP_ENV=test symfony server:start --port=8080 --dir=tests/Application/public --daemon + ``` + + 4. Run Behat: + + ```bash + vendor/bin/behat --strict --tags="@javascript" + ``` + + - Static Analysis + + - Psalm + + ```bash + vendor/bin/psalm + ``` + + - PHPStan + + ```bash + vendor/bin/phpstan analyse -c phpstan.neon -l max src/ + ``` + + - Coding Standard + + ```bash + vendor/bin/ecs check + ``` + +#### Opening Sylius with your plugin + +- Using `test` environment: + + ```bash + (cd tests/Application && APP_ENV=test bin/console sylius:fixtures:load) + (cd tests/Application && APP_ENV=test bin/console server:run -d public) + ``` + +- Using `dev` environment: + + ```bash + (cd tests/Application && APP_ENV=dev bin/console sylius:fixtures:load) + (cd tests/Application && APP_ENV=dev bin/console server:run -d public) + ``` diff --git a/behat.yml.dist b/behat.yml.dist new file mode 100644 index 0000000..ba7c134 --- /dev/null +++ b/behat.yml.dist @@ -0,0 +1,62 @@ +imports: + - vendor/sylius/sylius/src/Sylius/Behat/Resources/config/suites.yml + - tests/Behat/Resources/suites.yml + +default: + formatters: + pretty: + verbose: true + paths: false + snippets: false + + extensions: + DMore\ChromeExtension\Behat\ServiceContainer\ChromeExtension: ~ + Robertfausk\Behat\PantherExtension: ~ + + FriendsOfBehat\MinkDebugExtension: + directory: etc/build + clean_start: false + screenshot: true + + Behat\MinkExtension: + files_path: "%paths.base%/vendor/sylius/sylius/src/Sylius/Behat/Resources/fixtures/" + base_url: "https://127.0.0.1:8080/" + default_session: symfony + javascript_session: chromedriver + sessions: + symfony: + symfony: ~ + chromedriver: + chrome: + api_url: http://127.0.0.1:9222 + validate_certificate: false + chrome_headless_second_session: + chrome: + api_url: http://127.0.0.1:9222 + validate_certificate: false + panther: + panther: + manager_options: + connection_timeout_in_ms: 5000 + request_timeout_in_ms: 120000 + chromedriver_arguments: + - --log-path=etc/build/chromedriver.log + - --verbose + capabilities: + acceptSslCerts: true + acceptInsecureCerts: true + unexpectedAlertBehaviour: accept + show_auto: false + + FriendsOfBehat\SymfonyExtension: + bootstrap: tests/Application/config/bootstrap.php + kernel: + class: Tests\Webgriffe\SyliusPausePayPlugin\Application\Kernel + + FriendsOfBehat\VariadicExtension: ~ + + FriendsOfBehat\SuiteSettingsExtension: + paths: + - "features" + + SyliusLabs\SuiteTagsExtension: ~ diff --git a/bin/create_node_symlink.php b/bin/create_node_symlink.php new file mode 100644 index 0000000..10d69b4 --- /dev/null +++ b/bin/create_node_symlink.php @@ -0,0 +1,45 @@ + `' . NODE_MODULES_FOLDER_NAME . '` already exists as a link or folder, keeping existing as may be intentional.' . PHP_EOL; + exit(0); + } else { + echo '> Invalid symlink `' . NODE_MODULES_FOLDER_NAME . '` detected, recreating...' . PHP_EOL; + if (!@unlink(NODE_MODULES_FOLDER_NAME)) { + echo '> Could not delete file `' . NODE_MODULES_FOLDER_NAME . '`.' . PHP_EOL; + exit(1); + } + } +} + +/* try to create the symlink using PHP internals... */ +$success = @symlink(PATH_TO_NODE_MODULES, NODE_MODULES_FOLDER_NAME); + +/* if case it has failed, but OS is Windows... */ +if (!$success && strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + /* ...then try a different approach which does not require elevated permissions and folder to exist */ + echo '> This system is running Windows, creation of links requires elevated privileges,' . PHP_EOL; + echo '> and target path to exist. Fallback to NTFS Junction:' . PHP_EOL; + exec(sprintf('mklink /J %s %s 2> NUL', NODE_MODULES_FOLDER_NAME, PATH_TO_NODE_MODULES), $output, $returnCode); + $success = $returnCode === 0; + if (!$success) { + echo '> Failed o create the required symlink' . PHP_EOL; + exit(2); + } +} + +$path = @readlink(NODE_MODULES_FOLDER_NAME); +/* check if link points to the intended directory */ +if ($path && realpath($path) === realpath(PATH_TO_NODE_MODULES)) { + echo '> Successfully created the symlink.' . PHP_EOL; + exit(0); +} + +echo '> Failed to create the symlink to `' . NODE_MODULES_FOLDER_NAME . '`.' . PHP_EOL; +exit(3); diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..f255737 --- /dev/null +++ b/composer.json @@ -0,0 +1,112 @@ +{ + "name": "webgriffe/sylius-pausepay-plugin", + "description": "Sylius plugin for PausePay payment gateway", + "type": "sylius-plugin", + "keywords": [ + "sylius", + "pausepay", + "pause pay", + "sylius-plugin" + ], + "license": "proprietary", + "require": { + "php": "^8.0", + "guzzlehttp/psr7": "^1.8 || ^2.5", + "php-http/discovery": "^1.19", + "psr/http-factory": "^1.0", + "sylius/sylius": "^1.11", + "symfony/webpack-encore-bundle": "^1.17" + }, + "require-dev": { + "behat/behat": "^3.14", + "behat/mink-selenium2-driver": "^1.6", + "dbrekelmans/bdi": "^1.1", + "dmore/behat-chrome-extension": "^1.4", + "dmore/chrome-mink-driver": "^2.9", + "friends-of-behat/mink": "^1.10", + "friends-of-behat/mink-browserkit-driver": "^1.6", + "friends-of-behat/mink-debug-extension": "^2.1", + "friends-of-behat/mink-extension": "^2.7", + "friends-of-behat/page-object-extension": "^0.3", + "friends-of-behat/suite-settings-extension": "^1.1", + "friends-of-behat/symfony-extension": "^2.0", + "friends-of-behat/variadic-extension": "^1.5", + "phpspec/phpspec": "^7.5", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-doctrine": "1.3.69", + "phpstan/phpstan-strict-rules": "^1.5", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "polishsymfonycommunity/symfony-mocker-container": "^1.0", + "robertfausk/behat-panther-extension": "^1.1", + "sylius-labs/coding-standard": "^4.3", + "sylius-labs/suite-tags-extension": "^0.2", + "symfony/asset": "^5.4", + "symfony/browser-kit": "^5.4", + "symfony/debug-bundle": "^5.4", + "symfony/dotenv": "^5.4", + "symfony/flex": "^2.4", + "symfony/intl": "^5.4", + "symfony/web-profiler-bundle": "^5.4", + "vimeo/psalm": "^5.9" + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": false, + "phpstan/extension-installer": true, + "symfony/flex": true, + "php-http/discovery": true + } + }, + "extra": { + "symfony": { + "require": "^6.4" + } + }, + "autoload": { + "psr-4": { + "Webgriffe\\SyliusPausePayPlugin\\": "src/", + "Tests\\Webgriffe\\SyliusPausePayPlugin\\": "tests/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\Webgriffe\\SyliusPausePayPlugin\\App\\": "tests/Application/src" + }, + "classmap": [ + "tests/Application/Kernel.php" + ] + }, + "scripts": { + "post-install-cmd": [ + "php bin/create_node_symlink.php" + ], + "post-update-cmd": [ + "php bin/create_node_symlink.php" + ], + "post-create-project-cmd": [ + "php bin/create_node_symlink.php" + ], + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd", + "security-checker security:check": "script" + }, + "ecs": "vendor/bin/ecs check", + "phpstan": "vendor/bin/phpstan analyse", + "psalm": "vendor/bin/psalm", + "phpspec": "vendor/bin/phpspec run --ansi -f progress --no-interaction", + "unit": "vendor/bin/phpunit --colors=always", + "behat": "vendor/bin/behat --colors --strict -vvv --no-interaction || vendor/bin/behat --colors --strict -vvv --no-interaction --rerun", + "tests": [ + "@ecs", + "@phpstan", + "@psalm", + "@phpspec", + "@unit", + "@behat" + ] + } +} diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..1a49f0b --- /dev/null +++ b/config/config.php @@ -0,0 +1,9 @@ +import('packages/*.php'); +}; diff --git a/config/packages/.gitignore b/config/packages/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..8cc3ee1 --- /dev/null +++ b/config/services.php @@ -0,0 +1,9 @@ +import('services/*.php'); +}; diff --git a/config/services/cache.php b/config/services/cache.php new file mode 100644 index 0000000..2a0646f --- /dev/null +++ b/config/services/cache.php @@ -0,0 +1,11 @@ +services(); + + $services->alias('webgriffe_sylius_pausepay.cache', 'cache.app'); +}; diff --git a/config/services/form.php b/config/services/form.php new file mode 100644 index 0000000..35fdb06 --- /dev/null +++ b/config/services/form.php @@ -0,0 +1,17 @@ +services(); + + $services->set('webgriffe_sylius_pausepay.form.type.gateway_configuration', SyliusPausePayGatewayConfigurationType::class) + ->tag('sylius.gateway_configuration_type', ['type' => PausePayApi::GATEWAY_CODE, 'label' => 'PausePay']) + ->tag('form.type') + ; +}; diff --git a/config/services/gateway_config.php b/config/services/gateway_config.php new file mode 100644 index 0000000..212ee28 --- /dev/null +++ b/config/services/gateway_config.php @@ -0,0 +1,19 @@ +services(); + + $services->set('webgriffe_sylius_pausepay.gateway_factory_builder', GatewayFactoryBuilder::class) + ->args([PausePayGatewayFactory::class,]) + ->tag('payum.gateway_factory_builder', ['factory' => PausePayApi::GATEWAY_CODE]) + ; + +}; diff --git a/config/services/logger.php b/config/services/logger.php new file mode 100644 index 0000000..44e33f1 --- /dev/null +++ b/config/services/logger.php @@ -0,0 +1,11 @@ +services(); + + $services->alias('webgriffe_sylius_pausepay.logger', 'monolog.logger.payum'); +}; diff --git a/config/services/validator.php b/config/services/validator.php new file mode 100644 index 0000000..e1f4e42 --- /dev/null +++ b/config/services/validator.php @@ -0,0 +1,18 @@ +services(); + + $services->set('webgriffe_sylius_pausepay.validator.pausepay_payment_method_unique', PausePayPaymentMethodUniqueValidator::class) + ->args([ + service('sylius.repository.payment_method'), + ]) + ->tag('validator.constraint_validator') + ; +}; diff --git a/config/shop_ajax_routing.php b/config/shop_ajax_routing.php new file mode 100644 index 0000000..f81a8f0 --- /dev/null +++ b/config/shop_ajax_routing.php @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/docker-compose.override.sample.yml b/docker-compose.override.sample.yml new file mode 100644 index 0000000..8f529d8 --- /dev/null +++ b/docker-compose.override.sample.yml @@ -0,0 +1,13 @@ +services: + sylius-app: + profiles: [ "disabled" ] + + sylius-mysql: + ports: + - 13306:3306 + + mailhog: + image: mailhog/mailhog + ports: + - "18025:8025" + - "11025:1025" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a1e6ca6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +services: + sylius-app: + image: sylius/standard:1.11-traditional-alpine + environment: + APP_ENV: "dev" + DATABASE_URL: "mysql://root:mysql@mysql/sylius_%kernel.environment%?charset=utf8mb4" + # DATABASE_URL: "pgsql://root:postgres@postgres/sylius_%kernel.environment%?charset=utf8" # When using postgres + PHP_DATE_TIMEZONE: "Europe/Warsaw" + volumes: + - ./:/app:delegated + - ./.docker/php/php.ini:/etc/php8/php.ini:delegated + - ./.docker/nginx/nginx.conf:/etc/nginx/nginx.conf:delegated + depends_on: + - sylius-mysql + networks: + - sylius + + sylius-mysql: + image: mysql:8.0 + platform: linux/amd64 + environment: + MYSQL_ROOT_PASSWORD: mysql + volumes: + - sylius-mysql-data:/var/lib/mysql:rw + +networks: + sylius: + driver: bridge + +volumes: + sylius-mysql-data: diff --git a/e2e-test-server.sh b/e2e-test-server.sh new file mode 100755 index 0000000..b03e8de --- /dev/null +++ b/e2e-test-server.sh @@ -0,0 +1,5 @@ +# Make sure to set GOOGLE_CHROME env variable pointing to your Google Chrome binary. For example on macOS: +# GOOGLE_CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" ./e2e-test-server.sh + +trap 'kill %1; kill %2' SIGINT +cd tests/Application && APP_ENV=test symfony server:start --port=8080 --dir=public & "${GOOGLE_CHROME}" --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --allow-insecure-localhost --disable-translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --disable-gpu --window-size=2880,1800 --proxy-server='direct://' --proxy-bypass-list='*' --crash-dumps-dir=/tmp https://127.0.0.1 & tee diff --git a/ecs.php b/ecs.php new file mode 100644 index 0000000..fb0426f --- /dev/null +++ b/ecs.php @@ -0,0 +1,20 @@ +paths([ + __DIR__ . '/src', + __DIR__ . '/tests/Behat', + __DIR__ . '/ecs.php', + ]); + + $ecsConfig->import('vendor/sylius-labs/coding-standard/ecs.php'); + + $ecsConfig->skip([ + VisibilityRequiredFixer::class => ['*Spec.php'], + ]); +}; diff --git a/etc/build/.gitignore b/etc/build/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/migrations/.gitkeep b/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/node_modules b/node_modules new file mode 120000 index 0000000..9270531 --- /dev/null +++ b/node_modules @@ -0,0 +1 @@ +tests/Application/node_modules \ No newline at end of file diff --git a/phpspec.yml.dist b/phpspec.yml.dist new file mode 100644 index 0000000..e94f18f --- /dev/null +++ b/phpspec.yml.dist @@ -0,0 +1,4 @@ +suites: + main: + namespace: Webgriffe\SyliusPausePayPlugin + psr4_prefix: Webgriffe\SyliusPausePayPlugin diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..e934200 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,20 @@ +parameters: + level: max + reportUnmatchedIgnoredErrors: false + paths: + - src + - tests/Behat + + excludePaths: + # Makes PHPStan crash + - 'src/DependencyInjection/Configuration.php' + + # Test dependencies + - 'tests/Application/app/**.php' + - 'tests/Application/src/**.php' + + ignoreErrors: + - + identifier: missingType.generics # Temp + - + identifier: missingType.iterableValue diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..34cba9e --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,22 @@ + + + + + + tests + + + + + + + + + + + + + diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..3240886 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/public/poll_payment.js b/public/poll_payment.js new file mode 100644 index 0000000..26e8252 --- /dev/null +++ b/public/poll_payment.js @@ -0,0 +1,19 @@ +(function () { + async function checkForCapturedPayment() { + try { + const response = await fetch(window.paymentStatusUrl) + const data = await response.json() + + if (data.captured) { + window.location.replace(window.afterUrl) + return; + } + } catch (e) { + console.log(e) + } + + setTimeout(checkForCapturedPayment, 5000) + } + + checkForCapturedPayment() +})(); diff --git a/spec/Resolver/PausePayPaymentMethodsResolverSpec.php b/spec/Resolver/PausePayPaymentMethodsResolverSpec.php new file mode 100644 index 0000000..db0a772 --- /dev/null +++ b/spec/Resolver/PausePayPaymentMethodsResolverSpec.php @@ -0,0 +1,127 @@ +getCountryCode()->willReturn('IT'); + $shippingAddress->getCountryCode()->willReturn('IT'); + + $order->getChannel()->willReturn($channel); + $order->getBillingAddress()->willReturn($billingAddress); + $order->getShippingAddress()->willReturn($shippingAddress); + $order->getCurrencyCode()->willReturn('EUR'); + $order->getTotal()->willReturn(19000); + + $payment->getOrder()->willReturn($order); + $payment->getMethod()->willReturn($pausepayPaymentMethod); + + $pausepayGatewayConfig->getFactoryName()->willReturn(PausePayApi::GATEWAY_CODE); + $otherGatewayConfig->getFactoryName()->willReturn('other'); + + $pausepayPaymentMethod->getCode()->willReturn('PAUSEPAY_PAYMENT_METHOD_CODE'); + $pausepayPaymentMethod->getGatewayConfig()->willReturn($pausepayGatewayConfig); + $otherPaymentMethod->getCode()->willReturn('other_payment_method'); + $otherPaymentMethod->getGatewayConfig()->willReturn($otherGatewayConfig); + + $paymentMethodRepository->findEnabledForChannel($channel)->willReturn([ + $pausepayPaymentMethod, + $otherPaymentMethod, + ]); + + $this->beConstructedWith($paymentMethodRepository); + } + + public function it_is_initializable(): void + { + $this->shouldHaveType(PausePayPaymentMethodsResolver::class); + } + + public function it_implements_payment_methods_resolver_interface(): void + { + $this->shouldImplement(PaymentMethodsResolverInterface::class); + } + + public function it_resolves_pausepay_payment_methods_if_eligible( + PaymentInterface $payment, + PaymentMethodInterface $pausepayPaymentMethod, + PaymentMethodInterface $otherPaymentMethod, + ): void { + $this->getSupportedMethods($payment)->shouldReturn([ + 0 => $pausepayPaymentMethod, + 2 => $otherPaymentMethod, + ]); + } + + public function it_does_not_resolve_pausepay_payment_method_if_order_amount_is_equal_or_under_50000( + PaymentInterface $payment, + PaymentMethodInterface $pausepayPaymentMethod, + PaymentMethodInterface $otherPaymentMethod, + OrderInterface $order, + ): void { + $order->getTotal()->willReturn(50000); + $this->getSupportedMethods($payment)->shouldReturn([ + 0 => $pausepayPaymentMethod, + 2 => $otherPaymentMethod, + ]); + + $order->getTotal()->willReturn(9900); + $this->getSupportedMethods($payment)->shouldReturn([ + 2 => $otherPaymentMethod, + ]); + } + + public function it_does_not_resolve_pausepay_payment_methods_if_order_currency_is_not_supported( + PaymentInterface $payment, + PaymentMethodInterface $otherPaymentMethod, + OrderInterface $order, + ): void { + $order->getCurrencyCode()->willReturn('USD'); + $this->getSupportedMethods($payment)->shouldReturn([ + 2 => $otherPaymentMethod, + ]); + } + + public function it_does_not_resolve_pausepay_payment_methods_if_country_code_is_not_supported( + PaymentInterface $payment, + PaymentMethodInterface $otherPaymentMethod, + AddressInterface $billingAddress, + AddressInterface $shippingAddress, + ): void { + $billingAddress->getCountryCode()->willReturn('US'); + $this->getSupportedMethods($payment)->shouldReturn([ + 2 => $otherPaymentMethod, + ]); + + $shippingAddress->getCountryCode()->willReturn('US'); + $this->getSupportedMethods($payment)->shouldReturn([ + 2 => $otherPaymentMethod, + ]); + } +} diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php new file mode 100644 index 0000000..98436ee --- /dev/null +++ b/src/DependencyInjection/Configuration.php @@ -0,0 +1,22 @@ +getRootNode(); + + return $treeBuilder; + } +} diff --git a/src/DependencyInjection/WebgriffeSyliusPausePayExtension.php b/src/DependencyInjection/WebgriffeSyliusPausePayExtension.php new file mode 100644 index 0000000..c69e98c --- /dev/null +++ b/src/DependencyInjection/WebgriffeSyliusPausePayExtension.php @@ -0,0 +1,46 @@ +load('services.php'); + } + + public function prepend(ContainerBuilder $container): void + { + $this->prependDoctrineMigrations($container); + } + + protected function getMigrationsNamespace(): string + { + return 'DoctrineMigrations'; + } + + protected function getMigrationsDirectory(): string + { + return '@WebgriffeSyliusPausePayPlugin/migrations'; + } + + protected function getNamespacesOfMigrationsExecutedBefore(): array + { + return [ + 'Sylius\Bundle\CoreBundle\Migrations', + ]; + } +} diff --git a/src/Form/Type/SyliusPausePayGatewayConfigurationType.php b/src/Form/Type/SyliusPausePayGatewayConfigurationType.php new file mode 100644 index 0000000..7c6e640 --- /dev/null +++ b/src/Form/Type/SyliusPausePayGatewayConfigurationType.php @@ -0,0 +1,40 @@ +add('merchant_key', TextType::class, [ + 'label' => 'webgriffe_sylius_pausepay.form.gateway_configuration.merchant_key', + 'required' => true, + 'constraints' => [ + new NotBlank(), + ], + ]) + ->add('sandbox', CheckboxType::class, [ + 'label' => 'webgriffe_sylius_pausepay.form.gateway_configuration.sandbox', + 'required' => false, + ]) + ->add('allowed_terms', ChoiceType::class, [ + 'label' => 'webgriffe_sylius_pausepay.form.gateway_configuration.allowed_terms', + 'help' => 'webgriffe_sylius_pausepay.form.gateway_configuration.allowed_terms_help', + 'choices' => array_combine(range(1, 24), range(1, 24)), + 'multiple' => true, + 'expanded' => false, + 'required' => false, + ]) + ; + } +} diff --git a/src/Payum/PausePayApi.php b/src/Payum/PausePayApi.php new file mode 100644 index 0000000..217635d --- /dev/null +++ b/src/Payum/PausePayApi.php @@ -0,0 +1,35 @@ +} $config + */ + public function __construct(private array $config) + { + } + + public function getMerchantKey(): string + { + return $this->config['merchant_key']; + } + + public function isSandBox(): bool + { + return $this->config['sandbox']; + } + + /** + * @return array + */ + public function getAllowedTerms(): array + { + return array_values($this->config['allowed_terms']); + } +} diff --git a/src/Payum/PausePayGatewayFactory.php b/src/Payum/PausePayGatewayFactory.php new file mode 100644 index 0000000..0911be4 --- /dev/null +++ b/src/Payum/PausePayGatewayFactory.php @@ -0,0 +1,37 @@ +defaults( + [ + 'payum.factory_name' => PausePayApi::GATEWAY_CODE, + 'payum.factory_title' => 'PausePay', + 'payum.action.status' => '@webgriffe_sylius_pausepay.payum.action.status', + ], + ); + + if (false === (bool) $config['payum.api']) { + $defaultOptions = ['sandbox' => true]; + $config->defaults($defaultOptions); + $config['payum.default_options'] = $defaultOptions; + $config['payum.required_options'] = ['merchant_key', 'sandbox']; + + /** + * @psalm-suppress MixedArgumentTypeCoercion + * + * @phpstan-ignore-next-line + */ + $config['payum.api'] = static fn (ArrayObject $config): PausePayApi => new PausePayApi((array) $config); + } + } +} diff --git a/src/Validator/PausePayPaymentMethodUnique.php b/src/Validator/PausePayPaymentMethodUnique.php new file mode 100644 index 0000000..6fe104f --- /dev/null +++ b/src/Validator/PausePayPaymentMethodUnique.php @@ -0,0 +1,20 @@ +getGatewayConfig(); + /** @psalm-suppress DeprecatedMethod */ + if ($gatewayConfig === null || $gatewayConfig->getFactoryName() !== PausePayApi::GATEWAY_CODE) { + return; + } + + /** @var PaymentMethodInterface[] $paymentMethods */ + $paymentMethods = $this->paymentMethodRepository->findAll(); + /** @psalm-suppress DeprecatedMethod */ + $paymentMethodsWithSameGatewayConfig = array_filter( + $paymentMethods, + static fn (PaymentMethodInterface $paymentMethod) => $paymentMethod->getGatewayConfig()?->getFactoryName() === $gatewayConfig->getFactoryName(), + ); + if (count($paymentMethodsWithSameGatewayConfig) > 1 || + (count($paymentMethodsWithSameGatewayConfig) === 1 && reset( + $paymentMethodsWithSameGatewayConfig, + ) !== $value) + ) { + $this->context + ->buildViolation($constraint->message) + ->atPath('gatewayConfig') + ->addViolation(); + } + } +} diff --git a/src/WebgriffeSyliusPausePayPlugin.php b/src/WebgriffeSyliusPausePayPlugin.php new file mode 100644 index 0000000..004d236 --- /dev/null +++ b/src/WebgriffeSyliusPausePayPlugin.php @@ -0,0 +1,19 @@ +{{ 'webgriffe_sylius_pausepay.ui.processing_payment'|trans }} + +

{{ 'webgriffe_sylius_pausepay.ui.please_wait'|trans }}

+ + {{ 'webgriffe_sylius_pausepay.ui.loading'|trans }} + + {% if redirectUrl %} + + {{ 'webgriffe_sylius_pausepay.ui.return_to_pausepay_checkout'|trans }} + + {% endif %} +{% endblock %} + +{% block javascripts %} + {{ parent() }} + + + +{% endblock %} diff --git a/tests/Application/.env b/tests/Application/.env new file mode 100644 index 0000000..436823a --- /dev/null +++ b/tests/Application/.env @@ -0,0 +1,33 @@ +# This file is a "template" of which env vars needs to be defined in your configuration or in an .env file +# Set variables here that may be different on each deployment target of the app, e.g. development, staging, production. +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_DEBUG=1 +APP_SECRET=EDITME +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls +DATABASE_URL=mysql://root:mysql@127.0.0.1:13306/webgriffe_sylius_pausepay_plugin_%kernel.environment%?serverVersion=8.0 +###< doctrine/doctrine-bundle ### + +###> lexik/jwt-authentication-bundle ### +JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem +JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem +JWT_PASSPHRASE=acme_plugin_development +###< lexik/jwt-authentication-bundle ### + +###> symfony/mailer ### +MAILER_DSN=null://null +###< symfony/mailer ### + +###> symfony/messenger ### +SYLIUS_MESSENGER_TRANSPORT_MAIN_DSN=doctrine://default +SYLIUS_MESSENGER_TRANSPORT_MAIN_FAILED_DSN=doctrine://default?queue_name=main_failed +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_DSN=doctrine://default?queue_name=catalog_promotion_removal +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_FAILED_DSN=doctrine://default?queue_name=catalog_promotion_removal_failed +###< symfony/messenger ### diff --git a/tests/Application/.env.test b/tests/Application/.env.test new file mode 100644 index 0000000..2457157 --- /dev/null +++ b/tests/Application/.env.test @@ -0,0 +1,11 @@ +APP_SECRET='ch4mb3r0f5ecr3ts' + +KERNEL_CLASS='Tests\Webgriffe\SyliusPausePayPlugin\Application\Kernel' + +###> symfony/messenger ### +# Sync transport turned for testing env for the ease of testing +SYLIUS_MESSENGER_TRANSPORT_MAIN_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_MAIN_FAILED_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_FAILED_DSN=sync:// +###< symfony/messenger ### diff --git a/tests/Application/.eslintrc.js b/tests/Application/.eslintrc.js new file mode 100644 index 0000000..92c4cee --- /dev/null +++ b/tests/Application/.eslintrc.js @@ -0,0 +1,20 @@ +module.exports = { + extends: 'airbnb-base', + env: { + node: true, + }, + rules: { + 'object-shorthand': ['error', 'always', { + avoidQuotes: true, + avoidExplicitReturnArrows: true, + }], + 'function-paren-newline': ['error', 'consistent'], + 'max-len': ['warn', 120, 2, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }], + }, +}; diff --git a/tests/Application/.gitignore b/tests/Application/.gitignore new file mode 100644 index 0000000..bc600a8 --- /dev/null +++ b/tests/Application/.gitignore @@ -0,0 +1,23 @@ +/public/assets +/public/build +/public/css +/public/js +/public/media/* +!/public/media/image/ +/public/media/image/* +!/public/media/image/.gitignore + +/node_modules + +###> symfony/framework-bundle ### +/.env.*.local +/.env.local +/.env.local.php +/public/bundles +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> symfony/web-server-bundle ### +/.web-server-pid +###< symfony/web-server-bundle ### diff --git a/tests/Application/Kernel.php b/tests/Application/Kernel.php new file mode 100644 index 0000000..c48c6db --- /dev/null +++ b/tests/Application/Kernel.php @@ -0,0 +1,97 @@ +getProjectDir() . '/var/cache/' . $this->environment; + } + + public function getLogDir(): string + { + return $this->getProjectDir() . '/var/log'; + } + + public function registerBundles(): iterable + { + foreach ($this->getConfigurationDirectories() as $confDir) { + $bundlesFile = $confDir . '/bundles.php'; + if (false === is_file($bundlesFile)) { + continue; + } + yield from $this->registerBundlesFromFile($bundlesFile); + } + } + + protected function configureRoutes(RoutingConfigurator $routes): void + { + foreach ($this->getConfigurationDirectories() as $confDir) { + $this->loadRoutesConfiguration($routes, $confDir); + } + } + + protected function getContainerBaseClass(): string + { + if ($this->isTestEnvironment() && class_exists(MockerContainer::class)) { + return MockerContainer::class; + } + + return parent::getContainerBaseClass(); + } + + private function isTestEnvironment(): bool + { + return 0 === strpos($this->getEnvironment(), 'test'); + } + + private function loadRoutesConfiguration(RoutingConfigurator $routes, string $confDir): void + { + $routes->import($confDir . '/{routes}/*' . self::CONFIG_EXTS); + $routes->import($confDir . '/{routes}/' . $this->environment . '/**/*' . self::CONFIG_EXTS); + $routes->import($confDir . '/{routes}' . self::CONFIG_EXTS); + } + + /** + * @return BundleInterface[] + */ + private function registerBundlesFromFile(string $bundlesFile): iterable + { + $contents = require $bundlesFile; + foreach ($contents as $class => $envs) { + if (isset($envs['all']) || isset($envs[$this->environment])) { + yield new $class(); + } + } + } + + /** + * @return string[] + */ + private function getConfigurationDirectories(): iterable + { + yield $this->getProjectDir() . '/config'; + $syliusConfigDir = $this->getProjectDir() . '/config/sylius/' . SyliusKernel::MAJOR_VERSION . '.' . SyliusKernel::MINOR_VERSION; + if (is_dir($syliusConfigDir)) { + yield $syliusConfigDir; + } + $symfonyConfigDir = $this->getProjectDir() . '/config/symfony/' . BaseKernel::MAJOR_VERSION . '.' . BaseKernel::MINOR_VERSION; + if (is_dir($symfonyConfigDir)) { + yield $symfonyConfigDir; + } + } +} diff --git a/tests/Application/assets/admin/entry.js b/tests/Application/assets/admin/entry.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/assets/shop/entry.js b/tests/Application/assets/shop/entry.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/bin/console b/tests/Application/bin/console new file mode 100755 index 0000000..8f63441 --- /dev/null +++ b/tests/Application/bin/console @@ -0,0 +1,38 @@ +#!/usr/bin/env php +getParameterOption(['--env', '-e'], null, true)) { + putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); +} + +if ($input->hasParameterOption('--no-debug', true)) { + putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); +} + +require dirname(__DIR__).'/config/bootstrap.php'; + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$application = new Application($kernel); +$application->run($input); diff --git a/tests/Application/composer.json b/tests/Application/composer.json new file mode 100644 index 0000000..326735f --- /dev/null +++ b/tests/Application/composer.json @@ -0,0 +1,5 @@ +{ + "name": "sylius/plugin-skeleton-test-application", + "description": "Sylius application for plugin testing purposes (composer.json needed for project dir resolving)", + "license": "MIT" +} diff --git a/tests/Application/config/api_platform/.gitignore b/tests/Application/config/api_platform/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/bootstrap.php b/tests/Application/config/bootstrap.php new file mode 100644 index 0000000..c9951a7 --- /dev/null +++ b/tests/Application/config/bootstrap.php @@ -0,0 +1,27 @@ +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php')) { + $_SERVER += $env; + $_ENV += $env; +} elseif (!class_exists(Dotenv::class)) { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} elseif (method_exists(Dotenv::class, 'bootEnv')) { + (new Dotenv())->bootEnv(dirname(__DIR__) . '/.env'); + + return; +} else { + // load all the .env files + (new Dotenv(true))->loadEnv(dirname(__DIR__) . '/.env'); +} + +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], \FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/tests/Application/config/bundles.php b/tests/Application/config/bundles.php new file mode 100644 index 0000000..0c40639 --- /dev/null +++ b/tests/Application/config/bundles.php @@ -0,0 +1,66 @@ + ['all' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Sylius\Bundle\OrderBundle\SyliusOrderBundle::class => ['all' => true], + Sylius\Bundle\MoneyBundle\SyliusMoneyBundle::class => ['all' => true], + Sylius\Bundle\CurrencyBundle\SyliusCurrencyBundle::class => ['all' => true], + Sylius\Bundle\LocaleBundle\SyliusLocaleBundle::class => ['all' => true], + Sylius\Bundle\ProductBundle\SyliusProductBundle::class => ['all' => true], + Sylius\Bundle\ChannelBundle\SyliusChannelBundle::class => ['all' => true], + Sylius\Bundle\AttributeBundle\SyliusAttributeBundle::class => ['all' => true], + Sylius\Bundle\TaxationBundle\SyliusTaxationBundle::class => ['all' => true], + Sylius\Bundle\ShippingBundle\SyliusShippingBundle::class => ['all' => true], + Sylius\Bundle\PaymentBundle\SyliusPaymentBundle::class => ['all' => true], + Sylius\Bundle\MailerBundle\SyliusMailerBundle::class => ['all' => true], + Sylius\Bundle\PromotionBundle\SyliusPromotionBundle::class => ['all' => true], + Sylius\Bundle\AddressingBundle\SyliusAddressingBundle::class => ['all' => true], + Sylius\Bundle\InventoryBundle\SyliusInventoryBundle::class => ['all' => true], + Sylius\Bundle\TaxonomyBundle\SyliusTaxonomyBundle::class => ['all' => true], + Sylius\Bundle\UserBundle\SyliusUserBundle::class => ['all' => true], + Sylius\Bundle\CustomerBundle\SyliusCustomerBundle::class => ['all' => true], + Sylius\Bundle\UiBundle\SyliusUiBundle::class => ['all' => true], + Sylius\Bundle\ReviewBundle\SyliusReviewBundle::class => ['all' => true], + Sylius\Bundle\CoreBundle\SyliusCoreBundle::class => ['all' => true], + Sylius\Bundle\ResourceBundle\SyliusResourceBundle::class => ['all' => true], + Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true], + winzou\Bundle\StateMachineBundle\winzouStateMachineBundle::class => ['all' => true], + Sonata\BlockBundle\SonataBlockBundle::class => ['all' => true], + Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle::class => ['all' => true], + JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], + FOS\RestBundle\FOSRestBundle::class => ['all' => true], + Knp\Bundle\GaufretteBundle\KnpGaufretteBundle::class => ['all' => true], + Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], + Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true], + Payum\Bundle\PayumBundle\PayumBundle::class => ['all' => true], + Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Sylius\Bundle\FixturesBundle\SyliusFixturesBundle::class => ['all' => true], + Sylius\Bundle\PayumBundle\SyliusPayumBundle::class => ['all' => true], + Sylius\Bundle\ThemeBundle\SyliusThemeBundle::class => ['all' => true], + Sylius\Bundle\AdminBundle\SyliusAdminBundle::class => ['all' => true], + Sylius\Bundle\ShopBundle\SyliusShopBundle::class => ['all' => true], + Webgriffe\SyliusPausePayPlugin\WebgriffeSyliusPausePayPlugin::class => ['all' => true], + Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], + FriendsOfBehat\SymfonyExtension\Bundle\FriendsOfBehatSymfonyExtensionBundle::class => ['test' => true, 'test_cached' => true], + Sylius\Behat\Application\SyliusTestPlugin\SyliusTestPlugin::class => ['test' => true, 'test_cached' => true], + ApiPlatform\Core\Bridge\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], + Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], + Sylius\Bundle\ApiBundle\SyliusApiBundle::class => ['all' => true], + SyliusLabs\DoctrineMigrationsExtraBundle\SyliusLabsDoctrineMigrationsExtraBundle::class => ['all' => true], + BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true], + SyliusLabs\Polyfill\Symfony\Security\Bundle\SyliusLabsPolyfillSymfonySecurityBundle::class => ['all' => true], + Sylius\Calendar\SyliusCalendarBundle::class => ['all' => true], + Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], + League\FlysystemBundle\FlysystemBundle::class => ['all' => true], +]; +if (class_exists(Sylius\Abstraction\StateMachine\SyliusStateMachineAbstractionBundle::class)) { + $bundles[Sylius\Abstraction\StateMachine\SyliusStateMachineAbstractionBundle::class] = ['all' => true]; +} + +return $bundles; diff --git a/tests/Application/config/jwt/private.pem b/tests/Application/config/jwt/private.pem new file mode 100644 index 0000000..2bcf023 --- /dev/null +++ b/tests/Application/config/jwt/private.pem @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +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 +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/Application/config/jwt/public.pem b/tests/Application/config/jwt/public.pem new file mode 100644 index 0000000..cb4e13d --- /dev/null +++ b/tests/Application/config/jwt/public.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6QkmF/Xi5nAYb8Kzr7qC +d63V2K+d/nCXbpDUKKDPJAqOtTlMoQSuJRLNnhhp7z1i/Cp4Bhifr20Pu2dq8JYg +6pRT4ctqvYb/MXxAaPZc3EcBC0S6AhgKO/fDvR3LcqYqGJmQQOXZvxTsgqongdvV +4XbqFBMMgngyayoBk0VKTaI/s+LQhIce+1QaxbAI0+/zbR0hZ1hWT73orJi3do+1 +TBzQol+V7WGa8LlJfmgM56qO3BmVkeTDMBc27pGp6g3+Oufk/l29jEGJlUT9yu7Q +BRhaQTWNVASa2aD+AKjVBzJh53O2zD8slAbjF1M9U7bbWN28Sv+xC/dUz0q9HnPu +RsY2tnwryqTyYn/Hf2xyP3/KvjJ6oslAwemu5JirdJkO7KVQAthWG42gLuhZg3ks +cSZhCLZH7nO2UDsf+2ZZgdbhpYZwR4gDRfNt7GKWXnWZOz9Uw1yVCPgylyZRZwg8 +l0y9aABdj3379I22icrwpMZbAgkyxNSV6UNJuxZksLUoP3i9OvXYgPYU9E4tU/Ul +Dm/T1rGSReGoPkU1YQnI50bq7p1byIoUu2scTflvpTVI5a7zULkS1tg60xk7vBRC +aBc7nr4UEtA235N6uLtcGxH11WBMwsKX69sSU0sQdC4Sk25zXM2gc8R1XV9K3qz2 +wQorQRlCwrkG44VRDgbFH+8CAwEAAQ== +-----END PUBLIC KEY----- diff --git a/tests/Application/config/packages/_sylius.yaml b/tests/Application/config/packages/_sylius.yaml new file mode 100644 index 0000000..18acdd4 --- /dev/null +++ b/tests/Application/config/packages/_sylius.yaml @@ -0,0 +1,18 @@ +imports: + - { resource: "@SyliusCoreBundle/Resources/config/app/config.yml" } + + - { resource: "@SyliusAdminBundle/Resources/config/app/config.yml" } + + - { resource: "@SyliusShopBundle/Resources/config/app/config.yml" } + + - { resource: "@SyliusApiBundle/Resources/config/app/config.yaml" } + +parameters: + sylius_core.public_dir: '%kernel.project_dir%/public' + +sylius_shop: + product_grid: + include_all_descendants: true + +sylius_api: + enabled: true diff --git a/tests/Application/config/packages/api_platform.yaml b/tests/Application/config/packages/api_platform.yaml new file mode 100644 index 0000000..b428304 --- /dev/null +++ b/tests/Application/config/packages/api_platform.yaml @@ -0,0 +1,10 @@ +api_platform: + mapping: + paths: + - '%kernel.project_dir%/../../vendor/sylius/sylius/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources' + - '%kernel.project_dir%/config/api_platform' + - '%kernel.project_dir%/src/Entity' + patch_formats: + json: ['application/merge-patch+json'] + swagger: + versions: [3] diff --git a/tests/Application/config/packages/assets.yaml b/tests/Application/config/packages/assets.yaml new file mode 100644 index 0000000..2468901 --- /dev/null +++ b/tests/Application/config/packages/assets.yaml @@ -0,0 +1,7 @@ +framework: + assets: + packages: + shop: + json_manifest_path: '%kernel.project_dir%/public/build/shop/manifest.json' + admin: + json_manifest_path: '%kernel.project_dir%/public/build/admin/manifest.json' diff --git a/tests/Application/config/packages/dev/framework.yaml b/tests/Application/config/packages/dev/framework.yaml new file mode 100644 index 0000000..4b116de --- /dev/null +++ b/tests/Application/config/packages/dev/framework.yaml @@ -0,0 +1,2 @@ +framework: + profiler: { only_exceptions: false } diff --git a/tests/Application/config/packages/dev/jms_serializer.yaml b/tests/Application/config/packages/dev/jms_serializer.yaml new file mode 100644 index 0000000..2f32a9b --- /dev/null +++ b/tests/Application/config/packages/dev/jms_serializer.yaml @@ -0,0 +1,12 @@ +jms_serializer: + visitors: + json_serialization: + options: + - JSON_PRETTY_PRINT + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION + json_deserialization: + options: + - JSON_PRETTY_PRINT + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/tests/Application/config/packages/dev/monolog.yaml b/tests/Application/config/packages/dev/monolog.yaml new file mode 100644 index 0000000..da2b092 --- /dev/null +++ b/tests/Application/config/packages/dev/monolog.yaml @@ -0,0 +1,9 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + firephp: + type: firephp + level: info diff --git a/tests/Application/config/packages/dev/routing.yaml b/tests/Application/config/packages/dev/routing.yaml new file mode 100644 index 0000000..4116679 --- /dev/null +++ b/tests/Application/config/packages/dev/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/tests/Application/config/packages/dev/web_profiler.yaml b/tests/Application/config/packages/dev/web_profiler.yaml new file mode 100644 index 0000000..1f1cb2b --- /dev/null +++ b/tests/Application/config/packages/dev/web_profiler.yaml @@ -0,0 +1,3 @@ +web_profiler: + toolbar: true + intercept_redirects: false diff --git a/tests/Application/config/packages/doctrine.yaml b/tests/Application/config/packages/doctrine.yaml new file mode 100644 index 0000000..6100a7a --- /dev/null +++ b/tests/Application/config/packages/doctrine.yaml @@ -0,0 +1,27 @@ +parameters: + # Adds a fallback DATABASE_URL if the env var is not set. + # This allows you to run cache:warmup even if your + # environment variables are not available yet. + # You should not need to change this value. + env(DATABASE_URL): '' + +doctrine: + dbal: + driver: 'pdo_mysql' + server_version: '5.7' + charset: UTF8 + + url: '%env(resolve:DATABASE_URL)%' + orm: + auto_generate_proxy_classes: '%kernel.debug%' + entity_managers: + default: + auto_mapping: true + mappings: + Tests\Webgriffe\SyliusPausePayPlugin\App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'Tests\Webgriffe\SyliusPausePayPlugin\App\Entity' + alias: Tests\Webgriffe\SyliusPausePayPlugin\App + diff --git a/tests/Application/config/packages/doctrine_migrations.yaml b/tests/Application/config/packages/doctrine_migrations.yaml new file mode 100644 index 0000000..cdbc01a --- /dev/null +++ b/tests/Application/config/packages/doctrine_migrations.yaml @@ -0,0 +1,4 @@ +doctrine_migrations: + storage: + table_storage: + table_name: sylius_migrations diff --git a/tests/Application/config/packages/fos_rest.yaml b/tests/Application/config/packages/fos_rest.yaml new file mode 100644 index 0000000..eaebb27 --- /dev/null +++ b/tests/Application/config/packages/fos_rest.yaml @@ -0,0 +1,11 @@ +fos_rest: + exception: true + view: + formats: + json: true + xml: true + empty_content: 204 + format_listener: + rules: + - { path: '^/api/v1/.*', priorities: ['json', 'xml'], fallback_format: json, prefer_extension: true } + - { path: '^/', stop: true } diff --git a/tests/Application/config/packages/framework.yaml b/tests/Application/config/packages/framework.yaml new file mode 100644 index 0000000..8be076b --- /dev/null +++ b/tests/Application/config/packages/framework.yaml @@ -0,0 +1,9 @@ +framework: + secret: '%env(APP_SECRET)%' + form: true + csrf_protection: true + session: + handler_id: ~ + serializer: + mapping: + paths: [ '%kernel.project_dir%/config/serialization' ] diff --git a/tests/Application/config/packages/jms_serializer.yaml b/tests/Application/config/packages/jms_serializer.yaml new file mode 100644 index 0000000..ed7bc61 --- /dev/null +++ b/tests/Application/config/packages/jms_serializer.yaml @@ -0,0 +1,4 @@ +jms_serializer: + visitors: + xml_serialization: + format_output: '%kernel.debug%' diff --git a/tests/Application/config/packages/lexik_jwt_authentication.yaml b/tests/Application/config/packages/lexik_jwt_authentication.yaml new file mode 100644 index 0000000..edfb69d --- /dev/null +++ b/tests/Application/config/packages/lexik_jwt_authentication.yaml @@ -0,0 +1,4 @@ +lexik_jwt_authentication: + secret_key: '%env(resolve:JWT_SECRET_KEY)%' + public_key: '%env(resolve:JWT_PUBLIC_KEY)%' + pass_phrase: '%env(JWT_PASSPHRASE)%' diff --git a/tests/Application/config/packages/liip_imagine.yaml b/tests/Application/config/packages/liip_imagine.yaml new file mode 100644 index 0000000..bb2e7ce --- /dev/null +++ b/tests/Application/config/packages/liip_imagine.yaml @@ -0,0 +1,6 @@ +liip_imagine: + resolvers: + default: + web_path: + web_root: "%kernel.project_dir%/public" + cache_prefix: "media/cache" diff --git a/tests/Application/config/packages/mailer.yaml b/tests/Application/config/packages/mailer.yaml new file mode 100644 index 0000000..56a650d --- /dev/null +++ b/tests/Application/config/packages/mailer.yaml @@ -0,0 +1,3 @@ +framework: + mailer: + dsn: '%env(MAILER_DSN)%' diff --git a/tests/Application/config/packages/monolog.yaml b/tests/Application/config/packages/monolog.yaml new file mode 100644 index 0000000..6688153 --- /dev/null +++ b/tests/Application/config/packages/monolog.yaml @@ -0,0 +1,7 @@ +monolog: + handlers: + payum: + type: stream + path: "%kernel.logs_dir%/payum_%kernel.environment%.log" + level: debug + channels: ['payum'] diff --git a/tests/Application/config/packages/prod/doctrine.yaml b/tests/Application/config/packages/prod/doctrine.yaml new file mode 100644 index 0000000..2f16f0f --- /dev/null +++ b/tests/Application/config/packages/prod/doctrine.yaml @@ -0,0 +1,31 @@ +doctrine: + orm: + metadata_cache_driver: + type: service + id: doctrine.system_cache_provider + query_cache_driver: + type: service + id: doctrine.system_cache_provider + result_cache_driver: + type: service + id: doctrine.result_cache_provider + +services: + doctrine.result_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.result_cache_pool' + doctrine.system_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.system_cache_pool' + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/tests/Application/config/packages/prod/jms_serializer.yaml b/tests/Application/config/packages/prod/jms_serializer.yaml new file mode 100644 index 0000000..c288182 --- /dev/null +++ b/tests/Application/config/packages/prod/jms_serializer.yaml @@ -0,0 +1,10 @@ +jms_serializer: + visitors: + json_serialization: + options: + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION + json_deserialization: + options: + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/tests/Application/config/packages/prod/monolog.yaml b/tests/Application/config/packages/prod/monolog.yaml new file mode 100644 index 0000000..6461211 --- /dev/null +++ b/tests/Application/config/packages/prod/monolog.yaml @@ -0,0 +1,10 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/tests/Application/config/packages/routing.yaml b/tests/Application/config/packages/routing.yaml new file mode 100644 index 0000000..368bc7f --- /dev/null +++ b/tests/Application/config/packages/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: ~ diff --git a/tests/Application/config/packages/security.yaml b/tests/Application/config/packages/security.yaml new file mode 100644 index 0000000..4ed342f --- /dev/null +++ b/tests/Application/config/packages/security.yaml @@ -0,0 +1,124 @@ +security: + enable_authenticator_manager: true + providers: + sylius_admin_user_provider: + id: sylius.admin_user_provider.email_or_name_based + sylius_api_admin_user_provider: + id: sylius.admin_user_provider.email_or_name_based + sylius_shop_user_provider: + id: sylius.shop_user_provider.email_or_name_based + sylius_api_shop_user_provider: + id: sylius.shop_user_provider.email_or_name_based + + password_hashers: + Sylius\Component\User\Model\UserInterface: argon2i + firewalls: + admin: + switch_user: true + context: admin + pattern: "%sylius.security.admin_regex%" + provider: sylius_admin_user_provider + form_login: + provider: sylius_admin_user_provider + login_path: sylius_admin_login + check_path: sylius_admin_login_check + failure_path: sylius_admin_login + default_target_path: sylius_admin_dashboard + use_forward: false + use_referer: true + enable_csrf: true + csrf_parameter: _csrf_admin_security_token + csrf_token_id: admin_authenticate + remember_me: + secret: "%env(APP_SECRET)%" + path: "/%sylius_admin.path_name%" + name: APP_ADMIN_REMEMBER_ME + lifetime: 31536000 + remember_me_parameter: _remember_me + logout: + path: sylius_admin_logout + target: sylius_admin_login + + new_api_admin_user: + pattern: "%sylius.security.new_api_admin_regex%/.*" + provider: sylius_api_admin_user_provider + stateless: true + entry_point: jwt + json_login: + check_path: "%sylius.security.new_api_admin_route%/authentication-token" + username_path: email + password_path: password + success_handler: lexik_jwt_authentication.handler.authentication_success + failure_handler: lexik_jwt_authentication.handler.authentication_failure + jwt: true + + new_api_shop_user: + pattern: "%sylius.security.new_api_shop_regex%/.*" + provider: sylius_api_shop_user_provider + stateless: true + entry_point: jwt + json_login: + check_path: "%sylius.security.new_api_shop_route%/authentication-token" + username_path: email + password_path: password + success_handler: lexik_jwt_authentication.handler.authentication_success + failure_handler: lexik_jwt_authentication.handler.authentication_failure + jwt: true + + shop: + switch_user: { role: ROLE_ALLOWED_TO_SWITCH } + context: shop + pattern: "%sylius.security.shop_regex%" + provider: sylius_shop_user_provider + form_login: + success_handler: sylius.authentication.success_handler + failure_handler: sylius.authentication.failure_handler + provider: sylius_shop_user_provider + login_path: sylius_shop_login + check_path: sylius_shop_login_check + failure_path: sylius_shop_login + default_target_path: sylius_shop_homepage + use_forward: false + use_referer: true + enable_csrf: true + csrf_parameter: _csrf_shop_security_token + csrf_token_id: shop_authenticate + remember_me: + secret: "%env(APP_SECRET)%" + name: APP_SHOP_REMEMBER_ME + lifetime: 31536000 + remember_me_parameter: _remember_me + logout: + path: sylius_shop_logout + target: sylius_shop_homepage + invalidate_session: false + + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + image_resolver: + pattern: ^/media/cache/resolve + security: false + + access_control: + - { path: "%sylius.security.admin_regex%/_partial", role: PUBLIC_ACCESS, ips: [127.0.0.1, ::1] } + - { path: "%sylius.security.admin_regex%/_partial", role: ROLE_NO_ACCESS } + - { path: "%sylius.security.shop_regex%/_partial", role: PUBLIC_ACCESS, ips: [127.0.0.1, ::1] } + - { path: "%sylius.security.shop_regex%/_partial", role: ROLE_NO_ACCESS } + + - { path: "%sylius.security.admin_regex%/login", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/login", role: PUBLIC_ACCESS } + + - { path: "%sylius.security.shop_regex%/register", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/verify", role: PUBLIC_ACCESS } + + - { path: "%sylius.security.admin_regex%", role: ROLE_ADMINISTRATION_ACCESS } + - { path: "%sylius.security.shop_regex%/account", role: ROLE_USER } + + - { path: "%sylius.security.new_api_admin_route%/reset-password-requests", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS } + - { path: "%sylius.security.new_api_admin_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_user_account_regex%/.*", role: ROLE_USER } + - { path: "%sylius.security.new_api_shop_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_shop_regex%/.*", role: PUBLIC_ACCESS } diff --git a/tests/Application/config/packages/staging/monolog.yaml b/tests/Application/config/packages/staging/monolog.yaml new file mode 100644 index 0000000..6461211 --- /dev/null +++ b/tests/Application/config/packages/staging/monolog.yaml @@ -0,0 +1,10 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/tests/Application/config/packages/stof_doctrine_extensions.yaml b/tests/Application/config/packages/stof_doctrine_extensions.yaml new file mode 100644 index 0000000..7770f74 --- /dev/null +++ b/tests/Application/config/packages/stof_doctrine_extensions.yaml @@ -0,0 +1,4 @@ +# Read the documentation: https://symfony.com/doc/current/bundles/StofDoctrineExtensionsBundle/index.html +# See the official DoctrineExtensions documentation for more details: https://github.com/Atlantic18/DoctrineExtensions/tree/master/doc/ +stof_doctrine_extensions: + default_locale: '%locale%' diff --git a/tests/Application/config/packages/test/framework.yaml b/tests/Application/config/packages/test/framework.yaml new file mode 100644 index 0000000..fc1d3c1 --- /dev/null +++ b/tests/Application/config/packages/test/framework.yaml @@ -0,0 +1,4 @@ +framework: + test: ~ + session: + storage_factory_id: session.storage.factory.mock_file diff --git a/tests/Application/config/packages/test/mailer.yaml b/tests/Application/config/packages/test/mailer.yaml new file mode 100644 index 0000000..52610d6 --- /dev/null +++ b/tests/Application/config/packages/test/mailer.yaml @@ -0,0 +1,5 @@ +framework: + cache: + pools: + test.mailer_pool: + adapter: cache.adapter.filesystem diff --git a/tests/Application/config/packages/test/monolog.yaml b/tests/Application/config/packages/test/monolog.yaml new file mode 100644 index 0000000..7e2b9e3 --- /dev/null +++ b/tests/Application/config/packages/test/monolog.yaml @@ -0,0 +1,6 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: error diff --git a/tests/Application/config/packages/test/security.yaml b/tests/Application/config/packages/test/security.yaml new file mode 100644 index 0000000..4071d31 --- /dev/null +++ b/tests/Application/config/packages/test/security.yaml @@ -0,0 +1,6 @@ +security: + password_hashers: + Sylius\Component\User\Model\UserInterface: + algorithm: argon2i + time_cost: 3 + memory_cost: 10 diff --git a/tests/Application/config/packages/test/sylius_theme.yaml b/tests/Application/config/packages/test/sylius_theme.yaml new file mode 100644 index 0000000..4d34199 --- /dev/null +++ b/tests/Application/config/packages/test/sylius_theme.yaml @@ -0,0 +1,3 @@ +sylius_theme: + sources: + test: ~ diff --git a/tests/Application/config/packages/test/sylius_uploader.yaml b/tests/Application/config/packages/test/sylius_uploader.yaml new file mode 100644 index 0000000..ab9d6ca --- /dev/null +++ b/tests/Application/config/packages/test/sylius_uploader.yaml @@ -0,0 +1,3 @@ +services: + Sylius\Component\Core\Generator\ImagePathGeneratorInterface: + class: Sylius\Behat\Service\Generator\UploadedImagePathGenerator diff --git a/tests/Application/config/packages/test/web_profiler.yaml b/tests/Application/config/packages/test/web_profiler.yaml new file mode 100644 index 0000000..03752de --- /dev/null +++ b/tests/Application/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/tests/Application/config/packages/test_cached/doctrine.yaml b/tests/Application/config/packages/test_cached/doctrine.yaml new file mode 100644 index 0000000..4952860 --- /dev/null +++ b/tests/Application/config/packages/test_cached/doctrine.yaml @@ -0,0 +1,16 @@ +doctrine: + orm: + entity_managers: + default: + result_cache_driver: + type: memcached + host: localhost + port: 11211 + query_cache_driver: + type: memcached + host: localhost + port: 11211 + metadata_cache_driver: + type: memcached + host: localhost + port: 11211 diff --git a/tests/Application/config/packages/test_cached/fos_rest.yaml b/tests/Application/config/packages/test_cached/fos_rest.yaml new file mode 100644 index 0000000..2b4189d --- /dev/null +++ b/tests/Application/config/packages/test_cached/fos_rest.yaml @@ -0,0 +1,3 @@ +fos_rest: + exception: + debug: true diff --git a/tests/Application/config/packages/test_cached/framework.yaml b/tests/Application/config/packages/test_cached/framework.yaml new file mode 100644 index 0000000..e9dd6ee --- /dev/null +++ b/tests/Application/config/packages/test_cached/framework.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: ../test/framework.yaml } diff --git a/tests/Application/config/packages/test_cached/mailer.yaml b/tests/Application/config/packages/test_cached/mailer.yaml new file mode 100644 index 0000000..16f3170 --- /dev/null +++ b/tests/Application/config/packages/test_cached/mailer.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "../test/mailer.yaml" } diff --git a/tests/Application/config/packages/test_cached/monolog.yaml b/tests/Application/config/packages/test_cached/monolog.yaml new file mode 100644 index 0000000..7e2b9e3 --- /dev/null +++ b/tests/Application/config/packages/test_cached/monolog.yaml @@ -0,0 +1,6 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: error diff --git a/tests/Application/config/packages/test_cached/security.yaml b/tests/Application/config/packages/test_cached/security.yaml new file mode 100644 index 0000000..76e9273 --- /dev/null +++ b/tests/Application/config/packages/test_cached/security.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: ../test/security.yaml } diff --git a/tests/Application/config/packages/test_cached/sylius_channel.yaml b/tests/Application/config/packages/test_cached/sylius_channel.yaml new file mode 100644 index 0000000..bab83ef --- /dev/null +++ b/tests/Application/config/packages/test_cached/sylius_channel.yaml @@ -0,0 +1,2 @@ +sylius_channel: + debug: true diff --git a/tests/Application/config/packages/test_cached/sylius_theme.yaml b/tests/Application/config/packages/test_cached/sylius_theme.yaml new file mode 100644 index 0000000..4d34199 --- /dev/null +++ b/tests/Application/config/packages/test_cached/sylius_theme.yaml @@ -0,0 +1,3 @@ +sylius_theme: + sources: + test: ~ diff --git a/tests/Application/config/packages/test_cached/sylius_uploader.yaml b/tests/Application/config/packages/test_cached/sylius_uploader.yaml new file mode 100644 index 0000000..cfa727e --- /dev/null +++ b/tests/Application/config/packages/test_cached/sylius_uploader.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "../test/sylius_uploader.yaml" } diff --git a/tests/Application/config/packages/test_cached/twig.yaml b/tests/Application/config/packages/test_cached/twig.yaml new file mode 100644 index 0000000..8c6e0b4 --- /dev/null +++ b/tests/Application/config/packages/test_cached/twig.yaml @@ -0,0 +1,2 @@ +twig: + strict_variables: true diff --git a/tests/Application/config/packages/translation.yaml b/tests/Application/config/packages/translation.yaml new file mode 100644 index 0000000..1f4f966 --- /dev/null +++ b/tests/Application/config/packages/translation.yaml @@ -0,0 +1,8 @@ +framework: + default_locale: '%locale%' + translator: + paths: + - '%kernel.project_dir%/translations' + fallbacks: + - '%locale%' + - 'en' diff --git a/tests/Application/config/packages/twig.yaml b/tests/Application/config/packages/twig.yaml new file mode 100644 index 0000000..8545473 --- /dev/null +++ b/tests/Application/config/packages/twig.yaml @@ -0,0 +1,12 @@ +twig: + paths: ['%kernel.project_dir%/templates'] + debug: '%kernel.debug%' + strict_variables: '%kernel.debug%' + +services: + _defaults: + public: false + autowire: true + autoconfigure: true + + Twig\Extra\Intl\IntlExtension: ~ diff --git a/tests/Application/config/packages/validator.yaml b/tests/Application/config/packages/validator.yaml new file mode 100644 index 0000000..61807db --- /dev/null +++ b/tests/Application/config/packages/validator.yaml @@ -0,0 +1,3 @@ +framework: + validation: + enable_annotations: true diff --git a/tests/Application/config/packages/webgriffe_sylius_pausepay_plugin.yaml b/tests/Application/config/packages/webgriffe_sylius_pausepay_plugin.yaml new file mode 100644 index 0000000..0ba1c3a --- /dev/null +++ b/tests/Application/config/packages/webgriffe_sylius_pausepay_plugin.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "@WebgriffeSyliusPausePayPlugin/config/config.php" } diff --git a/tests/Application/config/packages/webpack_encore.yaml b/tests/Application/config/packages/webpack_encore.yaml new file mode 100644 index 0000000..9bee248 --- /dev/null +++ b/tests/Application/config/packages/webpack_encore.yaml @@ -0,0 +1,5 @@ +webpack_encore: + output_path: '%kernel.project_dir%/public/build/default' + builds: + shop: '%kernel.project_dir%/public/build/shop' + admin: '%kernel.project_dir%/public/build/admin' diff --git a/tests/Application/config/routes.yaml b/tests/Application/config/routes.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/routes/dev/web_profiler.yaml b/tests/Application/config/routes/dev/web_profiler.yaml new file mode 100644 index 0000000..3e79dc2 --- /dev/null +++ b/tests/Application/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +_wdt: + resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" + prefix: /_wdt + +_profiler: + resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" + prefix: /_profiler diff --git a/tests/Application/config/routes/liip_imagine.yaml b/tests/Application/config/routes/liip_imagine.yaml new file mode 100644 index 0000000..201cbd5 --- /dev/null +++ b/tests/Application/config/routes/liip_imagine.yaml @@ -0,0 +1,2 @@ +_liip_imagine: + resource: "@LiipImagineBundle/Resources/config/routing.yaml" diff --git a/tests/Application/config/routes/sylius_admin.yaml b/tests/Application/config/routes/sylius_admin.yaml new file mode 100644 index 0000000..1ba48d6 --- /dev/null +++ b/tests/Application/config/routes/sylius_admin.yaml @@ -0,0 +1,3 @@ +sylius_admin: + resource: "@SyliusAdminBundle/Resources/config/routing.yml" + prefix: /admin diff --git a/tests/Application/config/routes/sylius_api.yaml b/tests/Application/config/routes/sylius_api.yaml new file mode 100644 index 0000000..ae01ffc --- /dev/null +++ b/tests/Application/config/routes/sylius_api.yaml @@ -0,0 +1,3 @@ +sylius_api: + resource: "@SyliusApiBundle/Resources/config/routing.yml" + prefix: "%sylius.security.new_api_route%" diff --git a/tests/Application/config/routes/sylius_shop.yaml b/tests/Application/config/routes/sylius_shop.yaml new file mode 100644 index 0000000..fae46cb --- /dev/null +++ b/tests/Application/config/routes/sylius_shop.yaml @@ -0,0 +1,14 @@ +sylius_shop: + resource: "@SyliusShopBundle/Resources/config/routing.yml" + prefix: /{_locale} + requirements: + _locale: ^[A-Za-z]{2,4}(_([A-Za-z]{4}|[0-9]{3}))?(_([A-Za-z]{2}|[0-9]{3}))?$ + +sylius_shop_payum: + resource: "@SyliusShopBundle/Resources/config/routing/payum.yml" + +sylius_shop_default_locale: + path: / + methods: [GET] + defaults: + _controller: sylius.controller.shop.locale_switch::switchAction diff --git a/tests/Application/config/routes/test/routing.yaml b/tests/Application/config/routes/test/routing.yaml new file mode 100644 index 0000000..0ca57d9 --- /dev/null +++ b/tests/Application/config/routes/test/routing.yaml @@ -0,0 +1,5 @@ +sylius_test_plugin_main: + path: /test/main + controller: FrameworkBundle:Template:template + defaults: + template: "@SyliusTestPlugin/main.html.twig" diff --git a/tests/Application/config/routes/test/sylius_test_plugin.yaml b/tests/Application/config/routes/test/sylius_test_plugin.yaml new file mode 100644 index 0000000..0ca57d9 --- /dev/null +++ b/tests/Application/config/routes/test/sylius_test_plugin.yaml @@ -0,0 +1,5 @@ +sylius_test_plugin_main: + path: /test/main + controller: FrameworkBundle:Template:template + defaults: + template: "@SyliusTestPlugin/main.html.twig" diff --git a/tests/Application/config/routes/test_cached/routing.yaml b/tests/Application/config/routes/test_cached/routing.yaml new file mode 100644 index 0000000..0ca57d9 --- /dev/null +++ b/tests/Application/config/routes/test_cached/routing.yaml @@ -0,0 +1,5 @@ +sylius_test_plugin_main: + path: /test/main + controller: FrameworkBundle:Template:template + defaults: + template: "@SyliusTestPlugin/main.html.twig" diff --git a/tests/Application/config/routes/test_cached/sylius_test_plugin.yaml b/tests/Application/config/routes/test_cached/sylius_test_plugin.yaml new file mode 100644 index 0000000..0ca57d9 --- /dev/null +++ b/tests/Application/config/routes/test_cached/sylius_test_plugin.yaml @@ -0,0 +1,5 @@ +sylius_test_plugin_main: + path: /test/main + controller: FrameworkBundle:Template:template + defaults: + template: "@SyliusTestPlugin/main.html.twig" diff --git a/tests/Application/config/routes/webgriffe_sylius_pausepay_plugin.yaml b/tests/Application/config/routes/webgriffe_sylius_pausepay_plugin.yaml new file mode 100644 index 0000000..e3b579c --- /dev/null +++ b/tests/Application/config/routes/webgriffe_sylius_pausepay_plugin.yaml @@ -0,0 +1,11 @@ +webgriffe_sylius_pausepay_plugin_shop: + resource: "@WebgriffeSyliusPausePayPlugin/config/shop_routing.php" + prefix: /{_locale} + requirements: + _locale: ^[A-Za-z]{2,4}(_([A-Za-z]{4}|[0-9]{3}))?(_([A-Za-z]{2}|[0-9]{3}))?$ + +webgriffe_sylius_pausepay_plugin_ajax: + resource: "@WebgriffeSyliusPausePayPlugin/config/shop_ajax_routing.php" + +sylius_shop_payum_cancel: + resource: "@PayumBundle/Resources/config/routing/cancel.xml" diff --git a/tests/Application/config/secrets/dev/.gitignore b/tests/Application/config/secrets/dev/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/secrets/prod/.gitignore b/tests/Application/config/secrets/prod/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/secrets/test/.gitignore b/tests/Application/config/secrets/test/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/secrets/test_cached/.gitignore b/tests/Application/config/secrets/test_cached/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/serialization/.gitignore b/tests/Application/config/serialization/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/config/services.yaml b/tests/Application/config/services.yaml new file mode 100644 index 0000000..615506e --- /dev/null +++ b/tests/Application/config/services.yaml @@ -0,0 +1,4 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + locale: en_US diff --git a/tests/Application/config/services/test/client.php b/tests/Application/config/services/test/client.php new file mode 100644 index 0000000..cc90c2c --- /dev/null +++ b/tests/Application/config/services/test/client.php @@ -0,0 +1,17 @@ +services(); + + $services->set('webgriffe_sylius_pausepay.client', DummyClient::class) + ->args([ + service('router'), + ]) + ; +}; diff --git a/tests/Application/config/services_test.yaml b/tests/Application/config/services_test.yaml new file mode 100644 index 0000000..03c90a1 --- /dev/null +++ b/tests/Application/config/services_test.yaml @@ -0,0 +1,9 @@ +imports: + - { resource: "services/test/*.php" } + - { resource: "../../Behat/Resources/services.php" } + - { resource: "../../../vendor/sylius/sylius/src/Sylius/Behat/Resources/config/services.xml" } + +# workaround needed for strange "test.client.history" problem +# see https://github.com/FriendsOfBehat/SymfonyExtension/issues/88 +services: + Symfony\Component\BrowserKit\AbstractBrowser: '@test.client' diff --git a/tests/Application/config/services_test_cached.yaml b/tests/Application/config/services_test_cached.yaml new file mode 100644 index 0000000..0de380e --- /dev/null +++ b/tests/Application/config/services_test_cached.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "services_test.yaml" } diff --git a/tests/Application/package.json b/tests/Application/package.json new file mode 100644 index 0000000..b428c24 --- /dev/null +++ b/tests/Application/package.json @@ -0,0 +1,13 @@ +{ + "license": "UNLICENSED", + "scripts": { + "build": "encore dev", + "build:prod": "encore production", + "postinstall": "semantic-ui-css-patch", + "lint": "yarn lint:js", + "watch": "encore dev --watch" + }, + "devDependencies": { + "@sylius-ui/frontend": "^1.0" + } +} diff --git a/tests/Application/public/.htaccess b/tests/Application/public/.htaccess new file mode 100644 index 0000000..99ed00d --- /dev/null +++ b/tests/Application/public/.htaccess @@ -0,0 +1,25 @@ +DirectoryIndex app.php + + + RewriteEngine On + + RewriteCond %{HTTP:Authorization} ^(.*) + RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] + + RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ + RewriteRule ^(.*) - [E=BASE:%1] + + RewriteCond %{ENV:REDIRECT_STATUS} ^$ + RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] + + RewriteCond %{REQUEST_FILENAME} -f + RewriteRule .? - [L] + + RewriteRule .? %{ENV:BASE}/index.php [L] + + + + + RedirectMatch 302 ^/$ /index.php/ + + diff --git a/tests/Application/public/favicon.ico b/tests/Application/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..592f7a8e45d5ef6fe2a3c0426b5276e463480ba5 GIT binary patch literal 32038 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 literal 0 HcmV?d00001 diff --git a/tests/Application/public/index.php b/tests/Application/public/index.php new file mode 100644 index 0000000..06dc9e5 --- /dev/null +++ b/tests/Application/public/index.php @@ -0,0 +1,29 @@ +handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/tests/Application/public/robots.txt b/tests/Application/public/robots.txt new file mode 100644 index 0000000..214e411 --- /dev/null +++ b/tests/Application/public/robots.txt @@ -0,0 +1,4 @@ +# www.robotstxt.org/ +# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 + +User-agent: * diff --git a/tests/Application/templates/.gitignore b/tests/Application/templates/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig b/tests/Application/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig new file mode 100644 index 0000000..1d9fa7d --- /dev/null +++ b/tests/Application/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig @@ -0,0 +1,5 @@ + +
+ +
+
diff --git a/tests/Application/templates/bundles/SyliusAdminBundle/Security/_content.html.twig b/tests/Application/templates/bundles/SyliusAdminBundle/Security/_content.html.twig new file mode 100644 index 0000000..ce17621 --- /dev/null +++ b/tests/Application/templates/bundles/SyliusAdminBundle/Security/_content.html.twig @@ -0,0 +1,6 @@ +{% include '@SyliusUi/Security/_login.html.twig' + with { + 'action': path('sylius_admin_login_check'), + 'paths': {'logo': asset('build/admin/images/logo.png', 'admin')} +} +%} diff --git a/tests/Application/templates/bundles/SyliusAdminBundle/_scripts.html.twig b/tests/Application/templates/bundles/SyliusAdminBundle/_scripts.html.twig new file mode 100644 index 0000000..f5f9835 --- /dev/null +++ b/tests/Application/templates/bundles/SyliusAdminBundle/_scripts.html.twig @@ -0,0 +1 @@ +{{ encore_entry_script_tags('admin-entry', null, 'admin') }} diff --git a/tests/Application/templates/bundles/SyliusAdminBundle/_styles.html.twig b/tests/Application/templates/bundles/SyliusAdminBundle/_styles.html.twig new file mode 100644 index 0000000..a96144c --- /dev/null +++ b/tests/Application/templates/bundles/SyliusAdminBundle/_styles.html.twig @@ -0,0 +1 @@ +{{ encore_entry_link_tags('admin-entry', null, 'admin') }} diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig new file mode 100644 index 0000000..8486493 --- /dev/null +++ b/tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig @@ -0,0 +1,9 @@ +
+
+ {{ 'sylius.homepage.banner_content'|trans }} +
+
+
{{ 'sylius.homepage.banner_content'|trans }}
+ {{ 'sylius.homepage.banner_button'|trans }} +
+
diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig new file mode 100644 index 0000000..84b8df5 --- /dev/null +++ b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig @@ -0,0 +1,5 @@ + diff --git a/tests/Application/templates/bundles/SyliusShopBundle/_scripts.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/_scripts.html.twig new file mode 100644 index 0000000..d1655bb --- /dev/null +++ b/tests/Application/templates/bundles/SyliusShopBundle/_scripts.html.twig @@ -0,0 +1 @@ +{{ encore_entry_script_tags('shop-entry', null, 'shop') }} diff --git a/tests/Application/templates/bundles/SyliusShopBundle/_styles.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/_styles.html.twig new file mode 100644 index 0000000..fd2c7cb --- /dev/null +++ b/tests/Application/templates/bundles/SyliusShopBundle/_styles.html.twig @@ -0,0 +1 @@ +{{ encore_entry_link_tags('shop-entry', null, 'shop') }} diff --git a/tests/Application/translations/.gitignore b/tests/Application/translations/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/webpack.config.js b/tests/Application/webpack.config.js new file mode 100644 index 0000000..0d3d978 --- /dev/null +++ b/tests/Application/webpack.config.js @@ -0,0 +1,49 @@ +const path = require('path'); +const Encore = require('@symfony/webpack-encore'); + +const syliusBundles = path.resolve(__dirname, '../../vendor/sylius/sylius/src/Sylius/Bundle/'); +const uiBundleScripts = path.resolve(syliusBundles, 'UiBundle/Resources/private/js/'); +const uiBundleResources = path.resolve(syliusBundles, 'UiBundle/Resources/private/'); + +// Shop config +Encore + .setOutputPath('public/build/shop/') + .setPublicPath('/build/shop') + .addEntry('shop-entry', '../../vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/Resources/private/entry.js') + .disableSingleRuntimeChunk() + .cleanupOutputBeforeBuild() + .enableSourceMaps(!Encore.isProduction()) + .enableVersioning(Encore.isProduction()) + .enableSassLoader(); + +const shopConfig = Encore.getWebpackConfig(); + +shopConfig.resolve.alias['sylius/ui'] = uiBundleScripts; +shopConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; +shopConfig.resolve.alias['sylius/bundle'] = syliusBundles; +shopConfig.resolve.alias['chart.js/dist/Chart.min'] = path.resolve(__dirname, 'node_modules/chart.js/dist/chart.min.js'); +shopConfig.name = 'shop'; + +Encore.reset(); + +// Admin config +Encore + .setOutputPath('public/build/admin/') + .setPublicPath('/build/admin') + .addEntry('admin-entry', '../../vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/private/entry.js') + .disableSingleRuntimeChunk() + .cleanupOutputBeforeBuild() + .enableSourceMaps(!Encore.isProduction()) + .enableVersioning(Encore.isProduction()) + .enableSassLoader(); + +const adminConfig = Encore.getWebpackConfig(); + +adminConfig.resolve.alias['sylius/ui'] = uiBundleScripts; +adminConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; +adminConfig.resolve.alias['sylius/bundle'] = syliusBundles; +adminConfig.resolve.alias['chart.js/dist/Chart.min'] = path.resolve(__dirname, 'node_modules/chart.js/dist/chart.min.js'); +adminConfig.externals = Object.assign({}, adminConfig.externals, { window: 'window', document: 'document' }); +adminConfig.name = 'admin'; + +module.exports = [shopConfig, adminConfig]; diff --git a/tests/Behat/Resources/services.php b/tests/Behat/Resources/services.php new file mode 100644 index 0000000..8cc3ee1 --- /dev/null +++ b/tests/Behat/Resources/services.php @@ -0,0 +1,9 @@ +import('services/*.php'); +}; diff --git a/tests/Behat/Resources/suites.yml b/tests/Behat/Resources/suites.yml new file mode 100644 index 0000000..e69de29