diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..5e4fa3e5 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: "/tests/UI" + schedule: + interval: weekly + day: monday + time: "04:00" + open-pull-requests-limit: 10 + target-branch: dev + reviewers: + - "PrestaShop/qa-automation" + labels: + - "dependencies" + - "E2E Tests" + - "TE" diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 4f9f24e4..7cd88851 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -23,7 +23,7 @@ jobs: with: node-version: 14.x - - run: npm install + - run: npm ci - name: Build PrestaShop assets run: | @@ -61,7 +61,7 @@ jobs: if: github.event_name == 'push' && github.event.ref == 'refs/heads/master' steps: - name: Download artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4.1.7 with: name: ${{ github.event.repository.name }} diff --git a/.github/workflows/ui-test.yml b/.github/workflows/ui-test.yml new file mode 100644 index 00000000..6492ee86 --- /dev/null +++ b/.github/workflows/ui-test.yml @@ -0,0 +1,160 @@ +name: UI Tests +on: + ## Check each PR + push: + pull_request: + ## Manual execution on branch + workflow_dispatch: + ## Nightly + ### Needs secrets + #### GC_PROJECT_ID + #### GC_SERVICE_KEY + #### NIGHTLY_TOKEN + schedule: + - cron: '0 0 * * *' + +env: + CAMPAIGN: 'blockwishlist' + +jobs: + ui_test: + name: UI Tests + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + include: + - PS_VERSION: '8.0.5' + PHP_VERSION: '8.1' + - PS_VERSION: '8.1.7' + PHP_VERSION: '8.1' + - PS_VERSION: 'nightly' + PHP_VERSION: '8.2' + + env: + PS_VERSION: ${{ matrix.PS_VERSION }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 16 + + - name: Build + run: npm install && npm run build + + - name: Build ZIP + run: | + cd .. + zip -r ${{ github.event.repository.name }}.zip ${{ github.event.repository.name }} + cd ${{ github.event.repository.name }} + + - name: Start containers + working-directory: tests/UI/ + env: + PS_VERSION: ${{ matrix.PS_VERSION }} + PHP_VERSION: ${{ matrix.PHP_VERSION }} + run: | + docker compose -f "docker-compose.yml" up -d --build + bash -c 'while [[ "$(curl -L -s -o /dev/null -w %{http_code} http://localhost/en/)" != "200" ]]; do sleep 5; done' + + - name: Install dependencies + working-directory: tests/UI/ + run: npm ci + + - name: Install Playwright Browsers + working-directory: tests/UI/ + run: npx playwright install chromium --with-deps + + - name: Run Playwright tests + working-directory: tests/UI/ + run: npx playwright test + + - name: Upload artifact report + uses: actions/upload-artifact@v4 + with: + name: playwright-report-${{ matrix.PS_VERSION }} + path: tests/UI/report.json + + - name: Export Docker errors + working-directory: tests/UI/ + if: always() + run: docker compose logs --no-color >& docker-compose.log + + - name: Upload artifact logs + uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-logs-${{ matrix.PS_VERSION }} + path: | + tests/UI/reports/ + tests/UI/docker-compose.log + + nightly: + name: Nightly Report + if: ${{ github.event_name == 'schedule' }} + needs: + - ui_test + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + include: + - PS_VERSION: '8.0.5' + PHP_VERSION: '8.1' + - PS_VERSION: '8.1.7' + PHP_VERSION: '8.1' + - PS_VERSION: 'nightly' + PHP_VERSION: '8.2' + + env: + PS_VERSION: ${{ matrix.PS_VERSION }} + PHP_VERSION: ${{ matrix.PHP_VERSION }} + + permissions: + contents: 'read' + id-token: 'write' + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Download report + uses: actions/download-artifact@v4.1.7 + with: + name: playwright-report-${{ matrix.PS_VERSION }} + path: tests/UI/ + + - name: "Nightly : Rename file" + working-directory: tests/UI/ + run: | + mkdir -p nightly + REPORT_NAME="${{ env.CAMPAIGN }}_$(date +%Y-%m-%d)-${{ matrix.PS_VERSION }}" + mv report.json nightly/${REPORT_NAME}.json + + - name: "Nightly : Auth GCP" + uses: google-github-actions/auth@v1 + with: + credentials_json: ${{ secrets.GC_SERVICE_KEY }} + project_id: ${{ secrets.GC_PROJECT_ID }} + + - name: "Nightly : Setup GCP" + uses: google-github-actions/setup-gcloud@v1 + + - name: "Nightly : Upload to Google Cloud Storage (GCS)" + working-directory: tests/UI/ + run: gsutil cp -r "nightly/**" gs://prestashop-core-nightly/reports + + - name: "Nightly : Push Report" + run: | + REPORT_NAME="${{ env.CAMPAIGN }}_$(date +%Y-%m-%d)-${{ matrix.PS_VERSION }}" + curl -v "https://api-nightly.prestashop-project.org/import/report/playwright?token=${{ secrets.NIGHTLY_TOKEN }}&filename=${REPORT_NAME}.json&campaign=${{ env.CAMPAIGN }}&platform=chromium" diff --git a/.gitignore b/.gitignore index 83006710..ce688301 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,9 @@ node_modules # mac .DS_Store + +## UI Tests +/tests/UI/.env +/tests/UI/node_modules/ +/tests/UI/report.json +/tests/UI/reports/ diff --git a/Makefile b/Makefile index 47719c9e..2b547d8d 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,11 @@ db: docker-build docker-build: build-back build-front build-back: - docker-compose run --rm php sh -c "composer install" + docker compose run --rm php sh -c "composer install" build-back-prod: - docker-compose run --rm php sh -c "composer install --no-dev -o" + docker compose run --rm php sh -c "composer install --no-dev -o" build-front: - docker-compose run --rm node sh -c "npm install" - docker-compose run --rm node sh -c "npm run build" + docker compose run --rm node sh -c "npm install" + docker compose run --rm node sh -c "npm run build" diff --git a/_dev/front/js/components/Button/Button.vue b/_dev/front/js/components/Button/Button.vue index f59f4f19..c7f91cb8 100644 --- a/_dev/front/js/components/Button/Button.vue +++ b/_dev/front/js/components/Button/Button.vue @@ -102,7 +102,7 @@ EventBus.$emit('showAddToWishList', { detail: { productId: this.productId, - productAttributeId: parseInt(this.productAttributeId, 10), + productAttributeId: parseInt(this.idProductAttribute, 10), forceOpen: true, quantity: quantity ? parseInt(quantity.value, 10) : 0, }, @@ -113,7 +113,7 @@ variables: { productId: this.productId, url: this.url, - productAttributeId: this.productAttributeId, + productAttributeId: this.idProductAttribute, listId: this.idList ? this.idList : this.listId, }, }); @@ -140,7 +140,7 @@ EventBus.$on('addedToWishlist', (event) => { if ( event.detail.productId === this.productId - && parseInt(event.detail.productAttributeId, 10) === this.productAttributeId + && parseInt(event.detail.productAttributeId, 10) === this.idProductAttribute ) { this.isChecked = true; this.idList = event.detail.listId; @@ -150,7 +150,7 @@ // eslint-disable-next-line const items = productsAlreadyTagged.filter( (e) => parseInt(e.id_product, 10) === this.productId - && parseInt(e.id_product_attribute, 10) === this.productAttributeId, + && parseInt(e.id_product_attribute, 10) === this.idProductAttribute, ); if (items.length > 0) { @@ -176,7 +176,7 @@ const itemsFiltered = productsAlreadyTagged.filter( (e) => parseInt(e.id_product, 10) === this.productId && e.quantity.toString() === quantity.value - && parseInt(e.id_product_attribute, 10) === this.productAttributeId, + && parseInt(e.id_product_attribute, 10) === this.idProductAttribute, ); if (itemsFiltered.length > 0) { diff --git a/_dev/front/js/components/Create/Create.vue b/_dev/front/js/components/Create/Create.vue index 1656d96b..03a75784 100644 --- a/_dev/front/js/components/Create/Create.vue +++ b/_dev/front/js/components/Create/Create.vue @@ -139,21 +139,3 @@ }, }; - - diff --git a/_dev/front/js/components/Delete/Delete.vue b/_dev/front/js/components/Delete/Delete.vue index 3ccaf7c6..ecf28ebd 100644 --- a/_dev/front/js/components/Delete/Delete.vue +++ b/_dev/front/js/components/Delete/Delete.vue @@ -156,22 +156,3 @@ }, }; - - diff --git a/_dev/front/js/components/Login/Login.vue b/_dev/front/js/components/Login/Login.vue index a5e9fb89..56647585 100644 --- a/_dev/front/js/components/Login/Login.vue +++ b/_dev/front/js/components/Login/Login.vue @@ -65,17 +65,3 @@ }, }; - - diff --git a/_dev/front/js/components/Product/Product.vue b/_dev/front/js/components/Product/Product.vue index 764faeeb..f757b29d 100644 --- a/_dev/front/js/components/Product/Product.vue +++ b/_dev/front/js/components/Product/Product.vue @@ -116,23 +116,23 @@