diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 650c9aca..f930ed8d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,11 +21,11 @@ jobs: strategy: fail-fast: false matrix: - php: ["8.0"] + php: ["8.1"] symfony: ["^5.4", "^6.0"] - sylius: ["~1.11.0", "~1.12.0"] + sylius: ["~1.11.0", "~1.12.0", "1.13.x-dev as 1.13.0"] node: ["14.x"] - mysql: ["8.0"] + mysql: ["8.0.36"] exclude: - sylius: ~1.11.0 @@ -142,7 +142,7 @@ jobs: - name: Copy package.json.dist to package.json if: matrix.sylius != '' - run: (cd tests/Application && cp package.json.\${{ matrix.sylius }}.dist package.json) + run: (cd tests/Application && cp "package.json.${{ matrix.sylius }}.dist" package.json) - name: Install JS dependencies @@ -170,6 +170,7 @@ jobs: - name: Validate composer.json + if: ${{ matrix.sylius != '1.13.x-dev as 1.13.0' }} run: composer validate --ansi --strict - @@ -185,7 +186,14 @@ jobs: - name: Run Behat - run: vendor/bin/behat --colors --strict -vvv --no-interaction || vendor/bin/behat --colors --strict -vvv --no-interaction --rerun + if: ${{ matrix.sylius != '1.13.x-dev as 1.13.0' }} + run: vendor/bin/behat --colors --strict -vvv --no-interaction --tags '~@sylius113' || vendor/bin/behat --colors --strict -vvv --no-interaction --rerun --tags '~@sylius113' + + - + name: Run Behat + if: ${{ matrix.sylius == '1.13.x-dev as 1.13.0' }} + run: vendor/bin/behat --colors --strict -vvv --no-interaction --tags '~@sylius112' || vendor/bin/behat --colors --strict -vvv --no-interaction --rerun --tags '~@sylius112' + - name: Upload Behat logs @@ -211,4 +219,4 @@ jobs: SLACK_MESSAGE: ':x:' SLACK_TITLE: Failed build on ${{ github.event.repository.name }} repository SLACK_USERNAME: ${{ secrets.FAILED_BUILD_SLACK_USERNAME }} - SLACK_WEBHOOK: ${{ secrets.FAILED_BUILD_SLACK_WEBHOOK }} \ No newline at end of file + SLACK_WEBHOOK: ${{ secrets.FAILED_BUILD_SLACK_WEBHOOK }} diff --git a/composer.json b/composer.json index 65d4a674..53066bb2 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "require": { "ext-json": "*", "php": "^8.0", - "sylius/sylius": "~1.11.0 || ~1.12.0", + "sylius/sylius": "~1.11.0 || >=1.12.13 || ~1.13.0", "friendsofsymfony/elastica-bundle": "^6.0", "symfony/property-access": "^5.4 || ^6.0", "symfony/webpack-encore-bundle": "^1.16", @@ -48,7 +48,9 @@ "twig/extra-bundle": "^3.4" }, "conflict": { - "symfony/form": "4.4.11 || 4.4.12" + "symfony/form": "4.4.11 || 4.4.12", + "api-platform/core": "v2.7.17", + "sylius/sylius": "<= 1.12.13" }, "autoload": { "psr-4": { diff --git a/features/shop/site_wide_searching_products.feature b/features/shop/site_wide_searching_products.feature index 6888f88a..41dd6cc3 100644 --- a/features/shop/site_wide_searching_products.feature +++ b/features/shop/site_wide_searching_products.feature @@ -1,4 +1,4 @@ -@site_wide_searching_products +@site_wide_searching_products @sylius112 Feature: Site-wide products search In order to quickly find products I want to buy As a Customer diff --git a/features/shop/site_wide_searching_products_113.feature b/features/shop/site_wide_searching_products_113.feature new file mode 100644 index 00000000..7ab7cc43 --- /dev/null +++ b/features/shop/site_wide_searching_products_113.feature @@ -0,0 +1,152 @@ +@site_wide_searching_products @sylius113 +Feature: Site-wide products search + In order to quickly find products I want to buy + As a Customer + I want to be able to search products across the entire catalog + + Background: + Given the store operates on a channel named "Web-US" in "USD" currency + And the store classifies its products as "Cars" + And the store classifies its products as "Motorbikes" + And the store has a select product attribute "Car Type" with values "Cabrio" and "SUV" + And the store has a select product attribute "Motorbike Type" with values "Enduro" and "Naked" + And there is a product named "BMW Z4" in the store + And this product's price is "$42,670.00" + And this product has select attribute "Car Type" with value "Cabrio" + And this product has a text attribute "Color" with value "Red" + And this product has option "Supply" with values "Gasoline" and "Diesel" + And this product is available in "Gasoline" supply priced at "$42,670.00" + And this product is available in "Diesel" supply priced at "$45,670.00" + And this product belongs to "Cars" + And there is a product named "Volvo XC90" in the store + And this product's price is "$64,505.80" + And this product has select attribute "Car Type" with value "SUV" + And this product has a text attribute "Color" with value "Black" + And this product belongs to "Cars" + And there is a product named "BMW 5 Series" in the store + And this product's price is "$52,070.00" + And this product has select attribute "Car Type" with value "Cabrio" + And this product has a text attribute "Color" with value "Red" + And this product belongs to "Cars" + And there is a product named "Lamborghini Aventador" in the store + And this product's price is "$450,000.00" + And this product has a text attribute "Color" with value "Yellow" + And this product belongs to "Cars" + And there is a product named "BMW GS" in the store + And this product's price is "$18,070.00" + And this product has select attribute "Motorbike Type" with value "Enduro" + And this product has a text attribute "Color" with value "Grey" + And this product belongs to "Motorbikes" + And there is a product named "Ducati Monster" in the store + And this product's price is "$14,995.00" + And this product has select attribute "Motorbike Type" with value "Naked" + And this product has a text attribute "Color" with value "Black" + And this product's short description is: + """ + This is the Ducati Monster which is much better than any other BMW motorbike. + """ + And this product belongs to "Motorbikes" + And there is a product named "Honda Africa Twin" in the store + And this product has select attribute "Motorbike Type" with value "Enduro" + And this product has a text attribute "Color" with value "Green & White" + And this product's price is "$13,490.00" + And this product's description is: + """ + This is the Honda Africa Twin which is like the BMW GS but from Honda. + """ + And this product belongs to "Motorbikes" + And the data is populated to Elasticsearch + + @ui + Scenario: Searching products by name, description and short description in all taxons + When I browse the search page + And I search the products by "BMW" phrase in the site-wide search box + Then I should see the product "BMW Z4" in the search results + And I should see the product "BMW GS" in the search results + And I should see the product "BMW 5 Series" in the search results + And I should see the product "Honda Africa Twin" in the search results + And I should see the product "Ducati Monster" in the search results + + @ui + Scenario: Searching products from the home page + When I open the home page + And I search the products by "Lamborghini" phrase in the site-wide search box + Then I should see the product "Lamborghini Aventador" in the search results + + @ui + Scenario: Searching products and viewing price aggregations + When I browse the search page + And I search the products by "BMW" phrase in the site-wide search box + Then I should see the following intervals in the price filter: + """ + $10,000.00 - $20,000.00 (3) + $40,000.00 - $50,000.00 (1) + $50,000.00 - $60,000.00 (1) + """ + And I should see 5 products in search results + + @ui + Scenario: Searching products and viewing taxon aggregations + When I browse the search page + And I search the products by "BMW" phrase in the site-wide search box + Then I should see the following options in the taxon filter: + """ + Motorbikes (3) + Cars (2) + """ + And I should see 5 products in search results + + @ui + Scenario: Searching products and filtering by price + When I browse the search page + And I search the products by "BMW" phrase in the site-wide search box + And I filter by price interval "$10,000.00 - $20,000.00" + And I filter by price interval "$50,000.00 - $60,000.00" + Then I should see 4 products in search results + + @ui + Scenario: Searching products and filtering by taxon + When I browse the search page + And I search the products by "BMW" phrase in the site-wide search box + And I filter by taxon "Motorbikes" + Then I should see 3 products in search results + + @ui + Scenario: Searching products and viewing car type and motorbike type select attributes aggregations + When I browse the search page + And I search the products by "BMW or Volvo" phrase in the site-wide search box + Then I should see the following options in the "Car Type" attribute filter: + """ + Cabrio (2) + Suv (1) + """ + And I should see the following options in the "Motorbike Type" attribute filter: + """ + Enduro (2) + Naked (1) + """ + And I should see 6 products in search results + + @ui + Scenario: Searching products and viewing color text attribute aggregations + When I browse the search page + And I search the products by "BMW or Volvo" phrase in the site-wide search box + Then I should see the following options in the "Color" attribute filter: + """ + Black (2) + Red (2) + Green & White (1) + Grey (1) + """ + And I should see 6 products in search results + + @ui + Scenario: Searching products and viewing supply option aggregations + When I browse the search page + And I search the products by "BMW or Volvo" phrase in the site-wide search box + Then I should see the following options in the "Supply" option filter: + """ + Diesel (1) + Gasoline (1) + """ + And I should see 6 products in search results diff --git a/src/Controller/RequestDataHandler/PaginationDataHandler.php b/src/Controller/RequestDataHandler/PaginationDataHandler.php index 0a6c186d..ed3ce9c8 100644 --- a/src/Controller/RequestDataHandler/PaginationDataHandler.php +++ b/src/Controller/RequestDataHandler/PaginationDataHandler.php @@ -31,7 +31,7 @@ public function retrieveData(array $requestData): array return $data; } - private function resolvePage(array $requestData, array &$data): void + private function resolvePage(array $requestData, array & $data): void { $page = 1; @@ -42,7 +42,7 @@ private function resolvePage(array $requestData, array &$data): void $data[self::PAGE_INDEX] = $page; } - private function resolveLimit(array $requestData, array &$data): void + private function resolveLimit(array $requestData, array & $data): void { $limit = $this->defaultLimit; diff --git a/src/Controller/RequestDataHandler/ShopProductListDataHandler.php b/src/Controller/RequestDataHandler/ShopProductListDataHandler.php index 22a8b323..55a749f3 100644 --- a/src/Controller/RequestDataHandler/ShopProductListDataHandler.php +++ b/src/Controller/RequestDataHandler/ShopProductListDataHandler.php @@ -71,7 +71,7 @@ public function retrieveData(array $requestData): array private function handleOptionsPrefixedProperty( array $requestData, - array &$data + array & $data ): void { if (!isset($requestData['options'])) { return; @@ -88,7 +88,7 @@ private function handleOptionsPrefixedProperty( private function handleAttributesPrefixedProperty( array $requestData, - array &$data, + array & $data, ?array $attributesDefinitions = [] ): void { if (!isset($requestData['attributes'])) { diff --git a/tests/Application/config/bundles.php b/tests/Application/config/bundles.php index bb78b009..a39c4ab4 100644 --- a/tests/Application/config/bundles.php +++ b/tests/Application/config/bundles.php @@ -2,7 +2,9 @@ declare(strict_types=1); -return [ +use Sylius\Bundle\CoreBundle\SyliusCoreBundle; + +$bundles = [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], @@ -63,3 +65,10 @@ Sylius\Calendar\SyliusCalendarBundle::class => ['all' => true], BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true], ]; + + +if ( defined(SyliusCoreBundle::class.'::VERSION_ID') && SyliusCoreBundle::VERSION_ID >= '11300') { + $bundles[Sylius\Abstraction\StateMachine\SyliusStateMachineAbstractionBundle::class] = ['all' => true]; +} + +return $bundles; \ No newline at end of file diff --git a/tests/Application/package.json.1.13.x-dev as 1.13.0.dist b/tests/Application/package.json.1.13.x-dev as 1.13.0.dist new file mode 100644 index 00000000..36e6c1f0 --- /dev/null +++ b/tests/Application/package.json.1.13.x-dev as 1.13.0.dist @@ -0,0 +1,41 @@ +{ + "dependencies": { + "@babel/polyfill": "^7.0.0", + "chart.js": "^3.7.1", + "jquery": "^3.5.0", + "jquery.dirtyforms": "^2.0.0", + "lightbox2": "^2.9.0", + "semantic-ui-css": "^2.2.0", + "slick-carousel": "^1.8.1" + }, + "devDependencies": { + "@symfony/webpack-encore": "^1.6.1", + "babel-core": "^6.26.3", + "babel-plugin-external-helpers": "^6.22.0", + "babel-plugin-module-resolver": "^3.1.1", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-preset-env": "^1.7.0", + "babel-register": "^6.26.0", + "dedent": "^0.7.0", + "eslint": "^4.19.1", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-import-resolver-babel-module": "^4.0.0", + "eslint-plugin-import": "^2.11.0", + "merge-stream": "^1.0.0", + "sass": "^1.39.2", + "sass-loader": "^12.1.0" + }, + "scripts": { + "dev": "yarn encore dev", + "watch": "yarn encore dev --watch", + "prod": "yarn encore prod", + "lint": "yarn lint:js", + "lint:js": "eslint gulpfile.babel.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Sylius/Sylius.git" + }, + "author": "Paweł Jędrzejewski", + "license": "MIT" +}