From 1f01a09e8750cc2e23566d1988e4a31463379575 Mon Sep 17 00:00:00 2001 From: Karolina Rakoczy Date: Fri, 23 Jul 2021 12:46:44 +0300 Subject: [PATCH] add tags (#1251) * add tags * edit e2e.yaml * fix test for customer registration * add empty lines --- .github/workflows/e2e.yml | 2 +- cypress/elements/shared/sharedElements.js | 3 +- cypress/integration/adyen.js | 182 ++++++++++++ cypress/integration/allEnv/apps.js | 104 ------- cypress/integration/allEnv/categories.js | 136 --------- .../allEnv/checkout/productWithoutShipping.js | 118 -------- .../allEnv/checkout/stocksInCheckout.js | 162 ----------- .../integration/allEnv/checkout/warehouses.js | 68 ----- cypress/integration/allEnv/collections.js | 178 ------------ .../configuration/attributes/attributes.js | 120 -------- .../attributes/contentAttribute.js | 120 -------- .../allEnv/configuration/channels.js | 160 ----------- .../allEnv/configuration/customer.js | 63 ----- .../allEnv/configuration/inactiveChannel.js | 148 ---------- .../allEnv/configuration/navigation.js | 66 ----- .../allEnv/configuration/permissions.js | 148 ---------- .../allEnv/configuration/productTypes.js | 103 ------- .../shippingMethods/channelsInShipping.js | 124 --------- .../shippingMethods/createShippingMethod.js | 141 ---------- .../shippingMethods/postalCodes.js | 134 --------- .../shippingMethods/shippingWeight.js | 187 ------------- .../allEnv/configuration/siteSettings.js | 78 ------ .../allEnv/configuration/warehouse.js | 112 -------- .../allEnv/customerRegistration.js | 55 ---- cypress/integration/allEnv/discounts/sales.js | 198 ------------- .../integration/allEnv/discounts/vouchers.js | 177 ------------ .../integration/allEnv/homePage/homePage.js | 19 -- .../allEnv/homePage/homePageAnalitics.js | 251 ----------------- cypress/integration/allEnv/login_form.js | 39 --- cypress/integration/allEnv/metadata.js | 100 ------- cypress/integration/allEnv/navigation.js | 45 --- .../allEnv/orders/channelsInDraftOrders.js | 98 ------- .../integration/allEnv/orders/draftOrders.js | 102 ------- cypress/integration/allEnv/orders/orders.js | 200 ------------- cypress/integration/allEnv/pages/pageTypes.js | 61 ---- .../productTypes/purchaseWithProductTypes.js | 233 ---------------- .../allEnv/products/createProduct.js | 141 ---------- .../availableForPurchaseProducts.js | 117 -------- .../menageProducts/publishedProducts.js | 105 ------- .../visibleInListingsProducts.js | 114 -------- .../productsList/filteringProducts.js | 120 -------- .../products/productsList/pagination.js | 61 ---- .../products/productsList/sortingProducts.js | 28 -- .../allEnv/products/productsVariants.js | 206 -------------- .../allEnv/products/updatingProducts.js | 151 ---------- cypress/integration/apps.js | 110 ++++++++ cypress/integration/categories.js | 139 ++++++++++ .../checkout/productWithoutShipping.js | 124 +++++++++ .../checkout/purchaseWithProductTypes.js | 240 ++++++++++++++++ .../integration/checkout/stocksInCheckout.js | 168 +++++++++++ cypress/integration/checkout/warehouses.js | 71 +++++ cypress/integration/collections.js | 184 ++++++++++++ .../configuration/attributes/attributes.js | 123 ++++++++ .../attributes/contentAttribute.js | 123 ++++++++ cypress/integration/configuration/channels.js | 163 +++++++++++ cypress/integration/configuration/customer.js | 66 +++++ .../configuration/inactiveChannel.js | 151 ++++++++++ .../integration/configuration/navigation.js | 69 +++++ .../integration/configuration/permissions.js | 151 ++++++++++ .../integration/configuration/productTypes.js | 106 +++++++ .../shippingMethods/channelsInShipping.js | 129 +++++++++ .../shippingMethods/createShippingMethod.js | 144 ++++++++++ .../shippingMethods/postalCodes.js | 137 +++++++++ .../shippingMethods/shippingWeight.js | 190 +++++++++++++ .../integration/configuration/siteSettings.js | 78 ++++++ .../integration/configuration/warehouse.js | 115 ++++++++ cypress/integration/customerRegistration.js | 85 ++++++ cypress/integration/discounts/sales.js | 201 ++++++++++++++ cypress/integration/discounts/vouchers.js | 182 ++++++++++++ cypress/integration/homePage/homePage.js | 22 ++ .../integration/homePage/homePageAnalitics.js | 262 ++++++++++++++++++ cypress/integration/login_form.js | 42 +++ cypress/integration/metadata.js | 100 +++++++ cypress/integration/navigation.js | 52 ++++ .../orders/channelsInDraftOrders.js | 101 +++++++ cypress/integration/orders/draftOrders.js | 105 +++++++ cypress/integration/orders/orders.js | 211 ++++++++++++++ cypress/integration/pages/pageTypes.js | 64 +++++ cypress/integration/products/createProduct.js | 145 ++++++++++ .../availableForPurchaseProducts.js | 121 ++++++++ .../menageProducts/publishedProducts.js | 109 ++++++++ .../visibleInListingsProducts.js | 118 ++++++++ .../productsList/filteringProducts.js | 123 ++++++++ .../products/productsList/pagination.js | 64 +++++ .../products/productsList/sortingProducts.js | 31 +++ .../integration/products/productsVariants.js | 209 ++++++++++++++ .../integration/products/updatingProducts.js | 152 ++++++++++ cypress/integration/staffMembers.js | 115 ++++++++ cypress/integration/stagedOnly/adyen.js | 173 ------------ .../stagedOnly/customerRegistration.js | 40 --- .../integration/stagedOnly/staffMembers.js | 112 -------- cypress/steps/collectionsSteps.js | 4 +- cypress/steps/shared/confirmationMessage.js | 4 +- cypress/steps/shared/confirmationMessages.js | 4 +- cypress/support/filterTests.js | 24 ++ package.json | 3 +- 96 files changed, 5612 insertions(+), 5425 deletions(-) create mode 100644 cypress/integration/adyen.js delete mode 100644 cypress/integration/allEnv/apps.js delete mode 100644 cypress/integration/allEnv/categories.js delete mode 100644 cypress/integration/allEnv/checkout/productWithoutShipping.js delete mode 100644 cypress/integration/allEnv/checkout/stocksInCheckout.js delete mode 100644 cypress/integration/allEnv/checkout/warehouses.js delete mode 100644 cypress/integration/allEnv/collections.js delete mode 100644 cypress/integration/allEnv/configuration/attributes/attributes.js delete mode 100644 cypress/integration/allEnv/configuration/attributes/contentAttribute.js delete mode 100644 cypress/integration/allEnv/configuration/channels.js delete mode 100644 cypress/integration/allEnv/configuration/customer.js delete mode 100644 cypress/integration/allEnv/configuration/inactiveChannel.js delete mode 100644 cypress/integration/allEnv/configuration/navigation.js delete mode 100644 cypress/integration/allEnv/configuration/permissions.js delete mode 100644 cypress/integration/allEnv/configuration/productTypes.js delete mode 100644 cypress/integration/allEnv/configuration/shippingMethods/channelsInShipping.js delete mode 100644 cypress/integration/allEnv/configuration/shippingMethods/createShippingMethod.js delete mode 100644 cypress/integration/allEnv/configuration/shippingMethods/postalCodes.js delete mode 100644 cypress/integration/allEnv/configuration/shippingMethods/shippingWeight.js delete mode 100644 cypress/integration/allEnv/configuration/siteSettings.js delete mode 100644 cypress/integration/allEnv/configuration/warehouse.js delete mode 100644 cypress/integration/allEnv/customerRegistration.js delete mode 100644 cypress/integration/allEnv/discounts/sales.js delete mode 100644 cypress/integration/allEnv/discounts/vouchers.js delete mode 100644 cypress/integration/allEnv/homePage/homePage.js delete mode 100644 cypress/integration/allEnv/homePage/homePageAnalitics.js delete mode 100644 cypress/integration/allEnv/login_form.js delete mode 100644 cypress/integration/allEnv/metadata.js delete mode 100644 cypress/integration/allEnv/navigation.js delete mode 100644 cypress/integration/allEnv/orders/channelsInDraftOrders.js delete mode 100644 cypress/integration/allEnv/orders/draftOrders.js delete mode 100644 cypress/integration/allEnv/orders/orders.js delete mode 100644 cypress/integration/allEnv/pages/pageTypes.js delete mode 100644 cypress/integration/allEnv/productTypes/purchaseWithProductTypes.js delete mode 100644 cypress/integration/allEnv/products/createProduct.js delete mode 100644 cypress/integration/allEnv/products/menageProducts/availableForPurchaseProducts.js delete mode 100644 cypress/integration/allEnv/products/menageProducts/publishedProducts.js delete mode 100644 cypress/integration/allEnv/products/menageProducts/visibleInListingsProducts.js delete mode 100644 cypress/integration/allEnv/products/productsList/filteringProducts.js delete mode 100644 cypress/integration/allEnv/products/productsList/pagination.js delete mode 100644 cypress/integration/allEnv/products/productsList/sortingProducts.js delete mode 100644 cypress/integration/allEnv/products/productsVariants.js delete mode 100644 cypress/integration/allEnv/products/updatingProducts.js create mode 100644 cypress/integration/apps.js create mode 100644 cypress/integration/categories.js create mode 100644 cypress/integration/checkout/productWithoutShipping.js create mode 100644 cypress/integration/checkout/purchaseWithProductTypes.js create mode 100644 cypress/integration/checkout/stocksInCheckout.js create mode 100644 cypress/integration/checkout/warehouses.js create mode 100644 cypress/integration/collections.js create mode 100644 cypress/integration/configuration/attributes/attributes.js create mode 100644 cypress/integration/configuration/attributes/contentAttribute.js create mode 100644 cypress/integration/configuration/channels.js create mode 100644 cypress/integration/configuration/customer.js create mode 100644 cypress/integration/configuration/inactiveChannel.js create mode 100644 cypress/integration/configuration/navigation.js create mode 100644 cypress/integration/configuration/permissions.js create mode 100644 cypress/integration/configuration/productTypes.js create mode 100644 cypress/integration/configuration/shippingMethods/channelsInShipping.js create mode 100644 cypress/integration/configuration/shippingMethods/createShippingMethod.js create mode 100644 cypress/integration/configuration/shippingMethods/postalCodes.js create mode 100644 cypress/integration/configuration/shippingMethods/shippingWeight.js create mode 100644 cypress/integration/configuration/siteSettings.js create mode 100644 cypress/integration/configuration/warehouse.js create mode 100644 cypress/integration/customerRegistration.js create mode 100644 cypress/integration/discounts/sales.js create mode 100644 cypress/integration/discounts/vouchers.js create mode 100644 cypress/integration/homePage/homePage.js create mode 100644 cypress/integration/homePage/homePageAnalitics.js create mode 100644 cypress/integration/login_form.js create mode 100644 cypress/integration/metadata.js create mode 100644 cypress/integration/navigation.js create mode 100644 cypress/integration/orders/channelsInDraftOrders.js create mode 100644 cypress/integration/orders/draftOrders.js create mode 100644 cypress/integration/orders/orders.js create mode 100644 cypress/integration/pages/pageTypes.js create mode 100644 cypress/integration/products/createProduct.js create mode 100644 cypress/integration/products/menageProducts/availableForPurchaseProducts.js create mode 100644 cypress/integration/products/menageProducts/publishedProducts.js create mode 100644 cypress/integration/products/menageProducts/visibleInListingsProducts.js create mode 100644 cypress/integration/products/productsList/filteringProducts.js create mode 100644 cypress/integration/products/productsList/pagination.js create mode 100644 cypress/integration/products/productsList/sortingProducts.js create mode 100644 cypress/integration/products/productsVariants.js create mode 100644 cypress/integration/products/updatingProducts.js create mode 100644 cypress/integration/staffMembers.js delete mode 100644 cypress/integration/stagedOnly/adyen.js delete mode 100644 cypress/integration/stagedOnly/customerRegistration.js delete mode 100644 cypress/integration/stagedOnly/staffMembers.js create mode 100644 cypress/support/filterTests.js diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index e650f9202..de47bdc2f 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -63,7 +63,7 @@ jobs: start: npx local-web-server --spa index.html wait-on: http://localhost:9000/ wait-on-timeout: 120 - spec: cypress/integration/allEnv/**/*.js + command: npm run cy:run:allEnv - uses: actions/upload-artifact@v1 if: ${{ failure() }} with: diff --git a/cypress/elements/shared/sharedElements.js b/cypress/elements/shared/sharedElements.js index 80abfba1d..e7d9d10fc 100644 --- a/cypress/elements/shared/sharedElements.js +++ b/cypress/elements/shared/sharedElements.js @@ -5,8 +5,7 @@ export const SHARED_ELEMENTS = { skeleton: '[data-test-id="skeleton"]', table: 'table[class*="Table"]', tableRow: '[data-test="id"]', - confirmationMsg: "[data-test='notification-success']", - notificationSuccess: '[data-test="notification-success"]', + notificationSuccess: '[data-test="notification"][data-test-type="success"]', dialog: '[role="dialog"]', searchInput: '[data-test-id="searchInput"]', selectOption: '[data-test="selectFieldOption"]', diff --git a/cypress/integration/adyen.js b/cypress/integration/adyen.js new file mode 100644 index 000000000..5a890ad64 --- /dev/null +++ b/cypress/integration/adyen.js @@ -0,0 +1,182 @@ +import faker from "faker"; + +import { + addShippingMethod, + completeCheckout, + createCheckout +} from "../apiRequests/Checkout"; +import { getOrder } from "../apiRequests/Order"; +import filterTests from "../support/filterTests"; +import { getDefaultChannel } from "../utils/channelsUtils"; +import { addAdyenPayment } from "../utils/ordersUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../utils/shippingUtils"; + +filterTests(["stagedOnly"], () => { + describe("Adyen payments", () => { + const startsWith = "CyChannelInDraftOrders-"; + const name = startsWith + faker.datatype.number(); + const email = `CyChannelInDraftOrders@example.com`; + + let address; + let defaultChannel; + let warehouse; + let shippingMethod; + let variantsList; + let checkout; + let paymentCards; + let cardData; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteProductsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + cy.fixture("cards").then(cardsResp => { + paymentCards = cardsResp; + cardData = { + clientData: paymentCards.clientData, + encryptedExpiryMonth: paymentCards.encryptedExpiryMonth, + encryptedExpiryYear: paymentCards.encryptedExpiryYear, + encryptedSecurityCode: paymentCards.encryptedSecurityCodes.matches + }; + }); + cy.fixture("addresses") + .then(addresses => { + address = addresses.usAddress; + getDefaultChannel(); + }) + .then(channelResp => { + defaultChannel = channelResp; + createShipping({ + channelId: channelResp.id, + name, + address, + price: 10 + }); + }) + .then( + ({ + warehouse: warehouseResp, + shippingZone: shippingZoneResp, + shippingMethod: shippingMethodResp + }) => { + warehouse = warehouseResp; + shippingMethod = shippingMethodResp; + } + ); + createTypeAttributeAndCategoryForProduct(name) + .then(({ productType, attribute, category }) => { + createProductInChannel({ + name, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }); + }) + .then(({ variantsList: variants }) => (variantsList = variants)); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + createCheckout({ + channelSlug: defaultChannel.slug, + email, + variantsList, + address, + billingAddress: address, + auth: "token" + }) + .then(({ checkout: checkoutResp }) => { + checkout = checkoutResp; + addShippingMethod(checkout.id, shippingMethod.id); + }) + .then(({ checkout: checkoutResp }) => { + addAdyenPayment(checkout.id, checkoutResp.totalPrice.gross.amount); + }); + }); + + it("should purchase products with simple card", () => { + const simpleCard = cardData; + simpleCard.encryptedCardNumber = + paymentCards.cards.simpleCard.encryptedCardNumber; + simpleCard.brand = paymentCards.cards.simpleCard.brand; + completeCheckout(checkout.id, simpleCard) + .then(({ order }) => { + getOrder(order.id); + }) + .then(order => { + expect(order.paymentStatus).to.eq("FULLY_CHARGED"); + }); + }); + + it("should purchase product with 3D secure 2 Auth", () => { + const threeDSecureCard = cardData; + threeDSecureCard.encryptedCardNumber = + paymentCards.cards.threeDSecureTwoAuth.encryptedCardNumber; + threeDSecureCard.brand = paymentCards.cards.threeDSecureTwoAuth.brand; + completeCheckout(checkout.id, threeDSecureCard) + .then(({ order }) => { + getOrder(order.id); + }) + .then(order => { + expect(order.paymentStatus).to.eq("FULLY_CHARGED"); + }); + }); + + it("should purchase product with 3D secure 1 Auth", () => { + const threeDSecureCardOneAuth = cardData; + threeDSecureCardOneAuth.encryptedCardNumber = + paymentCards.cards.threeDSecureOneAuth.encryptedCardNumber; + threeDSecureCardOneAuth.brand = + paymentCards.cards.threeDSecureOneAuth.brand; + completeCheckout(checkout.id, threeDSecureCardOneAuth) + .then(({ order }) => { + getOrder(order.id); + }) + .then(order => { + expect(order.paymentStatus).to.eq("FULLY_CHARGED"); + }); + }); + + it("should fail with unknown security number", () => { + const simpleCard = cardData; + simpleCard.encryptedCardNumber = + paymentCards.cards.simpleCard.encryptedCardNumber; + simpleCard.brand = paymentCards.cards.simpleCard.brand; + simpleCard.encryptedSecurityCode = + paymentCards.encryptedSecurityCodes.unknown; + completeCheckout(checkout.id, simpleCard).then(({ checkoutErrors }) => { + expect(checkoutErrors).to.have.length(1); + }); + }); + + it("should fail with timeout in 3D authorization", () => { + const errorCard = cardData; + errorCard.encryptedCardNumber = + paymentCards.cards.errorCard.encryptedCardNumber; + errorCard.brand = paymentCards.cards.errorCard.brand; + completeCheckout(checkout.id, errorCard).then(({ checkoutErrors }) => { + expect(checkoutErrors).to.have.length(1); + }); + }); + + it("should fail with closed account", () => { + const closeAccount = cardData; + closeAccount.encryptedCardNumber = + paymentCards.cards.closeAccount.encryptedCardNumber; + closeAccount.brand = paymentCards.cards.closeAccount.brand; + completeCheckout(checkout.id, closeAccount).then(({ checkoutErrors }) => { + expect(checkoutErrors).to.have.length(1); + }); + }); + }); +}); diff --git a/cypress/integration/allEnv/apps.js b/cypress/integration/allEnv/apps.js deleted file mode 100644 index 491e725f1..000000000 --- a/cypress/integration/allEnv/apps.js +++ /dev/null @@ -1,104 +0,0 @@ -import faker from "faker"; - -import { createApp, getApp } from "../../apiRequests/Apps"; -import { ONE_PERMISSION_USERS } from "../../Data/users"; -import { APP_DETAILS } from "../../elements/apps/appDetails"; -import { APPS_LIST } from "../../elements/apps/appsList"; -import { WEBHOOK_DETAILS } from "../../elements/apps/webhookDetails"; -import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; -import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; -import { appDetailsUrl, urlList } from "../../url/urlList"; -import { deleteAppsStartsWith } from "../../utils/appUtils"; - -describe("Tests for apps", () => { - const startsWith = "Apps"; - const name = `${startsWith}${faker.datatype.number()}`; - - let createdApp; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteAppsStartsWith(startsWith); - createApp(name, "MANAGE_APPS").then(app => { - createdApp = app; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest("auth", ONE_PERMISSION_USERS.app); - }); - - it("should create app", () => { - const randomName = `${startsWith}${faker.datatype.number()}`; - - cy.visit(urlList.apps) - .get(APPS_LIST.createLocalAppButton) - .click() - .get(APP_DETAILS.nameInput) - .type(randomName) - .get(APP_DETAILS.manageAppsPermissionCheckbox) - .click() - .addAliasToGraphRequest("AppCreate") - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - cy.wait("@AppCreate") - .its("response.body.data.appCreate.app") - .then(app => { - getApp(app.id); - }) - .then(app => { - expect(app.name).to.eq(randomName); - const token = app.tokens.find(element => element.name === "Default"); - expect(token).to.be.ok; - }); - }); - - it("should create webhook", () => { - const randomName = `${startsWith}${faker.datatype.number()}`; - const targetUrl = `http://example.${randomName}`; - - cy.visit(appDetailsUrl(createdApp.id)) - .get(APP_DETAILS.createWebhookButton) - .click() - .get(WEBHOOK_DETAILS.nameInput) - .type(randomName) - .get(WEBHOOK_DETAILS.targetUrlInput) - .type(targetUrl) - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - getApp(createdApp.id).then(({ webhooks }) => { - expect(webhooks[0].name).to.eq(randomName); - expect(webhooks[0].targetUrl).to.eq(targetUrl); - }); - }); - - it("should create token", () => { - const randomName = `${startsWith}${faker.datatype.number()}`; - let expectedToken; - - cy.visit(appDetailsUrl(createdApp.id)) - .get(APP_DETAILS.createTokenButton) - .click() - .get(APP_DETAILS.createTokenForm.tokenDialog) - .find(APP_DETAILS.createTokenForm.nameInput) - .type(randomName) - .get(BUTTON_SELECTORS.submit) - .click() - .get(APP_DETAILS.createTokenForm.tokenToCopy) - .invoke("text") - .then(text => { - expectedToken = text; - cy.get(APP_DETAILS.createTokenForm.doneButton).click(); - getApp(createdApp.id); - }) - .then(app => { - const token = app.tokens.find(element => element.name === randomName); - const tokenLastFourDigits = expectedToken.slice( - expectedToken.length - 4 - ); - expect(token.authToken).to.eq(tokenLastFourDigits); - }); - }); -}); diff --git a/cypress/integration/allEnv/categories.js b/cypress/integration/allEnv/categories.js deleted file mode 100644 index 7b1aea558..000000000 --- a/cypress/integration/allEnv/categories.js +++ /dev/null @@ -1,136 +0,0 @@ -// -import faker from "faker"; - -import { getCategory } from "../../apiRequests/Category"; -import { CATEGORIES_LIST } from "../../elements/catalog/categories/categories-list"; -import { CATEGORY_DETAILS } from "../../elements/catalog/categories/category-details"; -import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; -import { createCategory } from "../../steps/categoriesSteps"; -import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessages"; -import { categoryDetails, urlList } from "../../url/urlList"; -import { deleteCategoriesStartsWith } from "../../utils/categoryUtils"; -import * as channelsUtils from "../../utils/channelsUtils"; -import * as productsUtils from "../../utils/products/productsUtils"; -import { deleteShippingStartsWith } from "../../utils/shippingUtils"; - -describe("Categories", () => { - const startsWith = "CyCollections"; - const name = `${startsWith}${faker.datatype.number()}`; - - let attribute; - let category; - let productType; - let product; - - let defaultChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productsUtils.deleteProductsStartsWith(startsWith); - deleteCategoriesStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - channelsUtils.deleteChannelsStartsWith(startsWith); - - channelsUtils - .getDefaultChannel() - .then(channel => { - defaultChannel = channel; - productsUtils.createTypeAttributeAndCategoryForProduct(name); - }) - .then( - ({ - category: categoryResp, - attribute: attributeResp, - productType: productTypeResp - }) => { - category = categoryResp; - attribute = attributeResp; - productType = productTypeResp; - productsUtils.createProductInChannel({ - name, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }); - } - ) - .then(({ product: productResp }) => (product = productResp)); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create category", () => { - const categoryName = `${startsWith}${faker.datatype.number()}`; - - cy.visit(urlList.categories) - .get(CATEGORIES_LIST.addCategoryButton) - .click(); - createCategory({ name: categoryName, description: categoryName }) - .its("response.body.data.categoryCreate.category") - .then(newCategory => { - getCategory(newCategory.id); - }) - .then(newCategory => { - expect(newCategory.name).to.eq(categoryName); - // Uncomment this expect after fixing bug SALEOR-3728 - // expect(newCategory.description).to.eq(categoryName); - }); - }); - - it("should add subcategory", () => { - const categoryName = `${startsWith}${faker.datatype.number()}`; - cy.visit(categoryDetails(category.id)) - .get(CATEGORY_DETAILS.createSubcategoryButton) - .click(); - createCategory({ name: categoryName, description: categoryName }) - .visit(categoryDetails(category.id)) - .contains(CATEGORY_DETAILS.categoryChildrenRow, categoryName) - .should("be.visible"); - getCategory(category.id).then(categoryResp => { - expect(categoryResp.children.edges[0].node.name).to.eq(categoryName); - }); - }); - - it("should add product to category", () => { - cy.visit(categoryDetails(category.id)) - .get(CATEGORY_DETAILS.productsTab) - .click() - .get(CATEGORY_DETAILS.addProducts) - .click() - .url() - .should("include", urlList.addProduct); - }); - - it("should remove product from category", () => { - cy.visit(categoryDetails(category.id)) - .get(CATEGORY_DETAILS.productsTab) - .click(); - cy.contains(CATEGORY_DETAILS.productRow, product.name) - .find(BUTTON_SELECTORS.checkbox) - .click() - .get(BUTTON_SELECTORS.deleteIcon) - .click() - .addAliasToGraphRequest("productBulkDelete") - .get(BUTTON_SELECTORS.submit) - .click(); - confirmationMessageShouldDisappear(); - cy.contains(CATEGORY_DETAILS.productRow, product.name) - .should("not.exist") - .wait("@productBulkDelete"); - getCategory(category.id).then(categoryResp => { - expect(categoryResp.products).to.be.null; - }); - }); - - it("should enter category details page", () => { - cy.visit(urlList.categories) - .get(SHARED_ELEMENTS.searchInput) - .type(category.name); - cy.contains(SHARED_ELEMENTS.tableRow, category.name).click(); - cy.contains(SHARED_ELEMENTS.header, category.name).should("be.visible"); - }); -}); diff --git a/cypress/integration/allEnv/checkout/productWithoutShipping.js b/cypress/integration/allEnv/checkout/productWithoutShipping.js deleted file mode 100644 index aceafa7e0..000000000 --- a/cypress/integration/allEnv/checkout/productWithoutShipping.js +++ /dev/null @@ -1,118 +0,0 @@ -// - -import faker from "faker"; - -import { createChannel } from "../../../apiRequests/Channels"; -import { - addProductsToCheckout, - addShippingMethod, - createCheckout -} from "../../../apiRequests/Checkout"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Products without shipment option", () => { - const startsWith = "WithoutShipmentCheckout-"; - const name = `${startsWith}${faker.datatype.number()}`; - const nameProdWithoutShipping = `${startsWith}${faker.datatype.number()}`; - - let channel; - let address; - let warehouse; - let shippingMethod; - let productWithShipping; - let productWithoutShipping; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - - deleteProductsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - - createChannel({ - name - }) - .then(channelResp => { - channel = channelResp; - cy.fixture("addresses"); - }) - .then(({ usAddress }) => { - address = usAddress; - createShipping({ - channelId: channel.id, - name, - address, - minProductPrice: 100 - }); - }) - .then( - ({ warehouse: warehouseResp, shippingMethod: shippingMethodResp }) => { - warehouse = warehouseResp; - shippingMethod = shippingMethodResp; - createTypeAttributeAndCategoryForProduct(name); - } - ) - .then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - createProductInChannel({ - attributeId: attributeResp.id, - categoryId: categoryResp.id, - channelId: channel.id, - name, - productTypeId: productTypeResp.id, - warehouseId: warehouse.id - }).then(({ variantsList }) => (productWithShipping = variantsList)); - createProductInChannel({ - attributeId: attributeResp.id, - categoryId: categoryResp.id, - channelId: channel.id, - name: nameProdWithoutShipping, - productTypeId: productTypeResp.id, - warehouseId: warehouse.id - }).then( - ({ variantsList }) => (productWithoutShipping = variantsList) - ); - } - ); - }); - - it("should be not possible to buy product without shipping option", () => { - createCheckout({ - channelSlug: channel.slug, - email: "example@example.com", - variantsList: productWithoutShipping, - address, - auth: "token" - }) - .then(({ checkout }) => { - expect( - checkout.availableShippingMethods, - "expect no available shipping" - ).to.have.length(0); - addProductsToCheckout(checkout.id, productWithShipping, 1); - }) - .then(({ checkout }) => { - expect( - checkout.availableShippingMethods, - "expect no available shipping" - ).to.have.length(0); - addShippingMethod(checkout.id, shippingMethod.id); - }) - .then(({ errors }) => { - expect(errors[0].field, "expect error in shipping method").to.be.eq( - "shippingMethod" - ); - }); - }); -}); diff --git a/cypress/integration/allEnv/checkout/stocksInCheckout.js b/cypress/integration/allEnv/checkout/stocksInCheckout.js deleted file mode 100644 index 743025505..000000000 --- a/cypress/integration/allEnv/checkout/stocksInCheckout.js +++ /dev/null @@ -1,162 +0,0 @@ -import faker from "faker"; - -import { - addProductsToCheckout, - createCheckout -} from "../../../apiRequests/Checkout"; -import { getVariants } from "../../../apiRequests/Product"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import { createOrderWithNewProduct } from "../../../utils/ordersUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Products stocks in checkout", () => { - const startsWith = "CyStocksCheckout-"; - const name = `${startsWith}${faker.datatype.number()}`; - - let defaultChannel; - let address; - let warehouse; - let attribute; - let category; - let productType; - let shippingMethod; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteProductsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - cy.fixture("addresses") - .then(addresses => { - address = addresses.usAddress; - getDefaultChannel(); - }) - .then(channel => { - defaultChannel = channel; - createShipping({ - channelId: defaultChannel.id, - name, - address - }); - }) - .then( - ({ warehouse: warehouseResp, shippingMethod: shippingMethodResp }) => { - warehouse = warehouseResp; - shippingMethod = shippingMethodResp; - createTypeAttributeAndCategoryForProduct(name); - } - ) - .then( - ({ - attribute: attributeResp, - category: categoryResp, - productType: productTypeResp - }) => { - attribute = attributeResp; - category = categoryResp; - productType = productTypeResp; - } - ); - }); - it("should create checkout with last product in stock", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - - createOrderWithNewProduct({ - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id, - channel: defaultChannel, - name: productName, - warehouseId: warehouse.id, - shippingMethodId: shippingMethod.id, - address - }).then(({ order }) => { - expect(order, "order should be created").to.be.ok; - }); - }); - - it("should not be possible to add product with quantity greater than stock", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - let variants; - - createProductInChannel({ - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id, - channelId: defaultChannel.id, - name: productName, - warehouseId: warehouse.id, - quantityInWarehouse: 1 - }) - .then(({ variantsList }) => { - variants = variantsList; - createCheckout({ - channelSlug: defaultChannel.slug, - address, - billingAddress: address, - email: "email@example.com", - variantsList, - auth: "token" - }); - }) - .then(({ checkout: checkout }) => { - addProductsToCheckout(checkout.id, variants, 2); - }) - .then(({ errors }) => { - expect( - errors[0], - "should return error on field quantity" - ).to.have.property("field", "quantity"); - }); - }); - - it("should buy product with no quantity if tracking is not set", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - - createOrderWithNewProduct({ - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id, - channel: defaultChannel, - name: productName, - warehouseId: warehouse.id, - quantityInWarehouse: 0, - trackInventory: false, - shippingMethodId: shippingMethod.id, - address - }).then(({ order }) => { - expect(order, "order should be created").to.be.ok; - }); - }); - - it("should change product stock after purchase", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - - createOrderWithNewProduct({ - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id, - channel: defaultChannel, - name: productName, - warehouseId: warehouse.id, - quantityInWarehouse: 10, - trackInventory: true, - shippingMethodId: shippingMethod.id, - address - }) - .then(({ variantsList }) => { - getVariants(variantsList); - }) - .then(variantsList => { - const variant = variantsList.edges[0]; - expect(variant.node.stocks[0].quantityAllocated).to.eq(1); - }); - }); -}); diff --git a/cypress/integration/allEnv/checkout/warehouses.js b/cypress/integration/allEnv/checkout/warehouses.js deleted file mode 100644 index 79f69ed39..000000000 --- a/cypress/integration/allEnv/checkout/warehouses.js +++ /dev/null @@ -1,68 +0,0 @@ -import faker from "faker"; - -import { createCheckout } from "../../../apiRequests/Checkout"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Warehouses in checkout", () => { - const startsWith = `CyWarehouseCheckout`; - let defaultChannel; - let usAddress; - let plAddress; - let warehouse; - - it("should not be possible to buy product for country not listed in warehouse", () => { - cy.clearSessionData().loginUserViaRequest(); - deleteShippingStartsWith(startsWith); - deleteProductsStartsWith(startsWith); - const name = `${startsWith}${faker.datatype.number()}`; - cy.fixture("addresses") - .then(addresses => { - usAddress = addresses.usAddress; - plAddress = addresses.plAddress; - getDefaultChannel(); - }) - .then(channelResp => { - defaultChannel = channelResp; - createShipping({ - channelId: defaultChannel.id, - name, - address: usAddress - }); - }) - .then(({ warehouse: warehouseResp }) => { - warehouse = warehouseResp; - createTypeAttributeAndCategoryForProduct(name); - }) - .then(({ attribute, productType, category }) => { - createProductInChannel({ - name, - attributeId: attribute.id, - categoryId: category.id, - channelId: defaultChannel.id, - productTypeId: productType.id, - warehouseId: warehouse.id, - quantityInWarehouse: 100 - }); - }) - .then(({ variantsList }) => { - createCheckout({ - channelSlug: defaultChannel.slug, - email: "example@example.com", - variantsList, - address: plAddress - }); - }) - .then(({ errors }) => { - expect(errors[0]).to.have.property("field", "quantity"); - }); - }); -}); diff --git a/cypress/integration/allEnv/collections.js b/cypress/integration/allEnv/collections.js deleted file mode 100644 index a3a3d7695..000000000 --- a/cypress/integration/allEnv/collections.js +++ /dev/null @@ -1,178 +0,0 @@ -// -import faker from "faker"; - -import { createChannel } from "../../apiRequests/Channels"; -import { updateChannelInProduct } from "../../apiRequests/Product"; -import { getCollection } from "../../apiRequests/storeFront/Collections"; -import { searchInShop } from "../../apiRequests/storeFront/Search"; -import { - assignProductsToCollection, - createCollection -} from "../../steps/collectionsSteps"; -import { urlList } from "../../url/urlList"; -import * as channelsUtils from "../../utils/channelsUtils"; -import { deleteCollectionsStartsWith } from "../../utils/collectionsUtils"; -import * as productsUtils from "../../utils/products/productsUtils"; -import { deleteShippingStartsWith } from "../../utils/shippingUtils"; -import { - isCollectionVisible, - isProductInCollectionVisible -} from "../../utils/storeFront/collectionsUtils"; -import { isProductVisibleInSearchResult } from "../../utils/storeFront/storeFrontProductUtils"; - -describe("Collections", () => { - const startsWith = "CyCollections-"; - const name = `${startsWith}${faker.datatype.number()}`; - - let attribute; - let productType; - let category; - let product; - - let defaultChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productsUtils.deleteProductsStartsWith(startsWith); - deleteCollectionsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - channelsUtils.deleteChannelsStartsWith(startsWith); - - channelsUtils - .getDefaultChannel() - .then(channel => { - defaultChannel = channel; - productsUtils.createTypeAttributeAndCategoryForProduct(name); - }) - .then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - attribute = attributeResp; - productType = productTypeResp; - category = categoryResp; - productsUtils.createProductInChannel({ - name, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }); - } - ) - .then(({ product: productResp }) => (product = productResp)); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should not display hidden collections", () => { - const collectionName = `${startsWith}${faker.datatype.number()}`; - cy.visit(urlList.collections); - cy.softExpectSkeletonIsVisible(); - let collection; - - createCollection(collectionName, false, defaultChannel) - .then(collectionResp => { - collection = collectionResp; - assignProductsToCollection(name); - }) - .then(() => { - getCollection(collection.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isCollectionVisible(resp, collection.id); - expect(isVisible).to.equal(false); - }); - }); - - it("should display collections", () => { - const collectionName = `${startsWith}${faker.datatype.number()}`; - let collection; - cy.visit(urlList.collections); - cy.softExpectSkeletonIsVisible(); - - createCollection(collectionName, true, defaultChannel) - .then(collectionResp => { - collection = collectionResp; - assignProductsToCollection(name); - getCollection(collection.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isCollectionVisible(resp, collection.id); - expect(isVisible).to.equal(true); - }); - }); - - it("should not display collection not set as available in channel", () => { - const collectionName = `${startsWith}${faker.datatype.number()}`; - let collection; - let channel; - - createChannel({ name: collectionName }) - .then(channelResp => { - channel = channelResp; - updateChannelInProduct(product.id, channel.id); - }) - .then(() => { - cy.visit(urlList.collections); - cy.softExpectSkeletonIsVisible(); - createCollection(collectionName, true, channel); - }) - .then(collectionResp => { - collection = collectionResp; - assignProductsToCollection(name); - getCollection(collection.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isCollectionVisible(resp, collection.id); - expect(isVisible).to.equal(false); - }); - }); - - it("should display products hidden in listing", () => { - // Products "hidden in listings" are not displayed in Category listings or search results, - // but are listed on Collections - const randomName = `${startsWith}${faker.datatype.number()}`; - let collection; - let createdProduct; - - productsUtils - .createProductInChannel({ - name: randomName, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - visibleInListings: false - }) - .then(({ product: productResp }) => (createdProduct = productResp)); - cy.visit(urlList.collections); - cy.softExpectSkeletonIsVisible(); - createCollection(randomName, true, defaultChannel) - .then(collectionResp => { - collection = collectionResp; - assignProductsToCollection(randomName); - }) - .then(() => { - getCollection(collection.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isProductInCollectionVisible(resp, createdProduct.id); - expect(isVisible).to.equal(true); - }) - .then(() => { - searchInShop(createdProduct.name); - }) - .then(resp => { - const isVisible = isProductVisibleInSearchResult( - resp, - createdProduct.name - ); - expect(isVisible).to.equal(false); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/attributes/attributes.js b/cypress/integration/allEnv/configuration/attributes/attributes.js deleted file mode 100644 index 695aed870..000000000 --- a/cypress/integration/allEnv/configuration/attributes/attributes.js +++ /dev/null @@ -1,120 +0,0 @@ -// - -import faker from "faker"; - -import { getAttribute } from "../../../../apiRequests/Attribute"; -import { ATTRIBUTES_LIST } from "../../../../elements/attribute/attributes_list"; -import { createAttributeWithInputType } from "../../../../steps/attributesSteps"; -import { urlList } from "../../../../url/urlList"; -import { deleteAttributesStartsWith } from "../../../../utils/attributes/attributeUtils"; -import { expectCorrectDataInAttribute } from "../../../../utils/attributes/checkAttributeData"; - -describe("Create attribute with type", () => { - const startsWith = "AttrCreate"; - const attributesTypes = [ - "DROPDOWN", - "MULTISELECT", - "FILE", - "RICH_TEXT", - "BOOLEAN" - ]; - const attributeReferenceType = ["PRODUCT", "PAGE"]; - const attributeNumericType = [ - { unitSystem: "IMPERIAL", unitsOf: "DISTANCE", unit: "FT" }, - { unitSystem: "METRIC", unitsOf: "VOLUME", unit: "CUBIC_CENTIMETER" }, - { unitSystem: "without selecting unit" } - ]; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteAttributesStartsWith(startsWith); - }); - - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.attributes) - .get(ATTRIBUTES_LIST.createAttributeButton) - .click(); - }); - - attributesTypes.forEach(attributeType => { - it(`should create ${attributeType} attribute`, () => { - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ name: attributeName, attributeType }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType - }); - }); - }); - }); - - attributeReferenceType.forEach(entityType => { - it(`should create reference ${entityType} attribute`, () => { - const attributeType = "REFERENCE"; - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ - name: attributeName, - attributeType, - entityType - }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType, - entityType - }); - }); - }); - }); - - attributeNumericType.forEach(numericSystemType => { - it(`should create numeric attribute - ${numericSystemType.unitSystem}`, () => { - const attributeType = "NUMERIC"; - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ - name: attributeName, - attributeType, - numericSystemType - }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType, - unit: numericSystemType.unit - }); - }); - }); - }); - - it("should create attribute without required value", () => { - const attributeType = "BOOLEAN"; - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ - name: attributeName, - attributeType, - valueRequired: false - }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType, - valueRequired: false - }); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/attributes/contentAttribute.js b/cypress/integration/allEnv/configuration/attributes/contentAttribute.js deleted file mode 100644 index de6faace1..000000000 --- a/cypress/integration/allEnv/configuration/attributes/contentAttribute.js +++ /dev/null @@ -1,120 +0,0 @@ -import faker from "faker"; - -import { getAttribute } from "../../../../apiRequests/Attribute"; -import { ATTRIBUTES_DETAILS } from "../../../../elements/attribute/attributes_details"; -import { ATTRIBUTES_LIST } from "../../../../elements/attribute/attributes_list"; -import { createAttributeWithInputType } from "../../../../steps/attributesSteps"; -import { urlList } from "../../../../url/urlList"; -import { deleteAttributesStartsWith } from "../../../../utils/attributes/attributeUtils"; -import { expectCorrectDataInAttribute } from "../../../../utils/attributes/checkAttributeData"; - -describe("Create content attribute", () => { - const startsWith = "AttrCont"; - const attributesTypes = [ - "DROPDOWN", - "MULTISELECT", - "FILE", - "RICH_TEXT", - "BOOLEAN" - ]; - const attributeReferenceType = ["PRODUCT", "PAGE"]; - const attributeNumericType = [ - { unitSystem: "IMPERIAL", unitsOf: "DISTANCE", unit: "FT" }, - { unitSystem: "METRIC", unitsOf: "VOLUME", unit: "CUBIC_CENTIMETER" }, - { unitSystem: "without selecting unit" } - ]; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteAttributesStartsWith(startsWith); - }); - - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.attributes) - .get(ATTRIBUTES_LIST.createAttributeButton) - .click() - .get(ATTRIBUTES_DETAILS.pageTypeAttributeCheckbox) - .click(); - }); - attributesTypes.forEach(attributeType => { - it(`should create ${attributeType} attribute`, () => { - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ name: attributeName, attributeType }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType - }); - }); - }); - }); - - attributeReferenceType.forEach(entityType => { - it(`should create reference ${entityType} attribute`, () => { - const attributeType = "REFERENCE"; - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ - name: attributeName, - attributeType, - entityType - }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType, - entityType - }); - }); - }); - }); - - attributeNumericType.forEach(numericSystemType => { - it(`should create numeric attribute - ${numericSystemType.unitSystem}`, () => { - const attributeType = "NUMERIC"; - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ - name: attributeName, - attributeType, - numericSystemType - }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType, - unit: numericSystemType.unit - }); - }); - }); - }); - - it("should create attribute without required value", () => { - const attributeType = "BOOLEAN"; - const attributeName = `${startsWith}${faker.datatype.number()}`; - createAttributeWithInputType({ - name: attributeName, - attributeType, - valueRequired: false - }) - .then(({ attribute }) => { - getAttribute(attribute.id); - }) - .then(attribute => { - expectCorrectDataInAttribute(attribute, { - attributeName, - attributeType, - valueRequired: false - }); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/channels.js b/cypress/integration/allEnv/configuration/channels.js deleted file mode 100644 index 4498f1d65..000000000 --- a/cypress/integration/allEnv/configuration/channels.js +++ /dev/null @@ -1,160 +0,0 @@ -// -import faker from "faker"; - -import { createChannel } from "../../../apiRequests/Channels"; -import { - createShippingZone, - getShippingZone -} from "../../../apiRequests/ShippingMethod"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { PRODUCTS_LIST } from "../../../elements/catalog/products/products-list"; -import { ADD_CHANNEL_FORM_SELECTORS } from "../../../elements/channels/add-channel-form-selectors"; -import { AVAILABLE_CHANNELS_FORM } from "../../../elements/channels/available-channels-form"; -import { CHANNELS_SELECTORS } from "../../../elements/channels/channels-selectors"; -import { SELECT_CHANNELS_TO_ASSIGN } from "../../../elements/channels/select-channels-to-assign"; -import { HEADER_SELECTORS } from "../../../elements/header/header-selectors"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { createChannelByView } from "../../../steps/channelsSteps"; -import { waitForProgressBarToNotExist } from "../../../steps/shared/progressBar"; -import { urlList } from "../../../url/urlList"; -import { deleteChannelsStartsWith } from "../../../utils/channelsUtils"; -import { deleteShippingStartsWith } from "../../../utils/shippingUtils"; - -describe("Channels", () => { - const channelStartsWith = `CyChannels`; - const randomName = `${channelStartsWith} ${faker.datatype.number()}`; - const currency = "PLN"; - let shippingZone; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteChannelsStartsWith(channelStartsWith); - deleteShippingStartsWith(channelStartsWith); - createShippingZone(randomName, "US").then(shippingZoneResp => { - shippingZone = shippingZoneResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.channel - ); - }); - - it("should create new channel", () => { - const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; - cy.addAliasToGraphRequest("Channels"); - cy.visit(urlList.channels); - cy.softExpectSkeletonIsVisible(); - cy.wait("@Channels"); - createChannelByView({ name: randomChannel, currency }); - cy.wait("@Channel"); - - // New channel should be visible in channels list - cy.get(ADD_CHANNEL_FORM_SELECTORS.backToChannelsList) - .click() - .get(CHANNELS_SELECTORS.channelsTable) - .contains(randomChannel); - - // new channel should be visible in channel selector - cy.visit(urlList.homePage) - .get(HEADER_SELECTORS.channelSelect) - .click() - .get(HEADER_SELECTORS.channelSelectList) - .contains(randomChannel) - .click(); - - // new channel should be visible at product availability form - cy.clearSessionData().loginUserViaRequest(); - cy.addAliasToGraphRequest("InitialProductFilterAttributes"); - cy.visit(urlList.products); - cy.wait("@InitialProductFilterAttributes"); - waitForProgressBarToNotExist(); - cy.get(PRODUCTS_LIST.emptyProductRow).should("not.exist"); - cy.get(PRODUCTS_LIST.productsList) - .first() - .click() - .get(AVAILABLE_CHANNELS_FORM.menageChannelsButton) - .click() - .get(SELECT_CHANNELS_TO_ASSIGN.listOfChannels) - .contains(randomChannel); - }); - - it("should create channel with shippingZone", () => { - // remove login after fixing SALEOR-3162 - cy.clearSessionData().loginUserViaRequest(); - - const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; - cy.addAliasToGraphRequest("Channels"); - cy.visit(urlList.channels); - cy.softExpectSkeletonIsVisible(); - cy.wait("@Channels"); - createChannelByView({ - name: randomChannel, - currency, - shippingZone: shippingZone.name - }); - cy.wait("@Channel"); - getShippingZone(shippingZone.id).then(shippingZoneResp => { - const assignedChannel = shippingZoneResp.channels.find( - channel => channel.name === randomChannel - ); - expect(assignedChannel).to.be.ok; - }); - }); - - it("should validate slug name", () => { - const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; - createChannel({ - isActive: false, - name: randomChannel, - slug: randomChannel, - currencyCode: currency - }); - cy.visit(urlList.channels); - cy.softExpectSkeletonIsVisible(); - createChannelByView({ name: randomChannel, currency }); - cy.get(ADD_CHANNEL_FORM_SELECTORS.slugValidationMessage).should( - "be.visible" - ); - }); - - it("should validate duplicated currency", () => { - const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; - cy.visit(urlList.channels); - cy.softExpectSkeletonIsVisible(); - createChannelByView({ - name: randomChannel, - currency: "notExistingCurrency" - }); - cy.get(ADD_CHANNEL_FORM_SELECTORS.currencyValidationMessage).should( - "be.visible" - ); - }); - - it("should delete channel", () => { - const randomChannelToDelete = `${channelStartsWith} ${faker.datatype.number()}`; - createChannel({ - isActive: false, - name: randomChannelToDelete, - slug: randomChannelToDelete, - currencyCode: currency - }); - cy.addAliasToGraphRequest("Channels"); - cy.visit(urlList.channels); - cy.softExpectSkeletonIsVisible(); - cy.wait("@Channels"); - cy.contains(CHANNELS_SELECTORS.channelName, randomChannelToDelete) - .parentsUntil(CHANNELS_SELECTORS.channelsTable) - .find("button") - .click(); - cy.addAliasToGraphRequest("Channels"); - cy.get(BUTTON_SELECTORS.submit).click(); - cy.wait("@Channels"); - - cy.get(CHANNELS_SELECTORS.channelName) - .contains(randomChannelToDelete) - .should("not.exist"); - }); -}); diff --git a/cypress/integration/allEnv/configuration/customer.js b/cypress/integration/allEnv/configuration/customer.js deleted file mode 100644 index 660d4460c..000000000 --- a/cypress/integration/allEnv/configuration/customer.js +++ /dev/null @@ -1,63 +0,0 @@ -import faker from "faker"; - -import { getCustomer } from "../../../apiRequests/Customer"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { CUSTOMER_DETAILS } from "../../../elements/customer/customer-details"; -import { CUSTOMERS_LIST } from "../../../elements/customer/customers-list"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; -import { fillUpAddressForm } from "../../../steps/shared/addressForm"; -import { confirmationMessageShouldDisappear } from "../../../steps/shared/confirmationMessage"; -import { urlList } from "../../../url/urlList"; - -describe("Tests for customer", () => { - const channelStartsWith = `Customers`; - - it("should create customer", () => { - const randomName = `${channelStartsWith}${faker.datatype.number()}`; - const email = `${randomName}@example.com`; - const note = faker.lorem.paragraph(); - let address; - - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.user) - .visit(urlList.customers) - .get(CUSTOMERS_LIST.createCustomerButton) - .click() - .get(SHARED_ELEMENTS.progressBar) - .should("not.be.visible") - .get(CUSTOMER_DETAILS.nameInput) - .type(randomName) - .get(CUSTOMER_DETAILS.lastNameInput) - .type(randomName) - .get(CUSTOMER_DETAILS.emailInput) - .type(email) - .fixture("addresses") - .then(({ usAddress }) => { - address = usAddress; - fillUpAddressForm(address); - }) - .get(CUSTOMER_DETAILS.noteInput) - .type(note) - .addAliasToGraphRequest("CreateCustomer") - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - cy.wait("@CreateCustomer") - .its("response.body.data.customerCreate.user") - .then(customer => { - getCustomer(customer.id); - }) - .then(customer => { - chai - .softExpect(customer.firstName, "Expect correct first name") - .to.eq(randomName); - chai - .softExpect(customer.lastName, "Expect correct last name") - .to.eq(randomName); - chai.softExpect(customer.email, "Expect correct email").to.eq(email); - chai.softExpect(customer.note, "Expect correct note").to.eq(note); - cy.expectCorrectFullAddress(customer.addresses[0], address); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/inactiveChannel.js b/cypress/integration/allEnv/configuration/inactiveChannel.js deleted file mode 100644 index 38816cadd..000000000 --- a/cypress/integration/allEnv/configuration/inactiveChannel.js +++ /dev/null @@ -1,148 +0,0 @@ -// -import faker from "faker"; - -import { activateChannel, createChannel } from "../../../apiRequests/Channels"; -import { createCheckout } from "../../../apiRequests/Checkout"; -import { getProductDetails } from "../../../apiRequests/storeFront/ProductDetails"; -import { CHANNEL_FORM_SELECTORS } from "../../../elements/channels/channel-form-selectors"; -import { DRAFT_ORDER_SELECTORS } from "../../../elements/orders/draft-order-selectors"; -import { ORDERS_SELECTORS } from "../../../elements/orders/orders-selectors"; -import { urlList } from "../../../url/urlList"; -import { - deleteChannelsStartsWith, - getDefaultChannel -} from "../../../utils/channelsUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../utils/products/productsUtils"; -import { isProductVisible } from "../../../utils/storeFront/storeFrontProductUtils"; - -describe("Tests on inactive channel", () => { - const channelStartsWith = `InactiveChannel`; - const randomName = `${channelStartsWith}${faker.datatype.number()}`; - const currency = "PLN"; - - let address; - let defaultChannel; - let newChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteChannelsStartsWith(channelStartsWith); - deleteProductsStartsWith(channelStartsWith); - cy.fixture("addresses").then(({ plAddress }) => { - address = plAddress; - }); - getDefaultChannel().then(channel => (defaultChannel = channel)); - createChannel({ - isActive: false, - name: randomName, - slug: randomName, - currencyCode: currency - }).then(channel => { - newChannel = channel; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should not be possible to add products to order with inactive channel", () => { - cy.visit(urlList.orders) - .get(ORDERS_SELECTORS.createOrder) - .click() - .get(CHANNEL_FORM_SELECTORS.channelSelect) - .click() - .get(CHANNEL_FORM_SELECTORS.channelOption) - .contains(newChannel.name) - .click() - .get(CHANNEL_FORM_SELECTORS.confirmButton) - .click(); - cy.location() - .should(loc => { - const urlRegex = new RegExp(`${urlList.orders}.+`, "g"); - expect(loc.pathname).to.match(urlRegex); - }) - .get(DRAFT_ORDER_SELECTORS.addProducts) - .should("not.exist"); - }); - - it("should not be possible to create checkout with inactive channel", () => { - const randomChannel = `${channelStartsWith}${faker.datatype.number()}`; - createTypeAttributeAndCategoryForProduct(randomChannel) - .then(({ productType, attribute, category }) => { - createProductInChannel({ - name: randomChannel, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }); - }) - .then(({ variantsList }) => { - createCheckout({ - channelSlug: newChannel.slug, - email: "example@example.com", - variantsList, - address - }); - }) - .then(({ errors }) => { - expect( - errors[0], - "checkout shouldn't be created with error in field channel" - ).to.have.property("field", "channel"); - }); - }); - - it("products in inactive channel should not be displayed", () => { - const randomChannel = `${channelStartsWith}${faker.datatype.number()}`; - let channel; - let product; - - createChannel({ - isActive: false, - name: randomChannel, - slug: randomChannel, - currencyCode: currency - }) - .then(channelResp => { - channel = channelResp; - createTypeAttributeAndCategoryForProduct(randomChannel); - }) - .then(({ productType, attribute, category }) => { - createProductInChannel({ - name: randomChannel, - channelId: channel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }); - }) - .then(({ product: productResp }) => { - product = productResp; - getProductDetails(product.id, channel.slug); - }) - .then(resp => { - const isVisible = isProductVisible(resp, randomChannel); - expect( - isVisible, - "product with inactive channel shouldn't be visible" - ).to.be.eq(false); - activateChannel(channel.id); - }) - .then(() => { - getProductDetails(product.id, channel.slug); - }) - .then(resp => { - const isVisible = isProductVisible(resp, randomChannel); - expect( - isVisible, - "product with active channel should be visible" - ).to.be.eq(true); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/navigation.js b/cypress/integration/allEnv/configuration/navigation.js deleted file mode 100644 index 3f219a895..000000000 --- a/cypress/integration/allEnv/configuration/navigation.js +++ /dev/null @@ -1,66 +0,0 @@ -import faker from "faker"; - -import { - createMenu as createMenuViaApi, - getMenu -} from "../../../apiRequests/Menu"; -import { - createMenu, - createNewMenuItem, - MENU_ITEM_TYPES -} from "../../../steps/navigationSteps"; -import { deleteMenusStartsWith } from "../../../utils/navigationUtils"; - -describe("Tests for menu navigation", () => { - const startsWith = "Navigation"; - const randomName = `${startsWith}${faker.datatype.number()}`; - - let menu; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteMenusStartsWith(startsWith); - createMenuViaApi(randomName).then( - ({ menu: menuResp }) => (menu = menuResp) - ); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create a menu", () => { - const name = `${startsWith}${faker.datatype.number()}`; - - createMenu(name) - .then(menuResp => { - getMenu(menuResp.id); - }) - .then(menuResp => { - expect(menuResp.name).to.eq(name); - }); - }); - - ["category", "collection", "page"].forEach(itemType => { - it(`should add new ${itemType} item to menu`, () => { - const itemName = `${startsWith}${faker.datatype.number()}`; - let selectedItem; - - createNewMenuItem({ - menuId: menu.id, - name: itemName, - menuItemType: MENU_ITEM_TYPES[itemType] - }) - .then(selectedItemResp => { - selectedItem = selectedItemResp; - getMenu(menu.id); - }) - .then(({ items }) => { - const item = items.find(element => element.name === itemName); - const itemOfType = item[itemType]; - const name = itemType !== "page" ? "name" : "title"; - expect(itemOfType[name]).to.eq(selectedItem); - }); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/permissions.js b/cypress/integration/allEnv/configuration/permissions.js deleted file mode 100644 index 9845f1ce5..000000000 --- a/cypress/integration/allEnv/configuration/permissions.js +++ /dev/null @@ -1,148 +0,0 @@ -import faker from "faker"; - -import { - createPermissionGroup, - getPermissionGroup -} from "../../../apiRequests/PermissionGroup.js"; -import { getStaffMembersStartsWith } from "../../../apiRequests/StaffMembers"; -import { TEST_ADMIN_USER } from "../../../Data/users.js"; -import { PERMISSION_GROUP_DETAILS } from "../../../elements/permissionGroup/permissionGroupDetails"; -import { PERMISSION_GROUP_LIST } from "../../../elements/permissionGroup/permissionGroupsList"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; -import { waitForProgressBarToNotExist } from "../../../steps/shared/progressBar.js"; -import { - permissionGroupDetails, - staffMemberDetailsUrl, - urlList -} from "../../../url/urlList"; -import { deletePermissionGroupsStartsWith } from "../../../utils/permissionGroupUtils.js"; - -describe("Permissions groups", () => { - const startsWith = "CyPermissions-"; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deletePermissionGroupsStartsWith(startsWith); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create permission group", () => { - const permissionName = `${startsWith}${faker.datatype.number()}`; - - cy.visit(urlList.permissionsGroups) - .get(PERMISSION_GROUP_LIST.createPermissionButton) - .click() - .get(PERMISSION_GROUP_DETAILS.nameInput) - .type(permissionName) - .get(PERMISSION_GROUP_DETAILS.productsPermissionCheckbox) - .click() - .get( - PERMISSION_GROUP_DETAILS.productsTypesAndAttributesPermissionCheckbox - ) - .click() - .get(BUTTON_SELECTORS.confirm) - .click() - .get(PERMISSION_GROUP_DETAILS.assignMemberButton) - .should("be.visible") - .get(BUTTON_SELECTORS.back) - .click(); - waitForProgressBarToNotExist(); - cy.contains( - PERMISSION_GROUP_LIST.permissionGroupRow, - permissionName - ).should("be.visible"); - }); - - it("should delete permission group", () => { - const permissionName = `${startsWith}${faker.datatype.number()}`; - let staffMember; - getStaffMembersStartsWith(TEST_ADMIN_USER.email) - .its("body.data.staffUsers.edges") - .then(staffMemberResp => { - staffMember = staffMemberResp[0].node; - createPermissionGroup({ - name: permissionName, - userIdsArray: `["${staffMember.id}"]`, - permissionsArray: "[MANAGE_PRODUCTS]" - }); - cy.visit(urlList.permissionsGroups); - cy.contains(PERMISSION_GROUP_LIST.permissionGroupRow, permissionName) - .should("be.visible") - .find(BUTTON_SELECTORS.deleteIcon) - .click() - .get(BUTTON_SELECTORS.submit) - .click(); - cy.contains(PERMISSION_GROUP_LIST.permissionGroupRow, permissionName) - .should("not.exist") - .visit(staffMemberDetailsUrl(staffMember.id)); - cy.get(SHARED_ELEMENTS.header).should("be.visible"); - cy.contains(permissionName).should("not.exist"); - }); - }); - - it("should add user to permission group", () => { - const permissionName = `${startsWith}${faker.datatype.number()}`; - createPermissionGroup({ - name: permissionName, - permissionsArray: "[MANAGE_PRODUCTS]" - }) - .then(({ group }) => { - cy.visit(permissionGroupDetails(group.id)) - .get(PERMISSION_GROUP_DETAILS.assignMemberButton) - .click() - .get(PERMISSION_GROUP_DETAILS.searchField) - .type(TEST_ADMIN_USER.email); - cy.contains( - PERMISSION_GROUP_DETAILS.userRow, - `${TEST_ADMIN_USER.name} ${TEST_ADMIN_USER.lastName}` - ) - .should("have.length", 1) - .find(BUTTON_SELECTORS.checkbox) - .click() - .get(BUTTON_SELECTORS.submit) - .click() - .addAliasToGraphRequest("PermissionGroupUpdate") - .get(BUTTON_SELECTORS.confirm) - .click() - .wait("@PermissionGroupUpdate"); - getPermissionGroup(group.id); - }) - .then(resp => { - expect(resp.users).to.have.length(1); - expect(resp.users[0].email).to.be.eq(TEST_ADMIN_USER.email); - }); - }); - - it("should remove user from permission group", () => { - const permissionName = `${startsWith}${faker.datatype.number()}`; - let staffMember; - getStaffMembersStartsWith(TEST_ADMIN_USER.email) - .its("body.data.staffUsers.edges") - .then(staffMemberResp => { - staffMember = staffMemberResp[0].node; - createPermissionGroup({ - name: permissionName, - userIdsArray: `["${staffMember.id}"]`, - permissionsArray: "[MANAGE_PRODUCTS]" - }); - }) - .then(({ group }) => { - cy.visit(permissionGroupDetails(group.id)) - .get(PERMISSION_GROUP_DETAILS.removeUserButton) - .click() - .get(BUTTON_SELECTORS.submit) - .click() - .addAliasToGraphRequest("PermissionGroupUpdate") - .get(BUTTON_SELECTORS.confirm) - .click() - .wait("@PermissionGroupUpdate"); - cy.visit(staffMemberDetailsUrl(staffMember.id)); - cy.get(SHARED_ELEMENTS.header).should("be.visible"); - cy.contains(permissionName).should("not.exist"); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/productTypes.js b/cypress/integration/allEnv/configuration/productTypes.js deleted file mode 100644 index f5ab18967..000000000 --- a/cypress/integration/allEnv/configuration/productTypes.js +++ /dev/null @@ -1,103 +0,0 @@ -import faker from "faker"; - -import { createAttribute } from "../../../apiRequests/Attribute"; -import { - createTypeProduct, - getProductType -} from "../../../apiRequests/productType"; -import { PRODUCT_TYPE_DETAILS } from "../../../elements/productTypes/productTypeDetails"; -import { createProductType } from "../../../steps/productTypeSteps"; -import { assignElements } from "../../../steps/shared/assignElements"; -import { confirmationMessageShouldDisappear } from "../../../steps/shared/confirmationMessage"; -import { visitAndWaitForProgressBarToDisappear } from "../../../steps/shared/progressBar"; -import { productTypeDetailsUrl, urlList } from "../../../url/urlList"; -import { deleteProductsStartsWith } from "../../../utils/products/productsUtils"; - -describe("Tests for product types", () => { - const startsWith = "ProductType"; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteProductsStartsWith(startsWith); - createAttribute({ name: startsWith }); - }); - - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.productTypes) - .softExpectSkeletonIsVisible(); - }); - - it("Create product type without shipping required", () => { - const name = `${startsWith}${faker.datatype.number()}`; - - createProductType(name, false) - .then(productType => { - getProductType(productType.id); - }) - .then(productType => { - expect(productType.name).to.be.eq(name); - expect(productType.isShippingRequired).to.be.false; - }); - }); - - it("Create product type with shipping required", () => { - const name = `${startsWith}${faker.datatype.number()}`; - const shippingWeight = 10; - - createProductType(name, shippingWeight) - .then(productType => { - getProductType(productType.id); - }) - .then(productType => { - expect(productType.name).to.be.eq(name); - expect(productType.isShippingRequired).to.be.true; - expect(productType.weight.value).to.eq(shippingWeight); - }); - }); - - it("Update product type with product attribute", () => { - const name = `${startsWith}${faker.datatype.number()}`; - - createTypeProduct({ name }) - .then(productType => { - visitAndWaitForProgressBarToDisappear( - productTypeDetailsUrl(productType.id) - ) - .get(PRODUCT_TYPE_DETAILS.assignProductAttributeButton) - .click(); - cy.addAliasToGraphRequest("AssignProductAttribute"); - assignElements(startsWith, false); - confirmationMessageShouldDisappear(); - cy.wait("@AssignProductAttribute"); - getProductType(productType.id); - }) - .then(productType => { - expect(productType.productAttributes[0].name).to.eq(startsWith); - }); - }); - - it("Update product type with variant attribute", () => { - const name = `${startsWith}${faker.datatype.number()}`; - - createTypeProduct({ name, hasVariants: false }) - .then(productType => { - visitAndWaitForProgressBarToDisappear( - productTypeDetailsUrl(productType.id) - ) - .get(PRODUCT_TYPE_DETAILS.hasVariantsButton) - .click() - .get(PRODUCT_TYPE_DETAILS.assignVariantAttributeButton) - .click(); - cy.addAliasToGraphRequest("AssignProductAttribute"); - assignElements(startsWith, false); - confirmationMessageShouldDisappear(); - cy.wait("@AssignProductAttribute"); - getProductType(productType.id); - }) - .then(productType => { - expect(productType.variantAttributes[0].name).to.eq(startsWith); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/shippingMethods/channelsInShipping.js b/cypress/integration/allEnv/configuration/shippingMethods/channelsInShipping.js deleted file mode 100644 index 3f1300dff..000000000 --- a/cypress/integration/allEnv/configuration/shippingMethods/channelsInShipping.js +++ /dev/null @@ -1,124 +0,0 @@ -// -import faker from "faker"; - -import { createChannel } from "../../../../apiRequests/Channels"; -import { - addChannelToShippingMethod, - addChannelToShippingZone -} from "../../../../apiRequests/ShippingMethod"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { BUTTON_SELECTORS } from "../../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../../elements/shared/sharedElements"; -import { SHIPPING_ZONE_DETAILS } from "../../../../elements/shipping/shipping-zone-details"; -import { selectChannelInHeader } from "../../../../steps/channelsSteps"; -import { waitForProgressBarToNotExist } from "../../../../steps/shared/progressBar"; -import { getFormattedCurrencyAmount } from "../../../../support/format/formatCurrencyAmount"; -import { urlList } from "../../../../url/urlList"; -import * as channelsUtils from "../../../../utils/channelsUtils"; -import * as shippingUtils from "../../../../utils/shippingUtils"; - -describe("Channels in shippingMethod", () => { - const startsWith = "ChannelShippingMethod"; - let defaultChannel; - let plAddress; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - shippingUtils.deleteShippingStartsWith(startsWith); - channelsUtils.deleteChannelsStartsWith(startsWith); - - channelsUtils - .getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(addresses => { - plAddress = addresses.plAddress; - }); - }); - - it("should display different price for each channel", () => { - const shippingName = `${startsWith}${faker.datatype.number()}`; - const defaultChannelPrice = 11; - const createdChannelPrice = 7; - const createdChannelCurrency = "PLN"; - - let shippingMethod; - let shippingZone; - let createdChannel; - - cy.clearSessionData().loginUserViaRequest(); - createChannel({ - name: shippingName, - currencyCode: createdChannelCurrency - }) - .then(channel => { - createdChannel = channel; - shippingUtils.createShipping({ - channelId: defaultChannel.id, - name: shippingName, - address: plAddress, - price: defaultChannelPrice - }); - }) - .then( - ({ - shippingMethod: shippingMethodResp, - shippingZone: shippingZoneResp - }) => { - shippingZone = shippingZoneResp; - shippingMethod = shippingMethodResp; - addChannelToShippingZone(shippingZone.id, createdChannel.id).then( - () => { - addChannelToShippingMethod( - shippingMethod.id, - createdChannel.id, - createdChannelPrice - ); - } - ); - } - ) - .then(() => { - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.shipping) - .visit(urlList.shippingMethods) - .get(SHARED_ELEMENTS.header) - .should("be.visible"); - waitForProgressBarToNotExist(); - cy.addAliasToGraphRequest("ShippingZone"); - cy.getTextFromElement(SHARED_ELEMENTS.table); - }) - .then(tableText => { - if (!tableText.includes(shippingZone.name)) { - cy.get(BUTTON_SELECTORS.nextPaginationButton).click(); - } - cy.contains(shippingZone.name).click(); - cy.wait("@ShippingZone"); - selectChannelInHeader(defaultChannel.name); - cy.getTextFromElement(SHIPPING_ZONE_DETAILS.shippingRatePriceTableCell) - .then(text => { - const expectedValue = getFormattedCurrencyAmount( - defaultChannelPrice, - defaultChannel.currencyCode - ); - expect(text).to.be.eq(expectedValue); - - selectChannelInHeader(createdChannel.name); - }) - .then(() => { - cy.getTextFromElement( - SHIPPING_ZONE_DETAILS.shippingRatePriceTableCell - ); - }) - .then(text => { - const expectedValue = getFormattedCurrencyAmount( - createdChannelPrice, - createdChannelCurrency - ); - expect(text).to.be.eq(expectedValue); - }); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/shippingMethods/createShippingMethod.js b/cypress/integration/allEnv/configuration/shippingMethods/createShippingMethod.js deleted file mode 100644 index 3cdd279c3..000000000 --- a/cypress/integration/allEnv/configuration/shippingMethods/createShippingMethod.js +++ /dev/null @@ -1,141 +0,0 @@ -// -import faker from "faker"; - -import { createCheckout } from "../../../../apiRequests/Checkout"; -import { createWarehouse } from "../../../../apiRequests/Warehouse"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { - createShippingRate, - createShippingZone, - rateOptions -} from "../../../../steps/shippingMethodSteps"; -import { urlList } from "../../../../url/urlList"; -import * as channelsUtils from "../../../../utils/channelsUtils"; -import * as productsUtils from "../../../../utils/products/productsUtils"; -import * as shippingUtils from "../../../../utils/shippingUtils"; -import { isShippingAvailableInCheckout } from "../../../../utils/storeFront/checkoutUtils"; - -describe("Create shipping method", () => { - const startsWith = "CreateShippingMethods-"; - const name = `${startsWith}${faker.datatype.number()}`; - const price = 8; - const deliveryTime = { min: 2, max: 5 }; - let defaultChannel; - let plAddress; - let variantsList; - let warehouse; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productsUtils.deleteProductsStartsWith(startsWith); - shippingUtils.deleteShippingStartsWith(startsWith); - - channelsUtils - .getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(addresses => { - plAddress = addresses.plAddress; - createWarehouse({ name, address: plAddress }); - }) - .then(warehouseResp => { - warehouse = warehouseResp; - productsUtils.createTypeAttributeAndCategoryForProduct(startsWith); - }) - .then( - ({ - productType: productTypeResp, - category: categoryResp, - attribute: attributeResp - }) => { - productsUtils.createProductInChannel({ - name, - channelId: defaultChannel.id, - productTypeId: productTypeResp.id, - attributeId: attributeResp.id, - categoryId: categoryResp.id, - warehouseId: warehouse.id, - quantityInWarehouse: 10 - }); - } - ) - .then(({ variantsList: variantsListResp }) => { - variantsList = variantsListResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create price based shipping method", () => { - const shippingName = `${startsWith}${faker.datatype.number()}`; - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.shipping - ); - cy.visit(urlList.shippingMethods).softExpectSkeletonIsVisible(); - createShippingZone( - shippingName, - warehouse.name, - plAddress.countryFullName, - defaultChannel.name - ); - createShippingRate({ - rateName: shippingName, - price, - rateOption: rateOptions.PRICE_OPTION, - deliveryTime - }); - - createCheckout({ - channelSlug: defaultChannel.slug, - email: "test@example.com", - variantsList, - address: plAddress, - auth: "token" - }).then(({ checkout }) => { - const isShippingAvailable = isShippingAvailableInCheckout( - checkout, - shippingName - ); - expect(isShippingAvailable).to.be.true; - }); - }); - - it("should create weight based shipping method", () => { - const shippingName = `${startsWith}${faker.datatype.number()}`; - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.shipping - ); - cy.visit(urlList.shippingMethods).softExpectSkeletonIsVisible(); - createShippingZone( - shippingName, - warehouse.name, - plAddress.countryFullName, - defaultChannel.name - ); - createShippingRate({ - rateName: shippingName, - price, - rateOption: rateOptions.WEIGHT_OPTION, - deliveryTime - }); - createCheckout({ - channelSlug: defaultChannel.slug, - email: "test@example.com", - variantsList, - address: plAddress, - auth: "token" - }).then(({ checkout }) => { - const isShippingAvailable = isShippingAvailableInCheckout( - checkout, - shippingName - ); - expect(isShippingAvailable).to.be.true; - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/shippingMethods/postalCodes.js b/cypress/integration/allEnv/configuration/shippingMethods/postalCodes.js deleted file mode 100644 index 729c5029c..000000000 --- a/cypress/integration/allEnv/configuration/shippingMethods/postalCodes.js +++ /dev/null @@ -1,134 +0,0 @@ -// -import faker from "faker"; - -import { createCheckout } from "../../../../apiRequests/Checkout"; -import { createShippingZone } from "../../../../apiRequests/ShippingMethod"; -import { createWarehouse } from "../../../../apiRequests/Warehouse"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { - createRateWithPostalCode, - postalCodesOptions -} from "../../../../steps/shippingMethodSteps"; -import { shippingZoneDetailsUrl } from "../../../../url/urlList"; -import { getDefaultChannel } from "../../../../utils/channelsUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../../utils/products/productsUtils"; -import { deleteShippingStartsWith } from "../../../../utils/shippingUtils"; -import { isShippingAvailableInCheckout } from "../../../../utils/storeFront/checkoutUtils"; - -describe("Postal codes in shipping", () => { - const startsWith = "CyShippingMethods-"; - const name = `${startsWith}${faker.datatype.number()}`; - - const price = 10; - - let defaultChannel; - let usAddress; - let secondUsAddress; - let shippingZone; - let warehouse; - let variantsList; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteShippingStartsWith(startsWith); - deleteProductsStartsWith(startsWith); - - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then( - ({ - usAddress: usAddressResp, - secondUsAddress: secondUsAddressResp - }) => { - usAddress = usAddressResp; - secondUsAddress = secondUsAddressResp; - createShippingZone(name, "US", defaultChannel.id); - } - ) - .then(shippingZoneResp => { - shippingZone = shippingZoneResp; - createWarehouse({ - name, - shippingZone: shippingZone.id, - address: usAddress - }); - }) - .then(warehouseResp => { - warehouse = warehouseResp; - createTypeAttributeAndCategoryForProduct(name); - }) - .then(({ attribute, productType, category }) => { - createProductInChannel({ - name, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id - }); - }) - .then(({ variantsList: variantsListResp }) => { - variantsList = variantsListResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.shipping) - .visit(shippingZoneDetailsUrl(shippingZone.id)); - }); - - it("Create shipping method with included postal codes", () => { - const rateName = `${startsWith}${faker.datatype.number()}`; - - createRateWithPostalCode({ - rateName, - price, - postalCodeOption: postalCodesOptions.INCLUDE_OPTION, - maxPostalCode: usAddress.postalCode, - minPostalCode: usAddress.postalCode - }); - isShippingAvailableForAddress(usAddress, rateName).then( - isAvailable => expect(isAvailable).to.be.true - ); - isShippingAvailableForAddress(secondUsAddress, rateName).then( - isAvailable => expect(isAvailable).to.be.false - ); - }); - - it("Create shipping method with excluded postal codes", () => { - const rateName = `${startsWith}${faker.datatype.number()}`; - - createRateWithPostalCode({ - rateName, - price, - postalCodeOption: postalCodesOptions.EXCLUDE_OPTION, - maxPostalCode: usAddress.postalCode, - minPostalCode: usAddress.postalCode - }); - isShippingAvailableForAddress(usAddress, rateName).then( - isAvailable => expect(isAvailable).to.be.false - ); - isShippingAvailableForAddress(secondUsAddress, rateName).then( - isAvailable => expect(isAvailable).to.be.true - ); - }); - - function isShippingAvailableForAddress(address, rateName) { - return createCheckout({ - address, - channelSlug: defaultChannel.slug, - email: "example@example.com", - variantsList - }).then(({ checkout }) => - isShippingAvailableInCheckout(checkout, rateName) - ); - } -}); diff --git a/cypress/integration/allEnv/configuration/shippingMethods/shippingWeight.js b/cypress/integration/allEnv/configuration/shippingMethods/shippingWeight.js deleted file mode 100644 index 1e972bae7..000000000 --- a/cypress/integration/allEnv/configuration/shippingMethods/shippingWeight.js +++ /dev/null @@ -1,187 +0,0 @@ -// -import faker from "faker"; - -import { createCheckout } from "../../../../apiRequests/Checkout"; -import { - createShippingRate as createShippingRateViaApi, - createShippingZone -} from "../../../../apiRequests/ShippingMethod"; -import { updateShopWeightUnit } from "../../../../apiRequests/shopSettings"; -import { createWarehouse } from "../../../../apiRequests/Warehouse"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { SHARED_ELEMENTS } from "../../../../elements/shared/sharedElements"; -import { SHIPPING_RATE_DETAILS } from "../../../../elements/shipping/shipping-rate-details"; -import { - changeWeightUnit, - createShippingRate, - rateOptions -} from "../../../../steps/shippingMethodSteps"; -import { - shippingZoneDetailsUrl, - urlList, - weightRateUrl -} from "../../../../url/urlList"; -import { getDefaultChannel } from "../../../../utils/channelsUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../../utils/products/productsUtils"; -import { deleteShippingStartsWith } from "../../../../utils/shippingUtils"; -import { isShippingAvailableInCheckout } from "../../../../utils/storeFront/checkoutUtils"; - -describe("Shipping weight limits", () => { - const startsWith = "CyWeightRates-"; - const name = `${startsWith}${faker.datatype.number()}`; - - const price = 10; - - let defaultChannel; - let usAddress; - let shippingZone; - let warehouse; - let variantsList; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteShippingStartsWith(startsWith); - deleteProductsStartsWith(startsWith); - - updateShopWeightUnit("KG"); - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(({ usAddress: usAddressResp }) => { - usAddress = usAddressResp; - createShippingZone(name, "US", defaultChannel.id); - }) - .then(shippingZoneResp => { - shippingZone = shippingZoneResp; - createWarehouse({ - name, - shippingZone: shippingZone.id, - address: usAddress - }); - }) - .then(warehouseResp => { - warehouse = warehouseResp; - createTypeAttributeAndCategoryForProduct(name); - }) - .then(({ attribute, productType, category }) => { - createProductInChannel({ - name, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id, - weight: 10 - }); - }) - .then(({ variantsList: variantsListResp }) => { - variantsList = variantsListResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.shipping) - .visit(shippingZoneDetailsUrl(shippingZone.id)); - }); - - it("should be possible to buy product in a shipping weight limits", () => { - const rateName = `${startsWith}${faker.datatype.number()}`; - createShippingRate({ - rateName, - price, - rateOption: rateOptions.WEIGHT_OPTION, - weightLimits: { - max: 11, - min: 10 - } - }); - createCheckout({ - address: usAddress, - channelSlug: defaultChannel.slug, - email: "example@example.com", - variantsList - }).then(({ checkout }) => { - expect(isShippingAvailableInCheckout(checkout, rateName)).to.be.true; - }); - }); - - it("should not be possible to buy product not in a shipping weight limits", () => { - const rateName = `${startsWith}${faker.datatype.number()}`; - createShippingRate({ - rateName, - price, - rateOption: rateOptions.WEIGHT_OPTION, - weightLimits: { - max: 101, - min: 100 - } - }); - createCheckout({ - address: usAddress, - channelSlug: defaultChannel.slug, - email: "example@example.com", - variantsList - }).then(({ checkout }) => { - expect(isShippingAvailableInCheckout(checkout, rateName)).to.be.false; - }); - }); - - // Log in as user with shipping permissions after resolving SALEOR-3407 bug - it("should recalculate weight after changing shipping weight unit", () => { - const rateName = `${startsWith}${faker.datatype.number()}`; - const minWeightInKg = 1; - const maxWeightInKg = 10; - const minWeightInG = minWeightInKg * 1000; - const maxWeightInG = maxWeightInKg * 1000; - let shippingMethod; - - cy.clearSessionData().loginUserViaRequest(); - - createShippingRateViaApi({ - name: rateName, - shippingZone: shippingZone.id, - type: "WEIGHT", - maxWeight: maxWeightInKg, - minWeight: minWeightInKg - }) - .then(({ shippingMethod: shippingMethodResp }) => { - shippingMethod = shippingMethodResp; - cy.visit(urlList.shippingMethods) - .get(SHARED_ELEMENTS.progressBar) - .should("not.exist"); - changeWeightUnit("G"); - - cy.addAliasToGraphRequest("ShippingZone"); - cy.visit(weightRateUrl(shippingZone.id, shippingMethod.id)) - .wait("@ShippingZone") - .its("response.body"); - }) - .then(responseArray => { - const shippingMethods = responseArray.find( - element => element.data.shippingZone - ).data.shippingZone.shippingMethods; - const rate = shippingMethods.find( - element => element.id === shippingMethod.id - ); - expect(rate.minimumOrderWeight.unit).to.eq("G"); - cy.get(SHARED_ELEMENTS.progressBar) - .should("not.be.visible") - .get(SHIPPING_RATE_DETAILS.minWeightInput) - .invoke("val"); - }) - .then(actualMinWeight => { - expect(parseInt(actualMinWeight, 10)).to.eq(minWeightInG); - cy.get(SHIPPING_RATE_DETAILS.maxWeightInput).invoke("val"); - }) - .then(actualMaxWeight => { - expect(parseInt(actualMaxWeight, 10)).to.eq(maxWeightInG); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/siteSettings.js b/cypress/integration/allEnv/configuration/siteSettings.js deleted file mode 100644 index bb7f4487e..000000000 --- a/cypress/integration/allEnv/configuration/siteSettings.js +++ /dev/null @@ -1,78 +0,0 @@ -import faker from "faker"; - -import { - getShopInfo, - updateShopAddress -} from "../../../apiRequests/shopSettings"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SITE_SETTINGS_DETAILS } from "../../../elements/siteSettings/site-settings-details"; -import { fillUpBasicAddress } from "../../../steps/shared/addressForm"; -import { confirmationMessageShouldDisappear } from "../../../steps/shared/confirmationMessage"; -import { urlList } from "../../../url/urlList"; - -describe("Tests for site settings", () => { - let address; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - cy.fixture("addresses").then(({ usAddress, plAddress }) => { - address = usAddress; - updateShopAddress(plAddress); - }); - }); - - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.siteSettings); - }); - - it("should change store name", () => { - const name = `Cypress-${faker.datatype.number()}`; - - cy.get(SITE_SETTINGS_DETAILS.nameInput) - .clearAndType(name) - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - getShopInfo().then(shopInfo => { - expect(shopInfo.name).to.eq(name); - }); - }); - - it("should change site url", () => { - const url = `http://cypress${faker.datatype.number()}.saleor.com`; - - cy.get(SITE_SETTINGS_DETAILS.urlInput) - .clearAndType(url) - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - getShopInfo().then(shopInfo => { - expect(shopInfo.domain.host).to.eq(url); - }); - }); - - it("should change store description", () => { - const description = faker.lorem.sentence(); - - cy.get(SITE_SETTINGS_DETAILS.descriptionInput) - .clearAndType(description) - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - getShopInfo().then(shopInfo => { - expect(shopInfo.description).to.eq(description); - }); - }); - - it("should change store address", () => { - fillUpBasicAddress(address); - cy.get(BUTTON_SELECTORS.confirm).click(); - confirmationMessageShouldDisappear(); - getShopInfo().then(({ companyAddress }) => { - expect(companyAddress.companyName).to.eq(address.companyName); - cy.expectCorrectBasicAddress(companyAddress, address); - }); - }); -}); diff --git a/cypress/integration/allEnv/configuration/warehouse.js b/cypress/integration/allEnv/configuration/warehouse.js deleted file mode 100644 index 11f28c5c3..000000000 --- a/cypress/integration/allEnv/configuration/warehouse.js +++ /dev/null @@ -1,112 +0,0 @@ -// -import faker from "faker"; - -import { createShippingZone } from "../../../apiRequests/ShippingMethod"; -import { createWarehouse, getWarehouse } from "../../../apiRequests/Warehouse"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHIPPING_ZONE_DETAILS } from "../../../elements/shipping/shipping-zone-details"; -import { WAREHOUSES_DETAILS } from "../../../elements/warehouses/warehouse-details"; -import { WAREHOUSES_LIST } from "../../../elements/warehouses/warehouses-list"; -import { fillUpBasicAddress } from "../../../steps/shared/addressForm"; -import { fillAutocompleteSelect } from "../../../steps/shared/selects"; -import { - shippingZoneDetailsUrl, - urlList, - warehouseDetailsUrl -} from "../../../url/urlList"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import { deleteShippingStartsWith } from "../../../utils/shippingUtils"; - -describe("Warehouse settings", () => { - const startsWith = "CyWarehouse"; - let usAddress; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteShippingStartsWith(startsWith); - cy.fixture("addresses").then(addresses => { - usAddress = addresses.usAddress; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create warehouse", () => { - const name = `${startsWith}${faker.datatype.number()}`; - cy.visit(urlList.warehouses) - .get(WAREHOUSES_LIST.createNewButton) - .click(); - cy.get(WAREHOUSES_DETAILS.nameInput).type(name); - fillUpBasicAddress(usAddress); - cy.addAliasToGraphRequest("WarehouseCreate") - .get(BUTTON_SELECTORS.confirm) - .click() - .wait("@WarehouseCreate") - .its("response.body.data.createWarehouse.warehouse") - .then(warehouse => { - getWarehouse(warehouse.id); - }) - .then(warehouse => { - const addressResp = warehouse.address; - chai.softExpect(warehouse.name).to.be.eq(name); - cy.expectCorrectBasicAddress(addressResp, usAddress); - }); - }); - - it("should add warehouse to shipping zone", () => { - const name = `${startsWith}${faker.datatype.number()}`; - let defaultChannel; - let warehouse; - let shippingZone; - - getDefaultChannel() - .then(channelResp => { - defaultChannel = channelResp; - createWarehouse({ - name, - address: usAddress - }); - }) - .then(warehouseResp => { - warehouse = warehouseResp; - createShippingZone(name, "US", defaultChannel.id); - }) - .then(shippingZoneResp => { - shippingZone = shippingZoneResp; - cy.visit(shippingZoneDetailsUrl(shippingZone.id)); - fillAutocompleteSelect( - SHIPPING_ZONE_DETAILS.warehouseSelector, - warehouse.name - ); - cy.addAliasToGraphRequest("UpdateShippingZone") - .get(BUTTON_SELECTORS.confirm) - .click() - .wait("@UpdateShippingZone"); - getWarehouse(warehouse.id); - }) - .then(warehouseResp => { - expect(warehouseResp.shippingZones.edges[0].node.id).to.be.eq( - shippingZone.id - ); - }); - }); - - it("should delete warehouse", () => { - const name = `${startsWith}${faker.datatype.number()}`; - createWarehouse({ - name, - address: usAddress - }).then(warehouse => { - cy.visit(warehouseDetailsUrl(warehouse.id)) - .get(BUTTON_SELECTORS.deleteButton) - .click() - .addAliasToGraphRequest("WarehouseDelete") - .get(BUTTON_SELECTORS.submit) - .click() - .wait("@WarehouseDelete"); - getWarehouse(warehouse.id).should("be.null"); - }); - }); -}); diff --git a/cypress/integration/allEnv/customerRegistration.js b/cypress/integration/allEnv/customerRegistration.js deleted file mode 100644 index b12d6299d..000000000 --- a/cypress/integration/allEnv/customerRegistration.js +++ /dev/null @@ -1,55 +0,0 @@ -import faker from "faker"; - -import { customerRegistration } from "../../apiRequests/Customer"; -import { CUSTOMER_DETAILS } from "../../elements/customers/customer-details"; -import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; -import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; -import { customerDetailsUrl } from "../../url/urlList"; -import { getDefaultChannel } from "../../utils/channelsUtils"; - -describe("Tests for customer registration", () => { - const startsWith = "Registration"; - const email = `${startsWith}${faker.datatype.number()}@example.com`; - - let defaultChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - getDefaultChannel().then(channel => { - defaultChannel = channel; - }); - }); - - it("shouldn't register customer with duplicated email", () => { - const duplicatedEmail = Cypress.env("USER_NAME"); - customerRegistration({ - duplicatedEmail, - channel: defaultChannel.slug - }).then(({ user, errors }) => { - expect(errors[0].field).to.eq("email"); - expect(user).to.not.be.ok; - }); - }); - - it("should activate customer from dashboard", () => { - customerRegistration({ email, channel: defaultChannel.slug }) - .then(({ user }) => { - cy.visit(customerDetailsUrl(user.id)) - .get(CUSTOMER_DETAILS.isActiveCheckbox) - .click() - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - cy.clearSessionData() - .loginUserViaRequest("token", { - email, - password: Cypress.env("USER_PASSWORD") - }) - .its("body.data.tokenCreate"); - }) - .then(({ token, errors }) => { - expect(errors.length).to.eq(0); - expect(token).to.be.ok; - }); - }); -}); diff --git a/cypress/integration/allEnv/discounts/sales.js b/cypress/integration/allEnv/discounts/sales.js deleted file mode 100644 index 7a88b06a4..000000000 --- a/cypress/integration/allEnv/discounts/sales.js +++ /dev/null @@ -1,198 +0,0 @@ -// - -import faker from "faker"; - -import { createChannel } from "../../../apiRequests/Channels"; -import { updateChannelInProduct } from "../../../apiRequests/Product"; -import { - assignProducts, - createSale, - discountOptions -} from "../../../steps/discounts/salesSteps"; -import { urlList } from "../../../url/urlList"; -import * as channelsUtils from "../../../utils/channelsUtils"; -import { deleteSalesStartsWith } from "../../../utils/discounts/salesUtils"; -import * as productsUtils from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; -import { getProductPrice } from "../../../utils/storeFront/storeFrontProductUtils"; - -describe("Sales discounts", () => { - const startsWith = "CySales-"; - - let productType; - let attribute; - let category; - let defaultChannel; - let warehouse; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - channelsUtils.deleteChannelsStartsWith(startsWith); - deleteSalesStartsWith(startsWith); - productsUtils.deleteProductsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - - const name = `${startsWith}${faker.datatype.number()}`; - productsUtils - .createTypeAttributeAndCategoryForProduct(name) - .then( - ({ - productType: productTypeResp, - attribute: attributeResp, - category: categoryResp - }) => { - productType = productTypeResp; - attribute = attributeResp; - category = categoryResp; - - channelsUtils.getDefaultChannel(); - } - ) - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(addresses => { - createShipping({ - channelId: defaultChannel.id, - name, - address: addresses.plAddress, - price: 100 - }); - }) - .then(({ warehouse: warehouseResp }) => { - warehouse = warehouseResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create percentage discount", () => { - const saleName = `${startsWith}${faker.datatype.number()}`; - const discountValue = 50; - const productPrice = 100; - - productsUtils - .createProductInChannel({ - name: saleName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price: productPrice - }) - .then(({ product: productResp }) => { - /* Uncomment after fixing SALEOR-3367 bug - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) - */ - - cy.visit(urlList.sales); - cy.softExpectSkeletonIsVisible(); - const product = productResp; - createSale({ - saleName, - channelName: defaultChannel.name, - discountValue, - discountOption: discountOptions.PERCENTAGE - }); - assignProducts(product.name); - getProductPrice(product.id, defaultChannel.slug); - }) - .then(price => { - const expectedPrice = (productPrice * discountValue) / 100; - expect(expectedPrice).to.be.eq(price); - }); - }); - - it("should create fixed price discount", () => { - const saleName = `${startsWith}${faker.datatype.number()}`; - const discountValue = 50; - const productPrice = 100; - - productsUtils - .createProductInChannel({ - name: saleName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price: productPrice - }) - .then(({ product: productResp }) => { - /* Uncomment after fixing SALEOR-3367 bug - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) - */ - - cy.visit(urlList.sales); - cy.softExpectSkeletonIsVisible(); - const product = productResp; - createSale({ - saleName, - channelName: defaultChannel.name, - discountValue, - discountOption: discountOptions.FIXED - }); - assignProducts(product.name); - getProductPrice(product.id, defaultChannel.slug); - }) - .then(price => { - const expectedPrice = productPrice - discountValue; - expect(expectedPrice).to.be.eq(price); - }); - }); - - it("should not displayed discount not assign to channel", () => { - const saleName = `${startsWith}${faker.datatype.number()}`; - let channel; - let product; - const discountValue = 50; - const productPrice = 100; - - createChannel({ name: saleName }).then( - channelResp => (channel = channelResp) - ); - productsUtils - .createProductInChannel({ - name: saleName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price: productPrice - }) - .then(({ product: productResp }) => { - product = productResp; - updateChannelInProduct({ - productId: product.id, - channelId: channel.id - }); - }) - .then(() => { - /* Uncomment after fixing SALEOR-3367 bug - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) - */ - - cy.visit(urlList.sales); - cy.softExpectSkeletonIsVisible(); - createSale({ - saleName, - channelName: channel.name, - discountValue - }); - assignProducts(product.name); - getProductPrice(product.id, defaultChannel.slug); - }) - .then(price => expect(price).to.equal(productPrice)); - }); -}); diff --git a/cypress/integration/allEnv/discounts/vouchers.js b/cypress/integration/allEnv/discounts/vouchers.js deleted file mode 100644 index 3671bd77d..000000000 --- a/cypress/integration/allEnv/discounts/vouchers.js +++ /dev/null @@ -1,177 +0,0 @@ -// -import faker from "faker"; - -import { createChannel } from "../../../apiRequests/Channels"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { - createVoucher, - discountOptions -} from "../../../steps/discounts/vouchersSteps"; -import { urlList } from "../../../url/urlList"; -import * as channelsUtils from "../../../utils/channelsUtils"; -import { deleteVouchersStartsWith } from "../../../utils/discounts/vouchersUtils"; -import { createCheckoutWithVoucher } from "../../../utils/ordersUtils"; -import * as productsUtils from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Vouchers discounts", () => { - const startsWith = "CyVou-"; - const productPrice = 100; - const shippingPrice = 100; - - let defaultChannel; - let createdChannel; - let productType; - let attribute; - let category; - let shippingMethod; - let variants; - let address; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - channelsUtils.deleteChannelsStartsWith(startsWith); - productsUtils.deleteProductsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - deleteVouchersStartsWith(startsWith); - - const name = `${startsWith}${faker.datatype.number()}`; - - productsUtils - .createTypeAttributeAndCategoryForProduct(name) - .then( - ({ - productType: productTypeResp, - attribute: attributeResp, - category: categoryResp - }) => { - productType = productTypeResp; - attribute = attributeResp; - category = categoryResp; - - channelsUtils.getDefaultChannel(); - } - ) - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(addresses => { - address = addresses.plAddress; - createShipping({ - channelId: defaultChannel.id, - name, - address, - price: shippingPrice - }); - }) - .then(({ shippingMethod: shippingMethodResp, warehouse: warehouse }) => { - shippingMethod = shippingMethodResp; - productsUtils.createProductInChannel({ - name, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price: productPrice - }); - }) - .then(({ variantsList: variantsResp }) => { - variants = variantsResp; - createChannel({ name }); - }) - .then(channel => { - createdChannel = channel; - }); - }); - - it("should create percentage voucher", () => { - const voucherValue = 50; - - loginAndCreateCheckoutForVoucherWithDiscount( - discountOptions.PERCENTAGE, - voucherValue - ).then(amount => { - const expectedAmount = - (productPrice * voucherValue) / 100 + shippingPrice; - expect(amount).to.be.eq(expectedAmount); - }); - }); - - it("should create fixed price voucher", () => { - const voucherValue = 50; - loginAndCreateCheckoutForVoucherWithDiscount( - discountOptions.FIXED, - voucherValue - ).then(amount => { - const expectedAmount = productPrice + shippingPrice - voucherValue; - expect(amount).to.be.eq(expectedAmount); - }); - }); - - it("should create free shipping voucher", () => { - loginAndCreateCheckoutForVoucherWithDiscount( - discountOptions.SHIPPING, - null - ).then(amount => { - const expectedAmount = productPrice; - expect(amount).to.be.eq(expectedAmount); - }); - }); - - it("should create voucher not available for selected channel", () => { - const randomName = `${startsWith}${faker.datatype.number()}`; - const voucherValue = 50; - - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.vouchers); - cy.softExpectSkeletonIsVisible(); - createVoucher({ - voucherCode: randomName, - voucherValue, - discountOption: discountOptions.PERCENTAGE, - channelName: createdChannel.name - }); - createCheckoutForCreatedVoucher(randomName).then(resp => { - const errorField = resp.checkoutErrors[0].field; - expect(errorField).to.be.eq("promoCode"); - }); - }); - - function createCheckoutForCreatedVoucher(voucherCode) { - return createCheckoutWithVoucher({ - channelSlug: defaultChannel.slug, - variantsList: variants, - address, - shippingMethodId: shippingMethod.id, - voucherCode, - auth: "token" - }); - } - - function loginAndCreateCheckoutForVoucherWithDiscount( - discount, - voucherValue - ) { - const voucherCode = `${startsWith}${faker.datatype.number()}`; - - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) - .visit(urlList.vouchers); - cy.softExpectSkeletonIsVisible(); - createVoucher({ - voucherCode, - voucherValue, - discountOption: discount, - channelName: defaultChannel.name - }); - return createCheckoutForCreatedVoucher(voucherCode).its( - "checkout.totalPrice.gross.amount" - ); - } -}); diff --git a/cypress/integration/allEnv/homePage/homePage.js b/cypress/integration/allEnv/homePage/homePage.js deleted file mode 100644 index d2100d962..000000000 --- a/cypress/integration/allEnv/homePage/homePage.js +++ /dev/null @@ -1,19 +0,0 @@ -import { TEST_ADMIN_USER, USER_WITHOUT_NAME } from "../../../Data/users"; -import { expectWelcomeMessageIncludes } from "../../../steps/homePageSteps"; -import { urlList } from "../../../url/urlList"; - -describe("Displaying welcome message on home page", () => { - it("should display user name on home page", () => { - cy.loginUserViaRequest(); - cy.visit(urlList.homePage); - expectWelcomeMessageIncludes( - `${TEST_ADMIN_USER.name} ${TEST_ADMIN_USER.lastName}` - ); - }); - - it("should display user email on home page", () => { - cy.loginUserViaRequest("auth", USER_WITHOUT_NAME); - cy.visit(urlList.homePage); - expectWelcomeMessageIncludes(`${USER_WITHOUT_NAME.email}`); - }); -}); diff --git a/cypress/integration/allEnv/homePage/homePageAnalitics.js b/cypress/integration/allEnv/homePage/homePageAnalitics.js deleted file mode 100644 index a5574b23e..000000000 --- a/cypress/integration/allEnv/homePage/homePageAnalitics.js +++ /dev/null @@ -1,251 +0,0 @@ -import faker from "faker"; - -import { - createCustomer, - deleteCustomersStartsWith -} from "../../../apiRequests/Customer"; -import { HOMEPAGE_SELECTORS } from "../../../elements/homePage/homePage-selectors"; -import { changeChannel } from "../../../steps/homePageSteps"; -import { urlList } from "../../../url/urlList"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import * as homePageUtils from "../../../utils/homePageUtils"; -import { - createReadyToFulfillOrder, - createWaitingForCaptureOrder -} from "../../../utils/ordersUtils"; -import * as productsUtils from "../../../utils/products/productsUtils"; -import * as shippingUtils from "../../../utils/shippingUtils"; - -// -describe("Homepage analytics", () => { - const startsWith = "CyHomeAnalytics"; - - let customerId; - let defaultChannel; - let createdVariants; - let productType; - let attribute; - let category; - let warehouse; - let shippingMethod; - let addresses; - - const productPrice = 22; - const shippingPrice = 12; - const randomName = startsWith + faker.datatype.number(); - const randomEmail = `${startsWith}${randomName}@example.com`; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productsUtils.deleteProductsStartsWith(startsWith); - deleteCustomersStartsWith(startsWith); - shippingUtils.deleteShippingStartsWith(startsWith); - - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(addressesFixture => (addresses = addressesFixture)) - .then(() => createCustomer(randomEmail, randomName, addresses.plAddress)) - .then(resp => { - customerId = resp.body.data.customerCreate.user.id; - shippingUtils.createShipping({ - channelId: defaultChannel.id, - name: randomName, - address: addresses.plAddress, - price: shippingPrice - }); - }) - .then( - ({ warehouse: warehouseResp, shippingMethod: shippingMethodResp }) => { - warehouse = warehouseResp; - shippingMethod = shippingMethodResp; - productsUtils.createTypeAttributeAndCategoryForProduct(randomName); - } - ) - .then( - ({ - productType: productTypeResp, - attribute: attributeResp, - category: categoryResp - }) => { - productType = productTypeResp; - attribute = attributeResp; - category = categoryResp; - productsUtils.createProductInChannel({ - name: randomName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - quantityInWarehouse: 20, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price: productPrice - }); - } - ) - .then(({ variantsList: variantsResp }) => { - createdVariants = variantsResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should all elements be visible on the dashboard", () => { - cy.visit(urlList.homePage) - .softAssertVisibility(HOMEPAGE_SELECTORS.sales) - .softAssertVisibility(HOMEPAGE_SELECTORS.orders) - .softAssertVisibility(HOMEPAGE_SELECTORS.activity) - .softAssertVisibility(HOMEPAGE_SELECTORS.topProducts) - .softAssertVisibility(HOMEPAGE_SELECTORS.ordersReadyToFulfill) - .softAssertVisibility(HOMEPAGE_SELECTORS.paymentsWaitingForCapture) - .softAssertVisibility(HOMEPAGE_SELECTORS.productsOutOfStock); - }); - - it("should correct amount of ready to fullfil orders be displayed", () => { - homePageUtils - .getOrdersReadyToFulfill(defaultChannel.slug) - .as("ordersReadyToFulfill"); - createReadyToFulfillOrder({ - customerId, - shippingMethodId: shippingMethod.id, - channelId: defaultChannel.id, - variantsList: createdVariants, - address: addresses.plAddress - }); - cy.get("@ordersReadyToFulfill").then(ordersReadyToFulfillBefore => { - const allOrdersReadyToFulfill = ordersReadyToFulfillBefore + 1; - const notANumberRegex = "\\D*"; - const ordersReadyToFulfillRegexp = new RegExp( - `${notANumberRegex}${allOrdersReadyToFulfill}${notANumberRegex}` - ); - cy.visit(urlList.homePage); - changeChannel(defaultChannel.name); - cy.contains( - HOMEPAGE_SELECTORS.ordersReadyToFulfill, - ordersReadyToFulfillRegexp - ).should("be.visible"); - }); - }); - - it("should correct amount of payments waiting for capture be displayed", () => { - homePageUtils - .getOrdersReadyForCapture(defaultChannel.slug) - .as("ordersReadyForCapture"); - - createWaitingForCaptureOrder({ - channelSlug: defaultChannel.slug, - email: randomEmail, - variantsList: createdVariants, - shippingMethodId: shippingMethod.id, - address: addresses.plAddress - }); - - cy.get("@ordersReadyForCapture").then(ordersReadyForCaptureBefore => { - const allOrdersReadyForCapture = ordersReadyForCaptureBefore + 1; - const notANumberRegex = "\\D*"; - const ordersReadyForCaptureRegexp = new RegExp( - `${notANumberRegex}${allOrdersReadyForCapture}${notANumberRegex}` - ); - cy.visit(urlList.homePage); - changeChannel(defaultChannel.name); - cy.contains( - HOMEPAGE_SELECTORS.ordersReadyForCapture, - ordersReadyForCaptureRegexp - ).should("be.visible"); - }); - }); - - it("should correct amount of products out of stock be displayed", () => { - homePageUtils - .getProductsOutOfStock(defaultChannel.slug) - .as("productsOutOfStock"); - const productOutOfStockRandomName = startsWith + faker.datatype.number(); - - productsUtils.createProductInChannel({ - name: productOutOfStockRandomName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - quantityInWarehouse: 0, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price: productPrice - }); - - cy.get("@productsOutOfStock").then(productsOutOfStockBefore => { - const allProductsOutOfStock = productsOutOfStockBefore + 1; - const notANumberRegex = "\\D*"; - const productsOutOfStockRegexp = new RegExp( - `${notANumberRegex}${allProductsOutOfStock}${notANumberRegex}` - ); - cy.visit(urlList.homePage); - changeChannel(defaultChannel.name); - cy.contains( - HOMEPAGE_SELECTORS.productsOutOfStock, - productsOutOfStockRegexp - ).should("be.visible"); - }); - }); - - it("should correct amount of sales be displayed", () => { - homePageUtils.getSalesAmount(defaultChannel.slug).as("salesAmount"); - - createReadyToFulfillOrder({ - customerId, - shippingMethodId: shippingMethod.id, - channelId: defaultChannel.id, - variantsList: createdVariants, - address: addresses.plAddress - }); - - cy.get("@salesAmount").then(salesAmount => { - const totalAmount = salesAmount + productPrice; - const totalAmountString = totalAmount.toFixed(2); - const totalAmountIntegerValue = totalAmountString.split(".")[0]; - const totalAmountDecimalValue = totalAmountString.split(".")[1]; - const decimalSeparator = "[,.]"; - const totalAmountIntegerWithThousandsSeparator = new Intl.NumberFormat( - "en" - ) - .format(totalAmountIntegerValue) - .replaceAll(",", "[,.]*"); - const totalAmountWithSeparators = `${totalAmountIntegerWithThousandsSeparator}${decimalSeparator}${totalAmountDecimalValue}`; - const notANumberRegex = "\\D*"; - const salesAmountRegexp = new RegExp( - `${notANumberRegex}${totalAmountWithSeparators}${notANumberRegex}` - ); - cy.visit(urlList.homePage); - changeChannel(defaultChannel.name); - cy.contains(HOMEPAGE_SELECTORS.sales, salesAmountRegexp).should( - "be.visible" - ); - }); - }); - - it("should correct amount of orders be displayed", () => { - homePageUtils.getTodaysOrders(defaultChannel.slug).as("todaysOrders"); - - createReadyToFulfillOrder({ - customerId, - shippingMethodId: shippingMethod.id, - channelId: defaultChannel.id, - variantsList: createdVariants, - address: addresses.plAddress - }); - - cy.get("@todaysOrders").then(ordersBefore => { - const allOrders = ordersBefore + 1; - const notANumberRegex = "\\D*"; - const ordersRegexp = new RegExp( - `${notANumberRegex}${allOrders}${notANumberRegex}` - ); - cy.visit(urlList.homePage); - changeChannel(defaultChannel.name); - cy.contains(HOMEPAGE_SELECTORS.orders, ordersRegexp).should("be.visible"); - }); - }); -}); diff --git a/cypress/integration/allEnv/login_form.js b/cypress/integration/allEnv/login_form.js deleted file mode 100644 index 71021af35..000000000 --- a/cypress/integration/allEnv/login_form.js +++ /dev/null @@ -1,39 +0,0 @@ -// -import { LOGIN_SELECTORS } from "../../elements/account/login-selectors"; -import { urlList } from "../../url/urlList"; - -describe("User authorization", () => { - beforeEach(() => { - cy.clearSessionData(); - }); - - it("should successfully log in an user", () => { - cy.visit(urlList.homePage); - cy.loginUser(); - cy.get(LOGIN_SELECTORS.welcomePage); - }); - - it("should fail for wrong password", () => { - cy.visit(urlList.homePage) - .get(LOGIN_SELECTORS.emailAddressInput) - .type("admin@example.com") - .get(LOGIN_SELECTORS.emailPasswordInput) - .type("wrong-password") - .get(LOGIN_SELECTORS.signInButton) - .click() - .get(LOGIN_SELECTORS.warningCredentialMessage); - }); - - it("should successfully log out an user", () => { - cy.window().then(win => { - win.sessionStorage.clear(); - }); - cy.visit(urlList.homePage); - cy.loginUser(); - cy.get(LOGIN_SELECTORS.userMenu) - .click() - .get(LOGIN_SELECTORS.accountSettings) - .click(); - cy.location("pathname").should("contains", "/staff/"); - }); -}); diff --git a/cypress/integration/allEnv/metadata.js b/cypress/integration/allEnv/metadata.js deleted file mode 100644 index 1a149dfb8..000000000 --- a/cypress/integration/allEnv/metadata.js +++ /dev/null @@ -1,100 +0,0 @@ -import faker from "faker"; - -import { - updateMetadata, - updatePrivateMetadata -} from "../../apiRequests/Metadata"; -import { createDraftOrder, getOrder } from "../../apiRequests/Order"; -import { getProductMetadata } from "../../apiRequests/storeFront/ProductDetails"; -import { getDefaultChannel } from "../../utils/channelsUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct -} from "../../utils/products/productsUtils"; - -describe("Test for metadata", () => { - const startsWith = "Metadata"; - const name = `${startsWith}${faker.datatype.number()}`; - const metadata = { key: "metadataKey", value: "metadataValue" }; - let channel; - let product; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - getDefaultChannel() - .then(channelResp => { - channel = channelResp; - createTypeAttributeAndCategoryForProduct(name); - }) - .then(({ attribute, category, productType }) => { - createProductInChannel({ - attributeId: attribute.id, - categoryId: category.id, - channelId: channel.id, - name, - productTypeId: productType.id - }); - }) - .then(({ product: productResp }) => { - product = productResp; - }); - }); - - it("should create metadata for product", () => { - cy.clearSessionData().loginUserViaRequest(); - updateMetadata(product.id, metadata.key, metadata.value); - updatePrivateMetadata(product.id, metadata.key, metadata.value) - .then(() => { - getProductMetadata({ - productId: product.id, - channelSlug: channel.slug, - auth: "auth", - withPrivateMetadata: true - }).its("data"); - }) - .then(({ product: productResp }) => { - expect(productResp.metadata[0].key).to.eq(metadata.key); - expect(productResp.metadata[0].value).to.eq(metadata.value); - expect(productResp.privateMetadata[0].key).to.eq(metadata.key); - expect(productResp.privateMetadata[0].value).to.eq(metadata.value); - getProductMetadata({ - productId: product.id, - channelSlug: channel.slug, - auth: "token", - withPrivateMetadata: true - }); - }) - .then(({ errors }) => { - expect(errors[0].extensions.exception.code).to.eq("PermissionDenied"); - getProductMetadata({ - productId: product.id, - channelSlug: channel.slug, - auth: "token", - withPrivateMetadata: false - }).its("data"); - }) - .then(({ product: productResp }) => { - expect(productResp.metadata[0].key).to.eq(metadata.key); - expect(productResp.metadata[0].value).to.eq(metadata.value); - }); - }); - it("should create metadata for order", () => { - let order; - cy.clearSessionData().loginUserViaRequest(); - createDraftOrder({ channelId: channel.id }) - .then(orderResp => { - order = orderResp; - updateMetadata(order.id, metadata.key, metadata.value); - updatePrivateMetadata(order.id, metadata.key, metadata.value); - }) - .then(() => { - getOrder(order.id); - }) - .then(orderResp => { - expect(orderResp.metadata[0].key).to.eq(metadata.key); - expect(orderResp.metadata[0].value).to.eq(metadata.value); - expect(orderResp.privateMetadata[0].key).to.eq(metadata.key); - expect(orderResp.privateMetadata[0].value).to.eq(metadata.value); - }); - }); -}); diff --git a/cypress/integration/allEnv/navigation.js b/cypress/integration/allEnv/navigation.js deleted file mode 100644 index f2661e044..000000000 --- a/cypress/integration/allEnv/navigation.js +++ /dev/null @@ -1,45 +0,0 @@ -import { PERMISSIONS_OPTIONS } from "../../Data/permissionsUsers"; -import * as permissionsSteps from "../../steps/permissions"; - -describe("Navigation for users with different permissions", () => { - Object.keys(PERMISSIONS_OPTIONS).forEach(key => { - it(`should navigate as an user with ${key} permission`, () => { - const permissionOption = PERMISSIONS_OPTIONS[key]; - const permissions = permissionOption.permissions; - cy.clearSessionData(); - permissionsSteps.navigateToAllAvailablePageAndCheckIfDisplayed( - permissionOption - ); - if (key === "all") { - return; - } - permissionsSteps - .getDisplayedSelectors() - .then(selectors => { - permissionsSteps.expectAllSelectorsPermitted(permissions, selectors); - }) - .then(() => { - if (!permissions) { - return; - } - permissions.forEach(permission => { - if (permission.parent) { - cy.get(permission.parent.parentMenuSelector) - .click() - .then(() => { - permissionsSteps.getDisplayedSelectors( - permission.parent.parentSelectors - ); - }) - .then(parentSelectors => { - permissionsSteps.expectAllSelectorsPermitted( - permissions, - parentSelectors - ); - }); - } - }); - }); - }); - }); -}); diff --git a/cypress/integration/allEnv/orders/channelsInDraftOrders.js b/cypress/integration/allEnv/orders/channelsInDraftOrders.js deleted file mode 100644 index 464e58303..000000000 --- a/cypress/integration/allEnv/orders/channelsInDraftOrders.js +++ /dev/null @@ -1,98 +0,0 @@ -// -import faker from "faker"; - -import { createChannel } from "../../../apiRequests/Channels"; -import { CHANNEL_FORM_SELECTORS } from "../../../elements/channels/channel-form-selectors"; -import { HEADER_SELECTORS } from "../../../elements/header/header-selectors"; -import { DRAFT_ORDER_SELECTORS } from "../../../elements/orders/draft-order-selectors"; -import { ORDERS_SELECTORS } from "../../../elements/orders/orders-selectors"; -import { - selectChannelInHeader, - selectChannelInPicker -} from "../../../steps/channelsSteps"; -import { urlList } from "../../../url/urlList"; -import * as channelsUtils from "../../../utils/channelsUtils"; - -describe("Channels in draft orders", () => { - const startsWith = "CyChannelInDraftOrders-"; - const randomName = startsWith + faker.datatype.number(); - - let defaultChannel; - let otherChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - channelsUtils.deleteChannelsStartsWith(startsWith); - channelsUtils - .getDefaultChannel() - .then(channel => { - defaultChannel = channel; - createChannel({ name: randomName }); - }) - .then(channelResp => { - otherChannel = channelResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("Draft order channel should be taken from global channel picker", () => { - let channelName; - cy.visit(urlList.homePage); - cy.getTextFromElement(HEADER_SELECTORS.channelSelect).then( - channelInHeader => { - channelName = channelInHeader; - } - ); - cy.visit(urlList.orders) - .get(ORDERS_SELECTORS.createOrder) - .click(); - cy.getTextFromElement(CHANNEL_FORM_SELECTORS.channelSelect).then( - selectedChannelName => { - expect(channelName).to.contains(selectedChannelName); - } - ); - cy.get(CHANNEL_FORM_SELECTORS.confirmButton).click(); - cy.getTextFromElement(DRAFT_ORDER_SELECTORS.salesChannel).then( - channelNameInDraftOrder => { - expect(channelName).to.contains(channelNameInDraftOrder); - } - ); - }); - it("Draft order channel should be taken from global channel picker when changed", () => { - cy.visit(urlList.homePage); - selectChannelInHeader(otherChannel.name); - cy.visit(urlList.orders); - cy.get(ORDERS_SELECTORS.createOrder).click(); - cy.getTextFromElement(CHANNEL_FORM_SELECTORS.channelSelect).then( - channelInSelect => { - expect(channelInSelect).to.be.eq(otherChannel.name); - } - ); - cy.get(CHANNEL_FORM_SELECTORS.confirmButton).click(); - cy.getTextFromElement(DRAFT_ORDER_SELECTORS.salesChannel).then( - channelInDraftOrder => { - expect(channelInDraftOrder).to.be.eq(otherChannel.name); - } - ); - }); - it("should create draft order with chosen channel", () => { - cy.visit(urlList.homePage); - selectChannelInHeader(defaultChannel.name); - cy.visit(urlList.orders); - cy.get(ORDERS_SELECTORS.createOrder).click(); - cy.getTextFromElement(CHANNEL_FORM_SELECTORS.channelSelect).then( - channelInSelect => { - expect(channelInSelect).to.be.eq(defaultChannel.name); - } - ); - selectChannelInPicker(otherChannel.name); - cy.getTextFromElement(DRAFT_ORDER_SELECTORS.salesChannel).then( - channelInDraftOrder => { - expect(channelInDraftOrder).to.be.eq(otherChannel.name); - } - ); - }); -}); diff --git a/cypress/integration/allEnv/orders/draftOrders.js b/cypress/integration/allEnv/orders/draftOrders.js deleted file mode 100644 index 32fe371e0..000000000 --- a/cypress/integration/allEnv/orders/draftOrders.js +++ /dev/null @@ -1,102 +0,0 @@ -// -import faker from "faker"; - -import { - createCustomer, - deleteCustomersStartsWith -} from "../../../apiRequests/Customer"; -import { DRAFT_ORDERS_LIST_SELECTORS } from "../../../elements/orders/draft-orders-list-selectors"; -import { ORDERS_SELECTORS } from "../../../elements/orders/orders-selectors"; -import { selectChannelInPicker } from "../../../steps/channelsSteps"; -import { finalizeDraftOrder } from "../../../steps/draftOrderSteps"; -import { urlList } from "../../../url/urlList"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import * as productsUtils from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Draft orders", () => { - const startsWith = "CyDraftOrders-"; - const randomName = startsWith + faker.datatype.number(); - - let defaultChannel; - let warehouse; - let address; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteCustomersStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - productsUtils.deleteProductsStartsWith(startsWith); - - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - }) - .then(() => { - cy.fixture("addresses"); - }) - .then(addresses => { - address = addresses.plAddress; - createCustomer( - `${randomName}@example.com`, - randomName, - addresses.plAddress, - true - ); - createShipping({ - channelId: defaultChannel.id, - name: randomName, - address: addresses.plAddress - }); - }) - .then(({ warehouse: warehouseResp }) => { - warehouse = warehouseResp; - productsUtils.createTypeAttributeAndCategoryForProduct(randomName); - }) - .then( - ({ - productType: productTypeResp, - attribute: attributeResp, - category: categoryResp - }) => { - productsUtils.createProductInChannel({ - name: randomName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productTypeResp.id, - attributeId: attributeResp.id, - categoryId: categoryResp.id - }); - } - ); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should move draft order to orders", () => { - cy.visit(urlList.orders); - cy.softExpectSkeletonIsVisible(); - cy.get(ORDERS_SELECTORS.createOrder).click(); - selectChannelInPicker(defaultChannel.name); - finalizeDraftOrder(randomName, address).then(draftOrderNumber => { - cy.visit(urlList.orders); - cy.contains(ORDERS_SELECTORS.orderRow, draftOrderNumber).should( - $order => { - expect($order).to.be.visible; - } - ); - cy.visit(urlList.draftOrders); - cy.contains( - DRAFT_ORDERS_LIST_SELECTORS.draftOrderRow, - draftOrderNumber - ).should($draftOrder => { - expect($draftOrder).to.not.exist; - }); - }); - }); -}); diff --git a/cypress/integration/allEnv/orders/orders.js b/cypress/integration/allEnv/orders/orders.js deleted file mode 100644 index f48417c4b..000000000 --- a/cypress/integration/allEnv/orders/orders.js +++ /dev/null @@ -1,200 +0,0 @@ -// -import faker from "faker"; - -import { - createCustomer, - deleteCustomersStartsWith -} from "../../../apiRequests/Customer"; -import { getOrder } from "../../../apiRequests/Order"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { ORDER_REFUND } from "../../../elements/orders/order-refund"; -import { ORDERS_SELECTORS } from "../../../elements/orders/orders-selectors"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; -import { selectChannelInPicker } from "../../../steps/channelsSteps"; -import { finalizeDraftOrder } from "../../../steps/draftOrderSteps"; -import { fillAutocompleteSelect } from "../../../steps/shared/selects"; -import { urlList } from "../../../url/urlList"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import { - createFulfilledOrder, - createOrder, - createReadyToFulfillOrder -} from "../../../utils/ordersUtils"; -import * as productsUtils from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Orders", () => { - const startsWith = "CyOrders-"; - const randomName = startsWith + faker.datatype.number(); - - let customer; - let defaultChannel; - let warehouse; - let shippingMethod; - let variantsList; - let address; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteCustomersStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - productsUtils.deleteProductsStartsWith(startsWith); - - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - }) - .then(() => { - cy.fixture("addresses"); - }) - .then(addresses => { - address = addresses.plAddress; - createCustomer(`${randomName}@example.com`, randomName, address, true); - }) - .then(customerResp => { - customer = customerResp.body.data.customerCreate.user; - createShipping({ - channelId: defaultChannel.id, - name: randomName, - address - }); - }) - .then( - ({ warehouse: warehouseResp, shippingMethod: shippingMethodResp }) => { - shippingMethod = shippingMethodResp; - warehouse = warehouseResp; - productsUtils.createTypeAttributeAndCategoryForProduct(randomName); - } - ) - .then( - ({ - productType: productTypeResp, - attribute: attributeResp, - category: categoryResp - }) => { - productsUtils.createProductInChannel({ - name: randomName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productTypeResp.id, - attributeId: attributeResp.id, - categoryId: categoryResp.id - }); - } - ) - .then(({ variantsList: variantsResp }) => { - variantsList = variantsResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.order - ); - }); - - it("should create order with selected channel", () => { - // Remove login as admin after fixing SALEOR-3154 - cy.clearSessionData().loginUserViaRequest(); - cy.visit(urlList.orders) - .get(ORDERS_SELECTORS.createOrder) - .click(); - selectChannelInPicker(defaultChannel.name); - finalizeDraftOrder(randomName, address).then(draftOrderNumber => { - cy.visit(urlList.orders); - cy.contains(ORDERS_SELECTORS.orderRow, draftOrderNumber).click(); - cy.contains(ORDERS_SELECTORS.salesChannel, defaultChannel.name).should( - "be.visible" - ); - }); - }); - - // This test will pass after fixing SALEOR-3154 - it("should not be possible to change channel in order", () => { - createOrder({ - customerId: customer.id, - channelId: defaultChannel.id, - shippingMethodId: shippingMethod.id, - variantsList, - address - }).then(order => { - cy.visit(urlList.orders); - cy.contains(ORDERS_SELECTORS.orderRow, order.number).click(); - cy.get(ORDERS_SELECTORS.salesChannel) - .find("[button]") - .should("not.exist"); - }); - }); - - it("should cancel fulfillment", () => { - let order; - createFulfilledOrder({ - customerId: customer.id, - channelId: defaultChannel.id, - shippingMethodId: shippingMethod.id, - variantsList, - address, - warehouse: warehouse.id - }) - .then(({ order: orderResp }) => { - order = orderResp; - cy.visit(urlList.orders); - cy.softExpectSkeletonIsVisible(); - cy.contains(ORDERS_SELECTORS.orderRow, order.number).click(); - cy.get(SHARED_ELEMENTS.skeleton) - .should("not.exist") - .get(ORDERS_SELECTORS.orderFulfillmentFrame) - .find(BUTTON_SELECTORS.showMoreButton) - .click() - .get(ORDERS_SELECTORS.cancelFulfillment) - .click(); - }) - .then(() => { - fillAutocompleteSelect( - ORDERS_SELECTORS.cancelFulfillmentSelectField, - warehouse.name - ); - cy.addAliasToGraphRequest("OrderFulfillmentCancel"); - cy.get(BUTTON_SELECTORS.submit).click(); - cy.wait("@OrderFulfillmentCancel"); - getOrder(order.id); - }) - .then(orderResp => { - expect(orderResp.status).to.be.eq("UNFULFILLED"); - }); - }); - - it("should make a refund", () => { - let order; - createReadyToFulfillOrder({ - customerId: customer.id, - channelId: defaultChannel.id, - shippingMethodId: shippingMethod.id, - variantsList, - address - }) - .then(({ order: orderResp }) => { - order = orderResp; - cy.visit(urlList.orders); - cy.softExpectSkeletonIsVisible(); - cy.contains(ORDERS_SELECTORS.orderRow, order.number).click(); - cy.get(ORDERS_SELECTORS.refundButton) - .click() - .get(ORDER_REFUND.productsQuantityInput) - .type("1") - .addAliasToGraphRequest("OrderFulfillmentRefundProducts"); - cy.get(BUTTON_SELECTORS.submit) - .click() - .wait("@OrderFulfillmentRefundProducts"); - getOrder(order.id); - }) - .then(orderResp => { - expect(orderResp.paymentStatus).to.be.eq("FULLY_REFUNDED"); - }); - }); -}); diff --git a/cypress/integration/allEnv/pages/pageTypes.js b/cypress/integration/allEnv/pages/pageTypes.js deleted file mode 100644 index 9756f667a..000000000 --- a/cypress/integration/allEnv/pages/pageTypes.js +++ /dev/null @@ -1,61 +0,0 @@ -import faker from "faker"; - -import { createAttribute } from "../../../apiRequests/Attribute"; -import { createPageType, getPageType } from "../../../apiRequests/PageTypes"; -import { PAGE_TYPE_DETAILS } from "../../../elements/pageTypes/pageTypeDetails"; -import { PAGE_TYPES_LIST } from "../../../elements/pageTypes/pageTypesList"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; -import { assignElements } from "../../../steps/shared/assignElements"; -import { confirmationMessageShouldDisappear } from "../../../steps/shared/confirmationMessage"; -import { pageTypeDetailsUrl, urlList } from "../../../url/urlList"; - -describe("Tests for page types", () => { - const startsWith = "PageTypes"; - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create page type", () => { - const randomName = startsWith + faker.datatype.number(); - - cy.visit(urlList.pageTypes) - .get(PAGE_TYPES_LIST.createPageTypeButton) - .click() - .get(PAGE_TYPE_DETAILS.nameInput) - .type(randomName) - .addAliasToGraphRequest("PageTypeCreate") - .get(BUTTON_SELECTORS.confirm) - .click(); - confirmationMessageShouldDisappear(); - cy.wait("@PageTypeCreate") - .its("response.body.data.pageTypeCreate.pageType") - .then(pageType => { - getPageType(pageType.id); - }) - .then(pageType => { - expect(pageType.name).to.eq(randomName); - }); - }); - - it("should assign attribute", () => { - const randomName = startsWith + faker.datatype.number(); - - createAttribute({ name: randomName, type: "PAGE_TYPE" }); - createPageType(randomName) - .then(({ pageType }) => { - cy.visit(pageTypeDetailsUrl(pageType.id)) - .get(SHARED_ELEMENTS.progressBar) - .should("be.not.visible") - .get(PAGE_TYPE_DETAILS.assignAttributesButton) - .click(); - assignElements(randomName, false); - confirmationMessageShouldDisappear(); - getPageType(pageType.id); - }) - .then(pageType => { - expect(pageType.attributes[0].name).to.eq(randomName); - }); - }); -}); diff --git a/cypress/integration/allEnv/productTypes/purchaseWithProductTypes.js b/cypress/integration/allEnv/productTypes/purchaseWithProductTypes.js deleted file mode 100644 index e4efdba83..000000000 --- a/cypress/integration/allEnv/productTypes/purchaseWithProductTypes.js +++ /dev/null @@ -1,233 +0,0 @@ -import faker from "faker"; - -import { createAttribute } from "../../../apiRequests/Attribute"; -import { createCategory } from "../../../apiRequests/Category"; -import { - checkoutShippingAddressUpdate, - checkoutShippingMethodUpdate, - checkoutVariantsUpdate, - completeCheckout, - createCheckout -} from "../../../apiRequests/Checkout"; -import { getOrder } from "../../../apiRequests/Order"; -import { createTypeProduct } from "../../../apiRequests/productType"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import { - addPayment, - createAndCompleteCheckoutWithoutShipping, - createWaitingForCaptureOrder -} from "../../../utils/ordersUtils"; -import { - createProductInChannel, - deleteProductsStartsWith -} from "../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../utils/shippingUtils"; - -describe("Purchase products with all products types", () => { - const startsWith = `CyPurchaseByType`; - const name = `${startsWith}${faker.datatype.number()}`; - const email = `${startsWith}@example.com`; - const testsMessage = "Check order status"; - const { softExpect } = chai; - - let defaultChannel; - let address; - let warehouse; - let attribute; - let category; - let shippingMethod; - let createProductData; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteProductsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - getDefaultChannel().then(channelResp => (defaultChannel = channelResp)); - cy.fixture("addresses") - .then(addresses => { - address = addresses.usAddress; - createShipping({ - channelId: defaultChannel.id, - name, - address, - price: 10 - }); - }) - .then( - ({ warehouse: warehouseResp, shippingMethod: shippingMethodResp }) => { - warehouse = warehouseResp; - shippingMethod = shippingMethodResp; - } - ); - createAttribute({ name }) - .then(attributeResp => { - attribute = attributeResp; - createCategory(name); - }) - .then(categoryResp => { - category = categoryResp; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - createProductData = { - channelId: defaultChannel.id, - warehouseId: warehouse.id, - quantityInWarehouse: 10, - attributeId: attribute.id, - categoryId: category.id, - price: 10 - }; - }); - - it("should purchase digital product", () => { - const digitalName = `${startsWith}${faker.datatype.number()}`; - createTypeProduct({ - name: digitalName, - attributeId: attribute.id, - shippable: false - }) - .then(productType => { - createProductData.name = digitalName; - createProductData.productTypeId = productType.id; - createProductInChannel(createProductData); - }) - .then(({ variantsList }) => { - createAndCompleteCheckoutWithoutShipping({ - channelSlug: defaultChannel.slug, - email, - billingAddress: address, - variantsList, - auth: "token" - }); - }) - .then(({ order }) => { - getOrder(order.id); - }) - .then(order => { - softExpect( - order.isShippingRequired, - "Check if is shipping required in order" - ).to.eq(false); - expect(order.status, testsMessage).to.be.eq("UNFULFILLED"); - }); - }); - - it("should purchase physical product", () => { - const physicalName = `${startsWith}${faker.datatype.number()}`; - createTypeProduct({ - name: physicalName, - attributeId: attribute.id, - shippable: true - }) - .then(productType => { - createProductData.name = physicalName; - createProductData.productTypeId = productType.id; - createProductInChannel(createProductData); - }) - .then(({ variantsList }) => { - createWaitingForCaptureOrder({ - channelSlug: defaultChannel.slug, - email, - variantsList, - shippingMethodId: shippingMethod.id, - address - }); - }) - .then(({ order }) => { - getOrder(order.id); - }) - .then(order => { - softExpect( - order.isShippingRequired, - "Check if is shipping required in order" - ).to.eq(true); - expect(order.status, testsMessage).to.be.eq("UNFULFILLED"); - }); - }); - it("should purchase multiple products with all product types", () => { - const physicalName = `${startsWith}${faker.datatype.number()}`; - const digitalName = `${startsWith}${faker.datatype.number()}`; - let digitalProductVariantsList; - let checkout; - createTypeProduct({ - name: digitalName, - attributeId: attribute.id, - shippable: false - }) - .then(productType => { - createProductData.name = digitalName; - createProductData.productTypeId = productType.id; - createProductInChannel(createProductData); - }) - .then(({ variantsList }) => { - digitalProductVariantsList = variantsList; - createCheckout({ - channelSlug: defaultChannel.slug, - email, - variantsList: digitalProductVariantsList, - billingAddress: address, - auth: "token" - }); - }) - .then(({ checkout: checkoutResp }) => { - checkout = checkoutResp; - addPayment(checkout.id); - }) - .then(() => { - createTypeProduct({ - name: physicalName, - attributeId: attribute.id, - shippable: true - }); - }) - .then(productType => { - createProductData.name = physicalName; - createProductData.productTypeId = productType.id; - createProductInChannel(createProductData); - }) - .then(({ variantsList }) => { - checkoutVariantsUpdate(checkout.id, variantsList); - }) - .then(() => { - checkoutShippingMethodUpdate(checkout.id, shippingMethod.id); - }) - .then(({ checkoutErrors }) => { - expect( - checkoutErrors, - "Should be not possible to add shipping method without shipping address" - ).to.have.lengthOf(1); - checkoutShippingAddressUpdate(checkout.id, address); - }) - .then(() => { - addPayment(checkout.id); - }) - .then(({ paymentErrors }) => { - expect( - paymentErrors, - "Should be not possible to add payment without shipping" - ).to.have.lengthOf(1); - checkoutShippingMethodUpdate(checkout.id, shippingMethod.id); - }) - .then(() => { - addPayment(checkout.id); - }) - .then(() => { - completeCheckout(checkout.id); - }) - .then(({ order }) => { - getOrder(order.id); - }) - .then(order => { - softExpect( - order.isShippingRequired, - "Check if is shipping required in order" - ).to.eq(true); - expect(order.status, testsMessage).to.be.eq("UNFULFILLED"); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/createProduct.js b/cypress/integration/allEnv/products/createProduct.js deleted file mode 100644 index c1b7a8ff4..000000000 --- a/cypress/integration/allEnv/products/createProduct.js +++ /dev/null @@ -1,141 +0,0 @@ -// -import faker from "faker"; - -import { createAttribute } from "../../../apiRequests/Attribute"; -import { createTypeProduct } from "../../../apiRequests/productType"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { PRODUCT_DETAILS } from "../../../elements/catalog/products/product-details"; -import { PRODUCTS_LIST } from "../../../elements/catalog/products/products-list"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; -import { metadataForms } from "../../../steps/catalog/metadataSteps"; -import { - fillUpPriceList, - priceInputLists -} from "../../../steps/catalog/products/priceList"; -import { fillUpCommonFieldsForAllProductTypes } from "../../../steps/catalog/products/productSteps"; -import { selectChannelInDetailsPages } from "../../../steps/channelsSteps"; -import { urlList } from "../../../url/urlList"; -import { - expectCorrectProductInformation, - expectCorrectProductVariantInformation -} from "../../../utils/products/checkProductInfo"; -import * as productUtils from "../../../utils/products/productsUtils"; - -describe("Create product", () => { - const startsWith = "CyCreateProduct-"; - const name = `${startsWith}${faker.datatype.number()}`; - const generalInfo = { - name: `${startsWith}${faker.datatype.number()}`, - description: faker.lorem.sentence(), - rating: 2 - }; - const seo = { - title: "testTitle", - description: generalInfo.description - }; - const metadata = { - public: { - metadataForm: metadataForms.public, - name: "metadataName", - value: "metadataValue" - }, - private: { - metadataForm: metadataForms.private, - name: "privateMetadataName", - value: "privateMetadataValue" - } - }; - let attribute; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productUtils.deleteProductsStartsWith(startsWith); - createAttribute({ name }).then(attributeResp => { - attribute = attributeResp; - }); - }); - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should create product with variants", () => { - const randomName = `${startsWith}${faker.datatype.number()}`; - seo.slug = randomName; - const productData = { - generalInfo, - seo, - metadata, - productOrganization: { productType: randomName }, - attribute - }; - createTpeAndFillUpProductFields(randomName, true, productData).then( - productOrgResp => (productData.productOrganization = productOrgResp) - ); - cy.addAliasToGraphRequest("ProductDetails"); - cy.get(BUTTON_SELECTORS.confirm).click(); - cy.wait("@ProductDetails"); - cy.get(SHARED_ELEMENTS.confirmationMsg).should("be.visible"); - cy.get("@ProductDetails") - .its("response.body") - .then(resp => { - const productResp = resp.find(element => element.data.product).data - .product; - expectCorrectProductInformation(productResp, productData); - }); - }); - - it("should create product without variants", () => { - const prices = { sellingPrice: 6, costPrice: 3 }; - const randomName = `${startsWith}${faker.datatype.number()}`; - seo.slug = randomName; - const productData = { - generalInfo, - seo, - metadata, - productOrganization: { productType: randomName }, - attribute - }; - createTpeAndFillUpProductFields(randomName, false, productData).then( - productOrgResp => (productData.productOrganization = productOrgResp) - ); - selectChannelInDetailsPages(); - fillUpPriceList(prices.sellingPrice); - fillUpPriceList(prices.costPrice, priceInputLists.costPrice); - cy.get(PRODUCT_DETAILS.skuInput).type(randomName); - cy.addAliasToGraphRequest("ProductDetails"); - cy.get(BUTTON_SELECTORS.confirm).click(); - cy.wait("@ProductDetails"); - cy.get(SHARED_ELEMENTS.confirmationMsg).should("be.visible"); - cy.get("@ProductDetails") - .its("response.body") - .then(resp => { - const productResp = resp.find(element => element.data.product).data - .product; - expectCorrectProductInformation(productResp, productData); - expectCorrectProductVariantInformation( - productResp.variants, - randomName, - prices - ); - }); - }); - - function createTpeAndFillUpProductFields( - randomName, - hasVariants, - productData - ) { - createTypeProduct({ - name: randomName, - attributeId: attribute.id, - hasVariants - }); - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.product) - .visit(urlList.products) - .get(PRODUCTS_LIST.createProductBtn) - .click(); - return fillUpCommonFieldsForAllProductTypes(productData); - } -}); diff --git a/cypress/integration/allEnv/products/menageProducts/availableForPurchaseProducts.js b/cypress/integration/allEnv/products/menageProducts/availableForPurchaseProducts.js deleted file mode 100644 index 83827b268..000000000 --- a/cypress/integration/allEnv/products/menageProducts/availableForPurchaseProducts.js +++ /dev/null @@ -1,117 +0,0 @@ -import faker from "faker"; - -import { getProductDetails } from "../../../../apiRequests/storeFront/ProductDetails"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { updateProductIsAvailableForPurchase } from "../../../../steps/catalog/products/productSteps"; -import { productDetailsUrl } from "../../../../url/urlList"; -import { getDefaultChannel } from "../../../../utils/channelsUtils"; -import * as productsUtils from "../../../../utils/products/productsUtils"; -import * as shippingUtils from "../../../../utils/shippingUtils"; -import { isProductAvailableForPurchase } from "../../../../utils/storeFront/storeFrontProductUtils"; - -// -describe("Products available in listings", () => { - const startsWith = "CyAvailForPurchase-"; - const name = `${startsWith}${faker.datatype.number()}`; - let productType; - let attribute; - let category; - let defaultChannel; - let warehouse; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - shippingUtils.deleteShippingStartsWith(startsWith); - productsUtils.deleteProductsStartsWith(startsWith); - - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(addressesFixture => { - shippingUtils.createShipping({ - channelId: defaultChannel.id, - name, - address: addressesFixture.plAddress - }); - }) - .then(({ warehouse: warehouseResp }) => { - warehouse = warehouseResp; - }); - - productsUtils - .createTypeAttributeAndCategoryForProduct(name) - .then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - productType = productTypeResp; - attribute = attributeResp; - category = categoryResp; - } - ); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.product - ); - }); - - it("should update product to available for purchase", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - let product; - - productsUtils - .createProductInChannel({ - name: productName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - isAvailableForPurchase: false - }) - .then(({ product: productResp }) => { - product = productResp; - const productUrl = productDetailsUrl(product.id); - updateProductIsAvailableForPurchase(productUrl, true); - }) - .then(() => { - getProductDetails(product.id, defaultChannel.slug); - }) - .then(resp => { - expect(isProductAvailableForPurchase(resp)).to.be.eq(true); - }); - }); - - it("should update product to not available for purchase", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - let product; - - productsUtils - .createProductInChannel({ - name: productName, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }) - .then(({ product: productResp }) => { - product = productResp; - const productUrl = productDetailsUrl(product.id); - updateProductIsAvailableForPurchase(productUrl, false); - }) - .then(() => { - getProductDetails(product.id, defaultChannel.slug); - }) - .then(resp => { - expect(isProductAvailableForPurchase(resp)).to.be.eq(false); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/menageProducts/publishedProducts.js b/cypress/integration/allEnv/products/menageProducts/publishedProducts.js deleted file mode 100644 index 20fd5d468..000000000 --- a/cypress/integration/allEnv/products/menageProducts/publishedProducts.js +++ /dev/null @@ -1,105 +0,0 @@ -import faker from "faker"; - -import { getProductDetails } from "../../../../apiRequests/storeFront/ProductDetails"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { updateProductPublish } from "../../../../steps/catalog/products/productSteps"; -import { productDetailsUrl } from "../../../../url/urlList"; -import { getDefaultChannel } from "../../../../utils/channelsUtils"; -import * as productsUtils from "../../../../utils/products/productsUtils"; -import { isProductVisible } from "../../../../utils/storeFront/storeFrontProductUtils"; - -// -describe("Published products", () => { - const startsWith = "CyPublishedProducts-"; - const name = `${startsWith}${faker.datatype.number()}`; - let productType; - let attribute; - let category; - let defaultChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productsUtils.deleteProductsStartsWith(startsWith); - productsUtils - .createTypeAttributeAndCategoryForProduct(name) - .then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - productType = productTypeResp; - attribute = attributeResp; - category = categoryResp; - getDefaultChannel(); - } - ) - .then(channel => { - defaultChannel = channel; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.product - ); - }); - - it("should update product to published", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - - productsUtils - .createProductInChannel({ - name: productName, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - isPublished: false, - isAvailableForPurchase: false - }) - .then(({ product: productResp }) => { - const product = productResp; - const productUrl = productDetailsUrl(product.id); - updateProductPublish(productUrl, true); - getProductDetails(product.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isProductVisible(resp, productName); - expect(isVisible).to.be.eq(true); - }); - }); - - it("should update product to not published", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - let product; - - productsUtils - .createProductInChannel({ - name: productName, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }) - .then(({ product: productResp }) => { - product = productResp; - const productUrl = productDetailsUrl(product.id); - updateProductPublish(productUrl, false); - getProductDetails(product.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isProductVisible(resp, productName); - expect(isVisible).to.be.eq(false); - cy.loginInShop(); - }) - .then(() => { - getProductDetails(product.id, defaultChannel.slug); - }) - .then(resp => { - const isVisible = isProductVisible(resp, productName); - expect(isVisible).to.be.eq(true); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/menageProducts/visibleInListingsProducts.js b/cypress/integration/allEnv/products/menageProducts/visibleInListingsProducts.js deleted file mode 100644 index 188daeaef..000000000 --- a/cypress/integration/allEnv/products/menageProducts/visibleInListingsProducts.js +++ /dev/null @@ -1,114 +0,0 @@ -import faker from "faker"; - -import { searchInShop } from "../../../../apiRequests/storeFront/Search"; -import { ONE_PERMISSION_USERS } from "../../../../Data/users"; -import { updateProductVisibleInListings } from "../../../../steps/catalog/products/productSteps"; -import { productDetailsUrl } from "../../../../url/urlList"; -import { getDefaultChannel } from "../../../../utils/channelsUtils"; -import * as productsUtils from "../../../../utils/products/productsUtils"; -import { isProductVisibleInSearchResult } from "../../../../utils/storeFront/storeFrontProductUtils"; - -// -describe("Products displayed in listings", () => { - const startsWith = "CyVisibleInListings-"; - const name = `${startsWith}${faker.datatype.number()}`; - let productType; - let attribute; - let category; - let defaultChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - productsUtils.deleteProductsStartsWith(startsWith); - productsUtils - .createTypeAttributeAndCategoryForProduct(name) - .then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - productType = productTypeResp; - attribute = attributeResp; - category = categoryResp; - getDefaultChannel(); - } - ) - .then(channel => { - defaultChannel = channel; - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.product - ); - }); - - it("should update product to visible in listings", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - - productsUtils - .createProductInChannel({ - name: productName, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - visibleInListings: false, - isAvailableForPurchase: false - }) - .then(({ product: productResp }) => { - const product = productResp; - const productUrl = productDetailsUrl(product.id); - updateProductVisibleInListings(productUrl); - searchInShop(productName); - }) - .then(resp => { - const isProductVisible = isProductVisibleInSearchResult( - resp, - productName - ); - expect(isProductVisible).to.be.eq(true); - }); - }); - - it("should update product to not visible in listings", () => { - const productName = `${startsWith}${faker.datatype.number()}`; - - productsUtils - .createProductInChannel({ - name: productName, - channelId: defaultChannel.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - visibleInListings: true - }) - .then(({ product: productResp }) => { - const product = productResp; - const productUrl = productDetailsUrl(product.id); - updateProductVisibleInListings(productUrl); - - searchInShop(productName).then(resp => { - const isProductVisible = isProductVisibleInSearchResult( - resp, - productName - ); - expect(isProductVisible).to.be.eq(false); - }); - cy.loginInShop(); - }) - .then(() => { - searchInShop(productName); - }) - .then(resp => { - const isProductVisible = isProductVisibleInSearchResult( - resp, - productName - ); - expect(isProductVisible).to.be.eq(true); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/productsList/filteringProducts.js b/cypress/integration/allEnv/products/productsList/filteringProducts.js deleted file mode 100644 index 6d8190e31..000000000 --- a/cypress/integration/allEnv/products/productsList/filteringProducts.js +++ /dev/null @@ -1,120 +0,0 @@ -import faker from "faker"; - -import { createCollection } from "../../../../apiRequests/Collections"; -import { updateProduct } from "../../../../apiRequests/Product"; -import { PRODUCTS_LIST } from "../../../../elements/catalog/products/products-list"; -import { - selectChannel, - selectFilterOption, - selectProductsOutOfStock -} from "../../../../steps/catalog/products/productsListSteps"; -import { waitForProgressBarToNotExist } from "../../../../steps/shared/progressBar"; -import { urlList } from "../../../../url/urlList"; -import { getDefaultChannel } from "../../../../utils/channelsUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../../../utils/shippingUtils"; - -describe("Filtering products", () => { - const startsWith = "CyFilterProducts-"; - const name = `${startsWith}${faker.datatype.number()}`; - const stockQuantity = 747; - const price = 342; - let attribute; - let productType; - let category; - let warehouse; - let channel; - let collection; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteShippingStartsWith(startsWith); - deleteProductsStartsWith(startsWith); - createTypeAttributeAndCategoryForProduct(name).then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - attribute = attributeResp; - productType = productTypeResp; - category = categoryResp; - } - ); - createCollection(name).then( - collectionResp => (collection = collectionResp) - ); - getDefaultChannel() - .then(channelResp => { - channel = channelResp; - cy.fixture("addresses"); - }) - .then(addresses => { - createShipping({ - channelId: channel.id, - name, - address: addresses.plAddress - }); - }) - .then(({ warehouse: warehouseResp }) => { - warehouse = warehouseResp; - createProductInChannel({ - name, - channelId: channel.id, - warehouseId: warehouse.id, - quantityInWarehouse: stockQuantity, - price, - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id - }); - }) - .then(({ product: product }) => { - updateProduct(product.id, { collections: [collection.id] }); - }); - }); - beforeEach(() => { - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.products); - }); - const filterProductsBy = ["category", "collection", "productType"]; - filterProductsBy.forEach(filterBy => { - it(`should filter products by ${filterBy}`, () => { - cy.softExpectSkeletonIsVisible(); - waitForProgressBarToNotExist(); - selectFilterOption(filterBy, name); - cy.getTextFromElement(PRODUCTS_LIST.productsNames).then(product => { - expect(product).to.includes(name); - }); - }); - }); - - it("should filter products out of stock", () => { - cy.softExpectSkeletonIsVisible(); - const productOutOfStock = `${startsWith}${faker.datatype.number()}`; - createProductInChannel({ - name: productOutOfStock, - channelId: channel.id, - warehouseId: warehouse.id, - quantityInWarehouse: 0, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id, - price - }); - waitForProgressBarToNotExist(); - selectChannel(channel.slug); - selectProductsOutOfStock(); - cy.getTextFromElement(PRODUCTS_LIST.productsNames).then(product => { - expect(product).to.includes(productOutOfStock); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/productsList/pagination.js b/cypress/integration/allEnv/products/productsList/pagination.js deleted file mode 100644 index 2f8fc137e..000000000 --- a/cypress/integration/allEnv/products/productsList/pagination.js +++ /dev/null @@ -1,61 +0,0 @@ -import { PRODUCTS_LIST } from "../../../../elements/catalog/products/products-list"; -import { BUTTON_SELECTORS } from "../../../../elements/shared/button-selectors"; -import { - getDisplayedColumnArray, - isNumberOfProductsSameAsInSelectResultsOnPage -} from "../../../../steps/catalog/products/productsListSteps"; -import { waitForProgressBarToNotExist } from "../../../../steps/shared/progressBar"; -import { urlList } from "../../../../url/urlList"; - -describe("Products", () => { - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - cy.visit(urlList.products); - }); - it("Should go to the next page", () => { - cy.softExpectSkeletonIsVisible(); - cy.get(PRODUCTS_LIST.productsList) - .should("be.visible") - .get(PRODUCTS_LIST.emptyProductRow) - .should("not.exist") - .get(PRODUCTS_LIST.previousPagePagination) - .should("be.disabled"); - let firstPageProducts; - getDisplayedColumnArray("name").then( - productsList => (firstPageProducts = productsList) - ); - cy.addAliasToGraphRequest("ProductList"); - cy.get(PRODUCTS_LIST.nextPageButton).click(); - waitForProgressBarToNotExist(); - cy.wait("@ProductList"); - getDisplayedColumnArray("name").then(productList => { - expect(productList).to.not.equal(firstPageProducts); - }); - cy.get(PRODUCTS_LIST.previousPagePagination).then($button => { - expect($button).to.be.enabled; - }); - }); - it("should displayed correct number of results per page", () => { - cy.softExpectSkeletonIsVisible(); - isNumberOfProductsSameAsInSelectResultsOnPage().then( - isTheSame => - expect(isTheSame, "check if number of displayed products is correct").to - .be.true - ); - cy.get(PRODUCTS_LIST.resultsOnPageSelect) - .click() - .get( - `${PRODUCTS_LIST.rowNumberOption}${BUTTON_SELECTORS.notSelectedOption}` - ) - .first() - .click(); - waitForProgressBarToNotExist(); - isNumberOfProductsSameAsInSelectResultsOnPage().then( - isTheSame => - expect( - isTheSame, - "check if number of displayed products is correct, after changing results number in table footer" - ).to.be.true - ); - }); -}); diff --git a/cypress/integration/allEnv/products/productsList/sortingProducts.js b/cypress/integration/allEnv/products/productsList/sortingProducts.js deleted file mode 100644 index 8086bc568..000000000 --- a/cypress/integration/allEnv/products/productsList/sortingProducts.js +++ /dev/null @@ -1,28 +0,0 @@ -import { PRODUCTS_LIST } from "../../../../elements/catalog/products/products-list"; -import { SHARED_ELEMENTS } from "../../../../elements/shared/sharedElements"; -import { waitForProgressBarToNotExist } from "../../../../steps/shared/progressBar"; -import { urlList } from "../../../../url/urlList"; -import { expectProductsSortedBy } from "../../../../utils/products/productsListUtils"; - -describe("Sorting products", () => { - const sortByList = ["name", "type"]; - sortByList.forEach(sortBy => { - it(`Sorting by ${sortBy}`, () => { - cy.clearSessionData() - .loginUserViaRequest() - .visit(urlList.products); - cy.softExpectSkeletonIsVisible(); - cy.get(SHARED_ELEMENTS.header).should("be.visible"); - if (sortBy !== "name") { - cy.get(PRODUCTS_LIST.tableHeaders[sortBy]).click(); - waitForProgressBarToNotExist(); - } - expectProductsSortedBy(sortBy); - cy.addAliasToGraphRequest("ProductList") - .get(PRODUCTS_LIST.tableHeaders[sortBy]) - .click(); - waitForProgressBarToNotExist().wait("@ProductList"); - expectProductsSortedBy(sortBy, false); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/productsVariants.js b/cypress/integration/allEnv/products/productsVariants.js deleted file mode 100644 index 4ce1e868b..000000000 --- a/cypress/integration/allEnv/products/productsVariants.js +++ /dev/null @@ -1,206 +0,0 @@ -import faker from "faker"; - -import { createChannel } from "../../../apiRequests/Channels"; -import { - createProduct, - updateChannelInProduct -} from "../../../apiRequests/Product"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { - createFirstVariant, - createVariant, - variantsShouldBeVisible -} from "../../../steps/catalog/products/VariantsSteps"; -import { selectChannelInHeader } from "../../../steps/channelsSteps"; -import { urlList } from "../../../url/urlList"; -import { - deleteChannelsStartsWith, - getDefaultChannel -} from "../../../utils/channelsUtils"; -import * as productUtils from "../../../utils/products/productsUtils"; -import * as shippingUtils from "../../../utils/shippingUtils"; -import { getProductVariants } from "../../../utils/storeFront/storeFrontProductUtils"; - -// -describe("Creating variants", () => { - const startsWith = "CyCreateVariants-"; - const attributeValues = ["value1", "value2"]; - - let defaultChannel; - let warehouse; - let attribute; - let productType; - let category; - let newChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - shippingUtils.deleteShippingStartsWith(startsWith); - productUtils.deleteProductsStartsWith(startsWith); - deleteChannelsStartsWith(startsWith); - - const name = `${startsWith}${faker.datatype.number()}`; - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - cy.fixture("addresses"); - }) - .then(fixtureAddresses => - shippingUtils.createShipping({ - channelId: defaultChannel.id, - name, - address: fixtureAddresses.plAddress - }) - ) - .then(({ warehouse: warehouseResp }) => { - warehouse = warehouseResp; - createChannel({ isActive: true, name, currencyCode: "PLN" }); - }) - .then(resp => (newChannel = resp)); - - productUtils - .createTypeAttributeAndCategoryForProduct(name, attributeValues) - .then( - ({ - attribute: attributeResp, - productType: productTypeResp, - category: categoryResp - }) => { - attribute = attributeResp; - productType = productTypeResp; - category = categoryResp; - } - ); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest( - "auth", - ONE_PERMISSION_USERS.product - ); - }); - - it("should create variant visible on frontend", () => { - const name = `${startsWith}${faker.datatype.number()}`; - const price = 10; - let createdProduct; - - createProduct({ - attributeId: attribute.id, - name, - productTypeId: productType.id, - categoryId: category.id - }) - .then(resp => { - createdProduct = resp; - updateChannelInProduct({ - productId: createdProduct.id, - channelId: defaultChannel.id - }); - cy.visit(`${urlList.products}${createdProduct.id}`); - createFirstVariant({ - sku: name, - warehouseId: warehouse.id, - price, - attribute: attributeValues[0] - }); - selectChannelInHeader(defaultChannel.name); - variantsShouldBeVisible({ name, price }); - getProductVariants(createdProduct.id, defaultChannel.slug); - }) - .then(([variant]) => { - expect(variant).to.have.property("name", attributeValues[0]); - expect(variant).to.have.property("price", price); - }); - }); - - it("should create several variants", () => { - const name = `${startsWith}${faker.datatype.number()}`; - const secondVariantSku = `${startsWith}${faker.datatype.number()}`; - const variants = [{ price: 7 }, { name: attributeValues[1], price: 16 }]; - let createdProduct; - - productUtils - .createProductInChannel({ - name, - attributeId: attribute.id, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - categoryId: category.id, - price: variants[0].price - }) - .then(({ product: productResp }) => { - createdProduct = productResp; - cy.visit(`${urlList.products}${createdProduct.id}`); - createVariant({ - sku: secondVariantSku, - warehouseName: warehouse.name, - attributeName: variants[1].name, - price: variants[1].price, - channelName: defaultChannel.name - }); - }) - .then(() => { - selectChannelInHeader(defaultChannel.name); - variantsShouldBeVisible({ - name: variants[1].name, - price: variants[1].price - }); - getProductVariants(createdProduct.id, defaultChannel.slug); - }) - .then(([firstVariant, secondVariant]) => { - expect(firstVariant).to.have.property("price", variants[0].price); - expect(secondVariant).to.have.property("name", variants[1].name); - expect(secondVariant).to.have.property("price", variants[1].price); - }); - }); - - it("should create variant for many channels", () => { - const name = `${startsWith}${faker.datatype.number()}`; - const variantsPrice = 10; - let createdProduct; - createProduct({ - attributeId: attribute.id, - name, - productTypeId: productType.id, - categoryId: category.id - }) - .then(productResp => { - createdProduct = productResp; - updateChannelInProduct({ - productId: createdProduct.id, - channelId: defaultChannel.id - }); - }) - .then(() => { - updateChannelInProduct({ - productId: createdProduct.id, - channelId: newChannel.id - }); - }) - .then(() => { - cy.visit(`${urlList.products}${createdProduct.id}`); - createFirstVariant({ - sku: name, - warehouseId: warehouse.id, - price: variantsPrice, - attribute: attributeValues[0] - }); - selectChannelInHeader(defaultChannel.name); - variantsShouldBeVisible({ name, price: variantsPrice }); - selectChannelInHeader(newChannel.name); - variantsShouldBeVisible({ name, price: variantsPrice }); - getProductVariants(createdProduct.id, defaultChannel.slug); - }) - .then(([variant]) => { - expect(variant).to.have.property("name", attributeValues[0]); - expect(variant).to.have.property("price", variantsPrice); - getProductVariants(createdProduct.id, newChannel.slug); - }) - .then(([variant]) => { - expect(variant).to.have.property("name", attributeValues[0]); - expect(variant).to.have.property("price", variantsPrice); - }); - }); -}); diff --git a/cypress/integration/allEnv/products/updatingProducts.js b/cypress/integration/allEnv/products/updatingProducts.js deleted file mode 100644 index f6dda4f64..000000000 --- a/cypress/integration/allEnv/products/updatingProducts.js +++ /dev/null @@ -1,151 +0,0 @@ -import faker from "faker"; - -import { createCategory } from "../../../apiRequests/Category"; -import { createCollection } from "../../../apiRequests/Collections"; -import { getProductDetails } from "../../../apiRequests/storeFront/ProductDetails"; -import { ONE_PERMISSION_USERS } from "../../../Data/users"; -import { PRODUCT_DETAILS } from "../../../elements/catalog/products/product-details"; -import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; -import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; -import { metadataForms } from "../../../steps/catalog/metadataSteps"; -import { fillUpCommonFieldsForAllProductTypes } from "../../../steps/catalog/products/productSteps"; -import { productDetailsUrl } from "../../../url/urlList"; -import { getDefaultChannel } from "../../../utils/channelsUtils"; -import { deleteCollectionsStartsWith } from "../../../utils/collectionsUtils"; -import { expectCorrectProductInformation } from "../../../utils/products/checkProductInfo"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../../utils/products/productsUtils"; - -describe("Update products", () => { - const startsWith = "CyUpdateProducts-"; - const name = `${startsWith}${faker.datatype.number()}`; - const description = faker.lorem.sentences(2); - - let defaultChannel; - let collection; - let product; - let attribute; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteProductsStartsWith(startsWith); - deleteCollectionsStartsWith(startsWith); - getDefaultChannel() - .then(channel => { - defaultChannel = channel; - createCollection(name); - }) - .then(collectionResp => { - collection = collectionResp; - createTypeAttributeAndCategoryForProduct(name); - }) - .then(({ attribute: attributeResp, category, productType }) => { - attribute = attributeResp; - createProductInChannel({ - attributeId: attribute.id, - categoryId: category.id, - productTypeId: productType.id, - channelId: defaultChannel.id, - name, - collectionId: collection.id, - description - }); - }) - .then(({ product: productResp }) => { - product = productResp; - }); - }); - - it("Should update product", () => { - const updatedName = `${startsWith}${faker.random.number()}`; - let updatedCategory; - let updatedCollection; - createCategory(updatedName) - .then(categoryResp => { - updatedCategory = categoryResp; - createCollection(updatedName); - }) - .then(collectionResp => { - updatedCollection = collectionResp; - const productData = { - generalInfo: { - name: updatedName, - description: faker.lorem.sentence(), - rating: 3 - }, - seo: { - slug: updatedName, - title: "newTitle", - description: "New description." - }, - metadata: { - private: { - metadataForm: metadataForms.private, - name: "newPrivate", - value: "value1" - }, - public: { - metadataForm: metadataForms.public, - name: "newPublic", - value: "value2" - } - }, - productOrganization: { - category: updatedCategory.name, - collection: updatedCollection.name - } - }; - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.product) - .visit(productDetailsUrl(product.id)) - .get(PRODUCT_DETAILS.collectionRemoveButtons) - .click(); - fillUpCommonFieldsForAllProductTypes(productData, false); - cy.addAliasToGraphRequest("UpdatePrivateMetadata"); - cy.addAliasToGraphRequest("UpdateMetadata"); - cy.addAliasToGraphRequest("ProductUpdate"); - cy.get(BUTTON_SELECTORS.confirm).click(); - cy.get(SHARED_ELEMENTS.confirmationMsg) - .should("be.visible") - .then(() => { - cy.wait("@ProductUpdate"); - cy.wait("@UpdateMetadata"); - cy.wait("@UpdatePrivateMetadata"); - productData.productOrganization.productType = name; - productData.attribute = attribute; - cy.loginUserViaRequest("token"); - }) - .then(() => { - getProductDetails(product.id, defaultChannel.slug, "auth").its( - "body.data.product" - ); - }) - .then(resp => { - expectCorrectProductInformation(resp, productData); - }); - }); - }); - - it("should delete product", () => { - cy.clearSessionData() - .loginUserViaRequest("auth", ONE_PERMISSION_USERS.product) - .visit(productDetailsUrl(product.id)) - .addAliasToGraphRequest("ProductDelete") - .get(BUTTON_SELECTORS.deleteButton) - .click() - .get(BUTTON_SELECTORS.submit) - .click() - .wait("@ProductDelete") - .loginUserViaRequest("token") - .then(() => { - getProductDetails(product.id, defaultChannel.slug).its("body.data"); - }) - .then( - productResp => - expect(productResp.product, "Check if product exist").to.be.null - ); - }); -}); diff --git a/cypress/integration/apps.js b/cypress/integration/apps.js new file mode 100644 index 000000000..0bc1152db --- /dev/null +++ b/cypress/integration/apps.js @@ -0,0 +1,110 @@ +import faker from "faker"; + +import { createApp, getApp } from "../apiRequests/Apps"; +import { ONE_PERMISSION_USERS } from "../Data/users"; +import { APP_DETAILS } from "../elements/apps/appDetails"; +import { APPS_LIST } from "../elements/apps/appsList"; +import { WEBHOOK_DETAILS } from "../elements/apps/webhookDetails"; +import { BUTTON_SELECTORS } from "../elements/shared/button-selectors"; +import { confirmationMessageShouldDisappear } from "../steps/shared/confirmationMessage"; +import filterTests from "../support/filterTests"; +import { appDetailsUrl, urlList } from "../url/urlList"; +import { deleteAppsStartsWith } from "../utils/appUtils"; + +filterTests(["all"], () => { + describe("Tests for apps", () => { + const startsWith = "Apps"; + const name = `${startsWith}${faker.datatype.number()}`; + + let createdApp; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteAppsStartsWith(startsWith); + createApp(name, "MANAGE_APPS").then(app => { + createdApp = app; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.app + ); + }); + + it("should create app", () => { + const randomName = `${startsWith}${faker.datatype.number()}`; + + cy.visit(urlList.apps) + .get(APPS_LIST.createLocalAppButton) + .click() + .get(APP_DETAILS.nameInput) + .type(randomName) + .get(APP_DETAILS.manageAppsPermissionCheckbox) + .click() + .addAliasToGraphRequest("AppCreate") + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + cy.wait("@AppCreate") + .its("response.body.data.appCreate.app") + .then(app => { + getApp(app.id); + }) + .then(app => { + expect(app.name).to.eq(randomName); + const token = app.tokens.find(element => element.name === "Default"); + expect(token).to.be.ok; + }); + }); + + it("should create webhook", () => { + const randomName = `${startsWith}${faker.datatype.number()}`; + const targetUrl = `http://example.${randomName}`; + + cy.visit(appDetailsUrl(createdApp.id)) + .get(APP_DETAILS.createWebhookButton) + .click() + .get(WEBHOOK_DETAILS.nameInput) + .type(randomName) + .get(WEBHOOK_DETAILS.targetUrlInput) + .type(targetUrl) + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + getApp(createdApp.id).then(({ webhooks }) => { + expect(webhooks[0].name).to.eq(randomName); + expect(webhooks[0].targetUrl).to.eq(targetUrl); + }); + }); + + it("should create token", () => { + const randomName = `${startsWith}${faker.datatype.number()}`; + let expectedToken; + + cy.visit(appDetailsUrl(createdApp.id)) + .get(APP_DETAILS.createTokenButton) + .click() + .get(APP_DETAILS.createTokenForm.tokenDialog) + .find(APP_DETAILS.createTokenForm.nameInput) + .type(randomName) + .get(BUTTON_SELECTORS.submit) + .click() + .get(APP_DETAILS.createTokenForm.tokenToCopy) + .invoke("text") + .then(text => { + expectedToken = text; + cy.get(APP_DETAILS.createTokenForm.doneButton).click(); + getApp(createdApp.id); + }) + .then(app => { + const token = app.tokens.find(element => element.name === randomName); + const tokenLastFourDigits = expectedToken.slice( + expectedToken.length - 4 + ); + expect(token.authToken).to.eq(tokenLastFourDigits); + }); + }); + }); +}); diff --git a/cypress/integration/categories.js b/cypress/integration/categories.js new file mode 100644 index 000000000..29fcc130d --- /dev/null +++ b/cypress/integration/categories.js @@ -0,0 +1,139 @@ +// +import faker from "faker"; + +import { getCategory } from "../apiRequests/Category"; +import { CATEGORIES_LIST } from "../elements/catalog/categories/categories-list"; +import { CATEGORY_DETAILS } from "../elements/catalog/categories/category-details"; +import { BUTTON_SELECTORS } from "../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../elements/shared/sharedElements"; +import { createCategory } from "../steps/categoriesSteps"; +import { confirmationMessageShouldDisappear } from "../steps/shared/confirmationMessages"; +import filterTests from "../support/filterTests"; +import { categoryDetails, urlList } from "../url/urlList"; +import { deleteCategoriesStartsWith } from "../utils/categoryUtils"; +import * as channelsUtils from "../utils/channelsUtils"; +import * as productsUtils from "../utils/products/productsUtils"; +import { deleteShippingStartsWith } from "../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Categories", () => { + const startsWith = "CyCollections"; + const name = `${startsWith}${faker.datatype.number()}`; + + let attribute; + let category; + let productType; + let product; + + let defaultChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productsUtils.deleteProductsStartsWith(startsWith); + deleteCategoriesStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + channelsUtils.deleteChannelsStartsWith(startsWith); + + channelsUtils + .getDefaultChannel() + .then(channel => { + defaultChannel = channel; + productsUtils.createTypeAttributeAndCategoryForProduct(name); + }) + .then( + ({ + category: categoryResp, + attribute: attributeResp, + productType: productTypeResp + }) => { + category = categoryResp; + attribute = attributeResp; + productType = productTypeResp; + productsUtils.createProductInChannel({ + name, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }); + } + ) + .then(({ product: productResp }) => (product = productResp)); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create category", () => { + const categoryName = `${startsWith}${faker.datatype.number()}`; + + cy.visit(urlList.categories) + .get(CATEGORIES_LIST.addCategoryButton) + .click(); + createCategory({ name: categoryName, description: categoryName }) + .its("response.body.data.categoryCreate.category") + .then(newCategory => { + getCategory(newCategory.id); + }) + .then(newCategory => { + expect(newCategory.name).to.eq(categoryName); + // Uncomment this expect after fixing bug SALEOR-3728 + // expect(newCategory.description).to.eq(categoryName); + }); + }); + + it("should add subcategory", () => { + const categoryName = `${startsWith}${faker.datatype.number()}`; + cy.visit(categoryDetails(category.id)) + .get(CATEGORY_DETAILS.createSubcategoryButton) + .click(); + createCategory({ name: categoryName, description: categoryName }) + .visit(categoryDetails(category.id)) + .contains(CATEGORY_DETAILS.categoryChildrenRow, categoryName) + .should("be.visible"); + getCategory(category.id).then(categoryResp => { + expect(categoryResp.children.edges[0].node.name).to.eq(categoryName); + }); + }); + + it("should add product to category", () => { + cy.visit(categoryDetails(category.id)) + .get(CATEGORY_DETAILS.productsTab) + .click() + .get(CATEGORY_DETAILS.addProducts) + .click() + .url() + .should("include", urlList.addProduct); + }); + + it("should remove product from category", () => { + cy.visit(categoryDetails(category.id)) + .get(CATEGORY_DETAILS.productsTab) + .click(); + cy.contains(CATEGORY_DETAILS.productRow, product.name) + .find(BUTTON_SELECTORS.checkbox) + .click() + .get(BUTTON_SELECTORS.deleteIcon) + .click() + .addAliasToGraphRequest("productBulkDelete") + .get(BUTTON_SELECTORS.submit) + .click(); + confirmationMessageShouldDisappear(); + cy.contains(CATEGORY_DETAILS.productRow, product.name) + .should("not.exist") + .wait("@productBulkDelete"); + getCategory(category.id).then(categoryResp => { + expect(categoryResp.products).to.be.null; + }); + }); + + it("should enter category details page", () => { + cy.visit(urlList.categories) + .get(SHARED_ELEMENTS.searchInput) + .type(category.name); + cy.contains(SHARED_ELEMENTS.tableRow, category.name).click(); + cy.contains(SHARED_ELEMENTS.header, category.name).should("be.visible"); + }); + }); +}); diff --git a/cypress/integration/checkout/productWithoutShipping.js b/cypress/integration/checkout/productWithoutShipping.js new file mode 100644 index 000000000..b383991e3 --- /dev/null +++ b/cypress/integration/checkout/productWithoutShipping.js @@ -0,0 +1,124 @@ +// + +import faker from "faker"; + +import { createChannel } from "../../apiRequests/Channels"; +import { + addProductsToCheckout, + addShippingMethod, + createCheckout +} from "../../apiRequests/Checkout"; +import filterTests from "../../support/filterTests"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Products without shipment option", () => { + const startsWith = "WithoutShipmentCheckout-"; + const name = `${startsWith}${faker.datatype.number()}`; + const nameProdWithoutShipping = `${startsWith}${faker.datatype.number()}`; + + let channel; + let address; + let warehouse; + let shippingMethod; + let productWithShipping; + let productWithoutShipping; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + + deleteProductsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + + createChannel({ + name + }) + .then(channelResp => { + channel = channelResp; + cy.fixture("addresses"); + }) + .then(({ usAddress }) => { + address = usAddress; + createShipping({ + channelId: channel.id, + name, + address, + minProductPrice: 100 + }); + }) + .then( + ({ + warehouse: warehouseResp, + shippingMethod: shippingMethodResp + }) => { + warehouse = warehouseResp; + shippingMethod = shippingMethodResp; + createTypeAttributeAndCategoryForProduct(name); + } + ) + .then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + createProductInChannel({ + attributeId: attributeResp.id, + categoryId: categoryResp.id, + channelId: channel.id, + name, + productTypeId: productTypeResp.id, + warehouseId: warehouse.id + }).then(({ variantsList }) => (productWithShipping = variantsList)); + createProductInChannel({ + attributeId: attributeResp.id, + categoryId: categoryResp.id, + channelId: channel.id, + name: nameProdWithoutShipping, + productTypeId: productTypeResp.id, + warehouseId: warehouse.id + }).then( + ({ variantsList }) => (productWithoutShipping = variantsList) + ); + } + ); + }); + + it("should be not possible to buy product without shipping option", () => { + createCheckout({ + channelSlug: channel.slug, + email: "example@example.com", + variantsList: productWithoutShipping, + address, + auth: "token" + }) + .then(({ checkout }) => { + expect( + checkout.availableShippingMethods, + "expect no available shipping" + ).to.have.length(0); + addProductsToCheckout(checkout.id, productWithShipping, 1); + }) + .then(({ checkout }) => { + expect( + checkout.availableShippingMethods, + "expect no available shipping" + ).to.have.length(0); + addShippingMethod(checkout.id, shippingMethod.id); + }) + .then(({ errors }) => { + expect(errors[0].field, "expect error in shipping method").to.be.eq( + "shippingMethod" + ); + }); + }); + }); +}); diff --git a/cypress/integration/checkout/purchaseWithProductTypes.js b/cypress/integration/checkout/purchaseWithProductTypes.js new file mode 100644 index 000000000..7dcadcf11 --- /dev/null +++ b/cypress/integration/checkout/purchaseWithProductTypes.js @@ -0,0 +1,240 @@ +import faker from "faker"; + +import { createAttribute } from "../../apiRequests/Attribute"; +import { createCategory } from "../../apiRequests/Category"; +import { + checkoutShippingAddressUpdate, + checkoutShippingMethodUpdate, + checkoutVariantsUpdate, + completeCheckout, + createCheckout +} from "../../apiRequests/Checkout"; +import { getOrder } from "../../apiRequests/Order"; +import { createTypeProduct } from "../../apiRequests/productType"; +import filterTests from "../../support/filterTests"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import { + addPayment, + createAndCompleteCheckoutWithoutShipping, + createWaitingForCaptureOrder +} from "../../utils/ordersUtils"; +import { + createProductInChannel, + deleteProductsStartsWith +} from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all", "critical"], () => { + describe("Purchase products with all products types", () => { + const startsWith = `CyPurchaseByType`; + const name = `${startsWith}${faker.datatype.number()}`; + const email = `${startsWith}@example.com`; + const testsMessage = "Check order status"; + const { softExpect } = chai; + + let defaultChannel; + let address; + let warehouse; + let attribute; + let category; + let shippingMethod; + let createProductData; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteProductsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + getDefaultChannel().then(channelResp => (defaultChannel = channelResp)); + cy.fixture("addresses") + .then(addresses => { + address = addresses.usAddress; + createShipping({ + channelId: defaultChannel.id, + name, + address, + price: 10 + }); + }) + .then( + ({ + warehouse: warehouseResp, + shippingMethod: shippingMethodResp + }) => { + warehouse = warehouseResp; + shippingMethod = shippingMethodResp; + } + ); + createAttribute({ name }) + .then(attributeResp => { + attribute = attributeResp; + createCategory(name); + }) + .then(categoryResp => { + category = categoryResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + createProductData = { + channelId: defaultChannel.id, + warehouseId: warehouse.id, + quantityInWarehouse: 10, + attributeId: attribute.id, + categoryId: category.id, + price: 10 + }; + }); + + it("should purchase digital product", () => { + const digitalName = `${startsWith}${faker.datatype.number()}`; + createTypeProduct({ + name: digitalName, + attributeId: attribute.id, + shippable: false + }) + .then(productType => { + createProductData.name = digitalName; + createProductData.productTypeId = productType.id; + createProductInChannel(createProductData); + }) + .then(({ variantsList }) => { + createAndCompleteCheckoutWithoutShipping({ + channelSlug: defaultChannel.slug, + email, + billingAddress: address, + variantsList, + auth: "token" + }); + }) + .then(({ order }) => { + getOrder(order.id); + }) + .then(order => { + softExpect( + order.isShippingRequired, + "Check if is shipping required in order" + ).to.eq(false); + expect(order.status, testsMessage).to.be.eq("UNFULFILLED"); + }); + }); + + it("should purchase physical product", () => { + const physicalName = `${startsWith}${faker.datatype.number()}`; + createTypeProduct({ + name: physicalName, + attributeId: attribute.id, + shippable: true + }) + .then(productType => { + createProductData.name = physicalName; + createProductData.productTypeId = productType.id; + createProductInChannel(createProductData); + }) + .then(({ variantsList }) => { + createWaitingForCaptureOrder({ + channelSlug: defaultChannel.slug, + email, + variantsList, + shippingMethodId: shippingMethod.id, + address + }); + }) + .then(({ order }) => { + getOrder(order.id); + }) + .then(order => { + softExpect( + order.isShippingRequired, + "Check if is shipping required in order" + ).to.eq(true); + expect(order.status, testsMessage).to.be.eq("UNFULFILLED"); + }); + }); + + it("should purchase multiple products with all product types", () => { + const physicalName = `${startsWith}${faker.datatype.number()}`; + const digitalName = `${startsWith}${faker.datatype.number()}`; + let digitalProductVariantsList; + let checkout; + createTypeProduct({ + name: digitalName, + attributeId: attribute.id, + shippable: false + }) + .then(productType => { + createProductData.name = digitalName; + createProductData.productTypeId = productType.id; + createProductInChannel(createProductData); + }) + .then(({ variantsList }) => { + digitalProductVariantsList = variantsList; + createCheckout({ + channelSlug: defaultChannel.slug, + email, + variantsList: digitalProductVariantsList, + billingAddress: address, + auth: "token" + }); + }) + .then(({ checkout: checkoutResp }) => { + checkout = checkoutResp; + addPayment(checkout.id); + }) + .then(() => { + createTypeProduct({ + name: physicalName, + attributeId: attribute.id, + shippable: true + }); + }) + .then(productType => { + createProductData.name = physicalName; + createProductData.productTypeId = productType.id; + createProductInChannel(createProductData); + }) + .then(({ variantsList }) => { + checkoutVariantsUpdate(checkout.id, variantsList); + }) + .then(() => { + checkoutShippingMethodUpdate(checkout.id, shippingMethod.id); + }) + .then(({ checkoutErrors }) => { + expect( + checkoutErrors, + "Should be not possible to add shipping method without shipping address" + ).to.have.lengthOf(1); + checkoutShippingAddressUpdate(checkout.id, address); + }) + .then(() => { + addPayment(checkout.id); + }) + .then(({ paymentErrors }) => { + expect( + paymentErrors, + "Should be not possible to add payment without shipping" + ).to.have.lengthOf(1); + checkoutShippingMethodUpdate(checkout.id, shippingMethod.id); + }) + .then(() => { + addPayment(checkout.id); + }) + .then(() => { + completeCheckout(checkout.id); + }) + .then(({ order }) => { + getOrder(order.id); + }) + .then(order => { + softExpect( + order.isShippingRequired, + "Check if is shipping required in order" + ).to.eq(true); + expect(order.status, testsMessage).to.be.eq("UNFULFILLED"); + }); + }); + }); +}); diff --git a/cypress/integration/checkout/stocksInCheckout.js b/cypress/integration/checkout/stocksInCheckout.js new file mode 100644 index 000000000..03fc8d087 --- /dev/null +++ b/cypress/integration/checkout/stocksInCheckout.js @@ -0,0 +1,168 @@ +import faker from "faker"; + +import { + addProductsToCheckout, + createCheckout +} from "../../apiRequests/Checkout"; +import { getVariants } from "../../apiRequests/Product"; +import filterTests from "../../support/filterTests"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import { createOrderWithNewProduct } from "../../utils/ordersUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all", "critical"], () => { + describe("Products stocks in checkout", () => { + const startsWith = "CyStocksCheckout-"; + const name = `${startsWith}${faker.datatype.number()}`; + + let defaultChannel; + let address; + let warehouse; + let attribute; + let category; + let productType; + let shippingMethod; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteProductsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + cy.fixture("addresses") + .then(addresses => { + address = addresses.usAddress; + getDefaultChannel(); + }) + .then(channel => { + defaultChannel = channel; + createShipping({ + channelId: defaultChannel.id, + name, + address + }); + }) + .then( + ({ + warehouse: warehouseResp, + shippingMethod: shippingMethodResp + }) => { + warehouse = warehouseResp; + shippingMethod = shippingMethodResp; + createTypeAttributeAndCategoryForProduct(name); + } + ) + .then( + ({ + attribute: attributeResp, + category: categoryResp, + productType: productTypeResp + }) => { + attribute = attributeResp; + category = categoryResp; + productType = productTypeResp; + } + ); + }); + it("should create checkout with last product in stock", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + + createOrderWithNewProduct({ + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id, + channel: defaultChannel, + name: productName, + warehouseId: warehouse.id, + shippingMethodId: shippingMethod.id, + address + }).then(({ order }) => { + expect(order, "order should be created").to.be.ok; + }); + }); + + it("should not be possible to add product with quantity greater than stock", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + let variants; + + createProductInChannel({ + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id, + channelId: defaultChannel.id, + name: productName, + warehouseId: warehouse.id, + quantityInWarehouse: 1 + }) + .then(({ variantsList }) => { + variants = variantsList; + createCheckout({ + channelSlug: defaultChannel.slug, + address, + billingAddress: address, + email: "email@example.com", + variantsList, + auth: "token" + }); + }) + .then(({ checkout: checkout }) => { + addProductsToCheckout(checkout.id, variants, 2); + }) + .then(({ errors }) => { + expect( + errors[0], + "should return error on field quantity" + ).to.have.property("field", "quantity"); + }); + }); + + it("should buy product with no quantity if tracking is not set", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + + createOrderWithNewProduct({ + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id, + channel: defaultChannel, + name: productName, + warehouseId: warehouse.id, + quantityInWarehouse: 0, + trackInventory: false, + shippingMethodId: shippingMethod.id, + address + }).then(({ order }) => { + expect(order, "order should be created").to.be.ok; + }); + }); + + it("should change product stock after purchase", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + + createOrderWithNewProduct({ + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id, + channel: defaultChannel, + name: productName, + warehouseId: warehouse.id, + quantityInWarehouse: 10, + trackInventory: true, + shippingMethodId: shippingMethod.id, + address + }) + .then(({ variantsList }) => { + getVariants(variantsList); + }) + .then(variantsList => { + const variant = variantsList.edges[0]; + expect(variant.node.stocks[0].quantityAllocated).to.eq(1); + }); + }); + }); +}); diff --git a/cypress/integration/checkout/warehouses.js b/cypress/integration/checkout/warehouses.js new file mode 100644 index 000000000..c5162305c --- /dev/null +++ b/cypress/integration/checkout/warehouses.js @@ -0,0 +1,71 @@ +import faker from "faker"; + +import { createCheckout } from "../../apiRequests/Checkout"; +import filterTests from "../../support/filterTests"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Warehouses in checkout", () => { + const startsWith = `CyWarehouseCheckout`; + let defaultChannel; + let usAddress; + let plAddress; + let warehouse; + + it("should not be possible to buy product for country not listed in warehouse", () => { + cy.clearSessionData().loginUserViaRequest(); + deleteShippingStartsWith(startsWith); + deleteProductsStartsWith(startsWith); + const name = `${startsWith}${faker.datatype.number()}`; + cy.fixture("addresses") + .then(addresses => { + usAddress = addresses.usAddress; + plAddress = addresses.plAddress; + getDefaultChannel(); + }) + .then(channelResp => { + defaultChannel = channelResp; + createShipping({ + channelId: defaultChannel.id, + name, + address: usAddress + }); + }) + .then(({ warehouse: warehouseResp }) => { + warehouse = warehouseResp; + createTypeAttributeAndCategoryForProduct(name); + }) + .then(({ attribute, productType, category }) => { + createProductInChannel({ + name, + attributeId: attribute.id, + categoryId: category.id, + channelId: defaultChannel.id, + productTypeId: productType.id, + warehouseId: warehouse.id, + quantityInWarehouse: 100 + }); + }) + .then(({ variantsList }) => { + createCheckout({ + channelSlug: defaultChannel.slug, + email: "example@example.com", + variantsList, + address: plAddress + }); + }) + .then(({ errors }) => { + expect(errors[0]).to.have.property("field", "quantity"); + }); + }); + }); +}); diff --git a/cypress/integration/collections.js b/cypress/integration/collections.js new file mode 100644 index 000000000..372c38da0 --- /dev/null +++ b/cypress/integration/collections.js @@ -0,0 +1,184 @@ +// +import faker from "faker"; + +import { createChannel } from "../apiRequests/Channels"; +import { updateChannelInProduct } from "../apiRequests/Product"; +import { getCollection } from "../apiRequests/storeFront/Collections"; +import { searchInShop } from "../apiRequests/storeFront/Search"; +import { + assignProductsToCollection, + createCollection +} from "../steps/collectionsSteps"; +import filterTests from "../support/filterTests"; +import { urlList } from "../url/urlList"; +import * as channelsUtils from "../utils/channelsUtils"; +import { deleteCollectionsStartsWith } from "../utils/collectionsUtils"; +import * as productsUtils from "../utils/products/productsUtils"; +import { deleteShippingStartsWith } from "../utils/shippingUtils"; +import { + isCollectionVisible, + isProductInCollectionVisible +} from "../utils/storeFront/collectionsUtils"; +import { isProductVisibleInSearchResult } from "../utils/storeFront/storeFrontProductUtils"; + +filterTests(["all"], () => { + describe("Collections", () => { + const startsWith = "CyCollections-"; + const name = `${startsWith}${faker.datatype.number()}`; + + let attribute; + let productType; + let category; + let product; + + let defaultChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productsUtils.deleteProductsStartsWith(startsWith); + deleteCollectionsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + channelsUtils.deleteChannelsStartsWith(startsWith); + + channelsUtils + .getDefaultChannel() + .then(channel => { + defaultChannel = channel; + productsUtils.createTypeAttributeAndCategoryForProduct(name); + }) + .then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + attribute = attributeResp; + productType = productTypeResp; + category = categoryResp; + productsUtils.createProductInChannel({ + name, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }); + } + ) + .then(({ product: productResp }) => (product = productResp)); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should not display hidden collections", () => { + const collectionName = `${startsWith}${faker.datatype.number()}`; + cy.visit(urlList.collections); + cy.softExpectSkeletonIsVisible(); + let collection; + + createCollection(collectionName, false, defaultChannel) + .then(collectionResp => { + collection = collectionResp; + assignProductsToCollection(name); + }) + .then(() => { + getCollection(collection.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isCollectionVisible(resp, collection.id); + expect(isVisible).to.equal(false); + }); + }); + + it("should display collections", () => { + const collectionName = `${startsWith}${faker.datatype.number()}`; + let collection; + cy.visit(urlList.collections); + cy.softExpectSkeletonIsVisible(); + + createCollection(collectionName, true, defaultChannel) + .then(collectionResp => { + collection = collectionResp; + assignProductsToCollection(name); + getCollection(collection.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isCollectionVisible(resp, collection.id); + expect(isVisible).to.equal(true); + }); + }); + + it("should not display collection not set as available in channel", () => { + const collectionName = `${startsWith}${faker.datatype.number()}`; + let collection; + let channel; + + createChannel({ name: collectionName }) + .then(channelResp => { + channel = channelResp; + updateChannelInProduct(product.id, channel.id); + }) + .then(() => { + cy.visit(urlList.collections); + cy.softExpectSkeletonIsVisible(); + createCollection(collectionName, true, channel); + }) + .then(collectionResp => { + collection = collectionResp; + assignProductsToCollection(name); + getCollection(collection.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isCollectionVisible(resp, collection.id); + expect(isVisible).to.equal(false); + }); + }); + + it("should display products hidden in listing", () => { + // Products "hidden in listings" are not displayed in Category listings or search results, + // but are listed on Collections + const randomName = `${startsWith}${faker.datatype.number()}`; + let collection; + let createdProduct; + + productsUtils + .createProductInChannel({ + name: randomName, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + visibleInListings: false + }) + .then(({ product: productResp }) => (createdProduct = productResp)); + cy.visit(urlList.collections); + cy.softExpectSkeletonIsVisible(); + createCollection(randomName, true, defaultChannel) + .then(collectionResp => { + collection = collectionResp; + assignProductsToCollection(randomName); + }) + .then(() => { + getCollection(collection.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isProductInCollectionVisible( + resp, + createdProduct.id + ); + expect(isVisible).to.equal(true); + }) + .then(() => { + searchInShop(createdProduct.name); + }) + .then(resp => { + const isVisible = isProductVisibleInSearchResult( + resp, + createdProduct.name + ); + expect(isVisible).to.equal(false); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/attributes/attributes.js b/cypress/integration/configuration/attributes/attributes.js new file mode 100644 index 000000000..ca4b2a2b9 --- /dev/null +++ b/cypress/integration/configuration/attributes/attributes.js @@ -0,0 +1,123 @@ +// + +import faker from "faker"; + +import { getAttribute } from "../../../apiRequests/Attribute"; +import { ATTRIBUTES_LIST } from "../../../elements/attribute/attributes_list"; +import { createAttributeWithInputType } from "../../../steps/attributesSteps"; +import filterTests from "../../../support/filterTests"; +import { urlList } from "../../../url/urlList"; +import { deleteAttributesStartsWith } from "../../../utils/attributes/attributeUtils"; +import { expectCorrectDataInAttribute } from "../../../utils/attributes/checkAttributeData"; + +filterTests(["all"], () => { + describe("Create attribute with type", () => { + const startsWith = "AttrCreate"; + const attributesTypes = [ + "DROPDOWN", + "MULTISELECT", + "FILE", + "RICH_TEXT", + "BOOLEAN" + ]; + const attributeReferenceType = ["PRODUCT", "PAGE"]; + const attributeNumericType = [ + { unitSystem: "IMPERIAL", unitsOf: "DISTANCE", unit: "FT" }, + { unitSystem: "METRIC", unitsOf: "VOLUME", unit: "CUBIC_CENTIMETER" }, + { unitSystem: "without selecting unit" } + ]; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteAttributesStartsWith(startsWith); + }); + + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.attributes) + .get(ATTRIBUTES_LIST.createAttributeButton) + .click(); + }); + + attributesTypes.forEach(attributeType => { + it(`should create ${attributeType} attribute`, () => { + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ name: attributeName, attributeType }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType + }); + }); + }); + }); + + attributeReferenceType.forEach(entityType => { + it(`should create reference ${entityType} attribute`, () => { + const attributeType = "REFERENCE"; + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ + name: attributeName, + attributeType, + entityType + }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType, + entityType + }); + }); + }); + }); + + attributeNumericType.forEach(numericSystemType => { + it(`should create numeric attribute - ${numericSystemType.unitSystem}`, () => { + const attributeType = "NUMERIC"; + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ + name: attributeName, + attributeType, + numericSystemType + }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType, + unit: numericSystemType.unit + }); + }); + }); + }); + + it("should create attribute without required value", () => { + const attributeType = "BOOLEAN"; + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ + name: attributeName, + attributeType, + valueRequired: false + }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType, + valueRequired: false + }); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/attributes/contentAttribute.js b/cypress/integration/configuration/attributes/contentAttribute.js new file mode 100644 index 000000000..c4c31ba68 --- /dev/null +++ b/cypress/integration/configuration/attributes/contentAttribute.js @@ -0,0 +1,123 @@ +import faker from "faker"; + +import { getAttribute } from "../../../apiRequests/Attribute"; +import { ATTRIBUTES_DETAILS } from "../../../elements/attribute/attributes_details"; +import { ATTRIBUTES_LIST } from "../../../elements/attribute/attributes_list"; +import { createAttributeWithInputType } from "../../../steps/attributesSteps"; +import filterTests from "../../../support/filterTests"; +import { urlList } from "../../../url/urlList"; +import { deleteAttributesStartsWith } from "../../../utils/attributes/attributeUtils"; +import { expectCorrectDataInAttribute } from "../../../utils/attributes/checkAttributeData"; + +filterTests(["all"], () => { + describe("Create content attribute", () => { + const startsWith = "AttrCont"; + const attributesTypes = [ + "DROPDOWN", + "MULTISELECT", + "FILE", + "RICH_TEXT", + "BOOLEAN" + ]; + const attributeReferenceType = ["PRODUCT", "PAGE"]; + const attributeNumericType = [ + { unitSystem: "IMPERIAL", unitsOf: "DISTANCE", unit: "FT" }, + { unitSystem: "METRIC", unitsOf: "VOLUME", unit: "CUBIC_CENTIMETER" }, + { unitSystem: "without selecting unit" } + ]; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteAttributesStartsWith(startsWith); + }); + + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.attributes) + .get(ATTRIBUTES_LIST.createAttributeButton) + .click() + .get(ATTRIBUTES_DETAILS.pageTypeAttributeCheckbox) + .click(); + }); + attributesTypes.forEach(attributeType => { + it(`should create ${attributeType} attribute`, () => { + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ name: attributeName, attributeType }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType + }); + }); + }); + }); + + attributeReferenceType.forEach(entityType => { + it(`should create reference ${entityType} attribute`, () => { + const attributeType = "REFERENCE"; + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ + name: attributeName, + attributeType, + entityType + }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType, + entityType + }); + }); + }); + }); + + attributeNumericType.forEach(numericSystemType => { + it(`should create numeric attribute - ${numericSystemType.unitSystem}`, () => { + const attributeType = "NUMERIC"; + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ + name: attributeName, + attributeType, + numericSystemType + }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType, + unit: numericSystemType.unit + }); + }); + }); + }); + + it("should create attribute without required value", () => { + const attributeType = "BOOLEAN"; + const attributeName = `${startsWith}${faker.datatype.number()}`; + createAttributeWithInputType({ + name: attributeName, + attributeType, + valueRequired: false + }) + .then(({ attribute }) => { + getAttribute(attribute.id); + }) + .then(attribute => { + expectCorrectDataInAttribute(attribute, { + attributeName, + attributeType, + valueRequired: false + }); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/channels.js b/cypress/integration/configuration/channels.js new file mode 100644 index 000000000..713ea885d --- /dev/null +++ b/cypress/integration/configuration/channels.js @@ -0,0 +1,163 @@ +// +import faker from "faker"; + +import { createChannel } from "../../apiRequests/Channels"; +import { + createShippingZone, + getShippingZone +} from "../../apiRequests/ShippingMethod"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { PRODUCTS_LIST } from "../../elements/catalog/products/products-list"; +import { ADD_CHANNEL_FORM_SELECTORS } from "../../elements/channels/add-channel-form-selectors"; +import { AVAILABLE_CHANNELS_FORM } from "../../elements/channels/available-channels-form"; +import { CHANNELS_SELECTORS } from "../../elements/channels/channels-selectors"; +import { SELECT_CHANNELS_TO_ASSIGN } from "../../elements/channels/select-channels-to-assign"; +import { HEADER_SELECTORS } from "../../elements/header/header-selectors"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { createChannelByView } from "../../steps/channelsSteps"; +import { waitForProgressBarToNotExist } from "../../steps/shared/progressBar"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { deleteChannelsStartsWith } from "../../utils/channelsUtils"; +import { deleteShippingStartsWith } from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Channels", () => { + const channelStartsWith = `CyChannels`; + const randomName = `${channelStartsWith} ${faker.datatype.number()}`; + const currency = "PLN"; + let shippingZone; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteChannelsStartsWith(channelStartsWith); + deleteShippingStartsWith(channelStartsWith); + createShippingZone(randomName, "US").then(shippingZoneResp => { + shippingZone = shippingZoneResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.channel + ); + }); + + it("should create new channel", () => { + const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; + cy.addAliasToGraphRequest("Channels"); + cy.visit(urlList.channels); + cy.softExpectSkeletonIsVisible(); + cy.wait("@Channels"); + createChannelByView({ name: randomChannel, currency }); + cy.wait("@Channel"); + + // New channel should be visible in channels list + cy.get(ADD_CHANNEL_FORM_SELECTORS.backToChannelsList) + .click() + .get(CHANNELS_SELECTORS.channelsTable) + .contains(randomChannel); + + // new channel should be visible in channel selector + cy.visit(urlList.homePage) + .get(HEADER_SELECTORS.channelSelect) + .click() + .get(HEADER_SELECTORS.channelSelectList) + .contains(randomChannel) + .click(); + + // new channel should be visible at product availability form + cy.clearSessionData().loginUserViaRequest(); + cy.addAliasToGraphRequest("InitialProductFilterAttributes"); + cy.visit(urlList.products); + cy.wait("@InitialProductFilterAttributes"); + waitForProgressBarToNotExist(); + cy.get(PRODUCTS_LIST.emptyProductRow).should("not.exist"); + cy.get(PRODUCTS_LIST.productsList) + .first() + .click() + .get(AVAILABLE_CHANNELS_FORM.menageChannelsButton) + .click() + .get(SELECT_CHANNELS_TO_ASSIGN.listOfChannels) + .contains(randomChannel); + }); + + it("should create channel with shippingZone", () => { + // remove login after fixing SALEOR-3162 + cy.clearSessionData().loginUserViaRequest(); + + const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; + cy.addAliasToGraphRequest("Channels"); + cy.visit(urlList.channels); + cy.softExpectSkeletonIsVisible(); + cy.wait("@Channels"); + createChannelByView({ + name: randomChannel, + currency, + shippingZone: shippingZone.name + }); + cy.wait("@Channel"); + getShippingZone(shippingZone.id).then(shippingZoneResp => { + const assignedChannel = shippingZoneResp.channels.find( + channel => channel.name === randomChannel + ); + expect(assignedChannel).to.be.ok; + }); + }); + + it("should validate slug name", () => { + const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; + createChannel({ + isActive: false, + name: randomChannel, + slug: randomChannel, + currencyCode: currency + }); + cy.visit(urlList.channels); + cy.softExpectSkeletonIsVisible(); + createChannelByView({ name: randomChannel, currency }); + cy.get(ADD_CHANNEL_FORM_SELECTORS.slugValidationMessage).should( + "be.visible" + ); + }); + + it("should validate duplicated currency", () => { + const randomChannel = `${channelStartsWith} ${faker.datatype.number()}`; + cy.visit(urlList.channels); + cy.softExpectSkeletonIsVisible(); + createChannelByView({ + name: randomChannel, + currency: "notExistingCurrency" + }); + cy.get(ADD_CHANNEL_FORM_SELECTORS.currencyValidationMessage).should( + "be.visible" + ); + }); + + it("should delete channel", () => { + const randomChannelToDelete = `${channelStartsWith} ${faker.datatype.number()}`; + createChannel({ + isActive: false, + name: randomChannelToDelete, + slug: randomChannelToDelete, + currencyCode: currency + }); + cy.addAliasToGraphRequest("Channels"); + cy.visit(urlList.channels); + cy.softExpectSkeletonIsVisible(); + cy.wait("@Channels"); + cy.contains(CHANNELS_SELECTORS.channelName, randomChannelToDelete) + .parentsUntil(CHANNELS_SELECTORS.channelsTable) + .find("button") + .click(); + cy.addAliasToGraphRequest("Channels"); + cy.get(BUTTON_SELECTORS.submit).click(); + cy.wait("@Channels"); + + cy.get(CHANNELS_SELECTORS.channelName) + .contains(randomChannelToDelete) + .should("not.exist"); + }); + }); +}); diff --git a/cypress/integration/configuration/customer.js b/cypress/integration/configuration/customer.js new file mode 100644 index 000000000..0076c191b --- /dev/null +++ b/cypress/integration/configuration/customer.js @@ -0,0 +1,66 @@ +import faker from "faker"; + +import { getCustomer } from "../../apiRequests/Customer"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { CUSTOMER_DETAILS } from "../../elements/customer/customer-details"; +import { CUSTOMERS_LIST } from "../../elements/customer/customers-list"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; +import { fillUpAddressForm } from "../../steps/shared/addressForm"; +import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; + +filterTests(["all"], () => { + describe("Tests for customer", () => { + const channelStartsWith = `Customers`; + + it("should create customer", () => { + const randomName = `${channelStartsWith}${faker.datatype.number()}`; + const email = `${randomName}@example.com`; + const note = faker.lorem.paragraph(); + let address; + + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.user) + .visit(urlList.customers) + .get(CUSTOMERS_LIST.createCustomerButton) + .click() + .get(SHARED_ELEMENTS.progressBar) + .should("not.be.visible") + .get(CUSTOMER_DETAILS.nameInput) + .type(randomName) + .get(CUSTOMER_DETAILS.lastNameInput) + .type(randomName) + .get(CUSTOMER_DETAILS.emailInput) + .type(email) + .fixture("addresses") + .then(({ usAddress }) => { + address = usAddress; + fillUpAddressForm(address); + }) + .get(CUSTOMER_DETAILS.noteInput) + .type(note) + .addAliasToGraphRequest("CreateCustomer") + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + cy.wait("@CreateCustomer") + .its("response.body.data.customerCreate.user") + .then(customer => { + getCustomer(customer.id); + }) + .then(customer => { + chai + .softExpect(customer.firstName, "Expect correct first name") + .to.eq(randomName); + chai + .softExpect(customer.lastName, "Expect correct last name") + .to.eq(randomName); + chai.softExpect(customer.email, "Expect correct email").to.eq(email); + chai.softExpect(customer.note, "Expect correct note").to.eq(note); + cy.expectCorrectFullAddress(customer.addresses[0], address); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/inactiveChannel.js b/cypress/integration/configuration/inactiveChannel.js new file mode 100644 index 000000000..da9075e76 --- /dev/null +++ b/cypress/integration/configuration/inactiveChannel.js @@ -0,0 +1,151 @@ +// +import faker from "faker"; + +import { activateChannel, createChannel } from "../../apiRequests/Channels"; +import { createCheckout } from "../../apiRequests/Checkout"; +import { getProductDetails } from "../../apiRequests/storeFront/ProductDetails"; +import { CHANNEL_FORM_SELECTORS } from "../../elements/channels/channel-form-selectors"; +import { DRAFT_ORDER_SELECTORS } from "../../elements/orders/draft-order-selectors"; +import { ORDERS_SELECTORS } from "../../elements/orders/orders-selectors"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { + deleteChannelsStartsWith, + getDefaultChannel +} from "../../utils/channelsUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../utils/products/productsUtils"; +import { isProductVisible } from "../../utils/storeFront/storeFrontProductUtils"; + +filterTests(["all"], () => { + describe("Tests on inactive channel", () => { + const channelStartsWith = `InactiveChannel`; + const randomName = `${channelStartsWith}${faker.datatype.number()}`; + const currency = "PLN"; + + let address; + let defaultChannel; + let newChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteChannelsStartsWith(channelStartsWith); + deleteProductsStartsWith(channelStartsWith); + cy.fixture("addresses").then(({ plAddress }) => { + address = plAddress; + }); + getDefaultChannel().then(channel => (defaultChannel = channel)); + createChannel({ + isActive: false, + name: randomName, + slug: randomName, + currencyCode: currency + }).then(channel => { + newChannel = channel; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should not be possible to add products to order with inactive channel", () => { + cy.visit(urlList.orders) + .get(ORDERS_SELECTORS.createOrder) + .click() + .get(CHANNEL_FORM_SELECTORS.channelSelect) + .click() + .get(CHANNEL_FORM_SELECTORS.channelOption) + .contains(newChannel.name) + .click() + .get(CHANNEL_FORM_SELECTORS.confirmButton) + .click(); + cy.location() + .should(loc => { + const urlRegex = new RegExp(`${urlList.orders}.+`, "g"); + expect(loc.pathname).to.match(urlRegex); + }) + .get(DRAFT_ORDER_SELECTORS.addProducts) + .should("not.exist"); + }); + + it("should not be possible to create checkout with inactive channel", () => { + const randomChannel = `${channelStartsWith}${faker.datatype.number()}`; + createTypeAttributeAndCategoryForProduct(randomChannel) + .then(({ productType, attribute, category }) => { + createProductInChannel({ + name: randomChannel, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }); + }) + .then(({ variantsList }) => { + createCheckout({ + channelSlug: newChannel.slug, + email: "example@example.com", + variantsList, + address + }); + }) + .then(({ errors }) => { + expect( + errors[0], + "checkout shouldn't be created with error in field channel" + ).to.have.property("field", "channel"); + }); + }); + + it("products in inactive channel should not be displayed", () => { + const randomChannel = `${channelStartsWith}${faker.datatype.number()}`; + let channel; + let product; + + createChannel({ + isActive: false, + name: randomChannel, + slug: randomChannel, + currencyCode: currency + }) + .then(channelResp => { + channel = channelResp; + createTypeAttributeAndCategoryForProduct(randomChannel); + }) + .then(({ productType, attribute, category }) => { + createProductInChannel({ + name: randomChannel, + channelId: channel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }); + }) + .then(({ product: productResp }) => { + product = productResp; + getProductDetails(product.id, channel.slug); + }) + .then(resp => { + const isVisible = isProductVisible(resp, randomChannel); + expect( + isVisible, + "product with inactive channel shouldn't be visible" + ).to.be.eq(false); + activateChannel(channel.id); + }) + .then(() => { + getProductDetails(product.id, channel.slug); + }) + .then(resp => { + const isVisible = isProductVisible(resp, randomChannel); + expect( + isVisible, + "product with active channel should be visible" + ).to.be.eq(true); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/navigation.js b/cypress/integration/configuration/navigation.js new file mode 100644 index 000000000..32e54758d --- /dev/null +++ b/cypress/integration/configuration/navigation.js @@ -0,0 +1,69 @@ +import faker from "faker"; + +import { + createMenu as createMenuViaApi, + getMenu +} from "../../apiRequests/Menu"; +import { + createMenu, + createNewMenuItem, + MENU_ITEM_TYPES +} from "../../steps/navigationSteps"; +import filterTests from "../../support/filterTests"; +import { deleteMenusStartsWith } from "../../utils/navigationUtils"; + +filterTests(["all"], () => { + describe("Tests for menu navigation", () => { + const startsWith = "Navigation"; + const randomName = `${startsWith}${faker.datatype.number()}`; + + let menu; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteMenusStartsWith(startsWith); + createMenuViaApi(randomName).then( + ({ menu: menuResp }) => (menu = menuResp) + ); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create a menu", () => { + const name = `${startsWith}${faker.datatype.number()}`; + + createMenu(name) + .then(menuResp => { + getMenu(menuResp.id); + }) + .then(menuResp => { + expect(menuResp.name).to.eq(name); + }); + }); + + ["category", "collection", "page"].forEach(itemType => { + it(`should add new ${itemType} item to menu`, () => { + const itemName = `${startsWith}${faker.datatype.number()}`; + let selectedItem; + + createNewMenuItem({ + menuId: menu.id, + name: itemName, + menuItemType: MENU_ITEM_TYPES[itemType] + }) + .then(selectedItemResp => { + selectedItem = selectedItemResp; + getMenu(menu.id); + }) + .then(({ items }) => { + const item = items.find(element => element.name === itemName); + const itemOfType = item[itemType]; + const name = itemType !== "page" ? "name" : "title"; + expect(itemOfType[name]).to.eq(selectedItem); + }); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/permissions.js b/cypress/integration/configuration/permissions.js new file mode 100644 index 000000000..cc1c94c2b --- /dev/null +++ b/cypress/integration/configuration/permissions.js @@ -0,0 +1,151 @@ +import faker from "faker"; + +import { + createPermissionGroup, + getPermissionGroup +} from "../../apiRequests/PermissionGroup.js"; +import { getStaffMembersStartsWith } from "../../apiRequests/StaffMembers"; +import { TEST_ADMIN_USER } from "../../Data/users.js"; +import { PERMISSION_GROUP_DETAILS } from "../../elements/permissionGroup/permissionGroupDetails"; +import { PERMISSION_GROUP_LIST } from "../../elements/permissionGroup/permissionGroupsList"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; +import { waitForProgressBarToNotExist } from "../../steps/shared/progressBar.js"; +import filterTests from "../../support/filterTests.js"; +import { + permissionGroupDetails, + staffMemberDetailsUrl, + urlList +} from "../../url/urlList"; +import { deletePermissionGroupsStartsWith } from "../../utils/permissionGroupUtils.js"; + +filterTests(["all"], () => { + describe("Permissions groups", () => { + const startsWith = "CyPermissions-"; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deletePermissionGroupsStartsWith(startsWith); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + + cy.visit(urlList.permissionsGroups) + .get(PERMISSION_GROUP_LIST.createPermissionButton) + .click() + .get(PERMISSION_GROUP_DETAILS.nameInput) + .type(permissionName) + .get(PERMISSION_GROUP_DETAILS.productsPermissionCheckbox) + .click() + .get( + PERMISSION_GROUP_DETAILS.productsTypesAndAttributesPermissionCheckbox + ) + .click() + .get(BUTTON_SELECTORS.confirm) + .click() + .get(PERMISSION_GROUP_DETAILS.assignMemberButton) + .should("be.visible") + .get(BUTTON_SELECTORS.back) + .click(); + waitForProgressBarToNotExist(); + cy.contains( + PERMISSION_GROUP_LIST.permissionGroupRow, + permissionName + ).should("be.visible"); + }); + + it("should delete permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + let staffMember; + getStaffMembersStartsWith(TEST_ADMIN_USER.email) + .its("body.data.staffUsers.edges") + .then(staffMemberResp => { + staffMember = staffMemberResp[0].node; + createPermissionGroup({ + name: permissionName, + userIdsArray: `["${staffMember.id}"]`, + permissionsArray: "[MANAGE_PRODUCTS]" + }); + cy.visit(urlList.permissionsGroups); + cy.contains(PERMISSION_GROUP_LIST.permissionGroupRow, permissionName) + .should("be.visible") + .find(BUTTON_SELECTORS.deleteIcon) + .click() + .get(BUTTON_SELECTORS.submit) + .click(); + cy.contains(PERMISSION_GROUP_LIST.permissionGroupRow, permissionName) + .should("not.exist") + .visit(staffMemberDetailsUrl(staffMember.id)); + cy.get(SHARED_ELEMENTS.header).should("be.visible"); + cy.contains(permissionName).should("not.exist"); + }); + }); + + it("should add user to permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + createPermissionGroup({ + name: permissionName, + permissionsArray: "[MANAGE_PRODUCTS]" + }) + .then(({ group }) => { + cy.visit(permissionGroupDetails(group.id)) + .get(PERMISSION_GROUP_DETAILS.assignMemberButton) + .click() + .get(PERMISSION_GROUP_DETAILS.searchField) + .type(TEST_ADMIN_USER.email); + cy.contains( + PERMISSION_GROUP_DETAILS.userRow, + `${TEST_ADMIN_USER.name} ${TEST_ADMIN_USER.lastName}` + ) + .should("have.length", 1) + .find(BUTTON_SELECTORS.checkbox) + .click() + .get(BUTTON_SELECTORS.submit) + .click() + .addAliasToGraphRequest("PermissionGroupUpdate") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@PermissionGroupUpdate"); + getPermissionGroup(group.id); + }) + .then(resp => { + expect(resp.users).to.have.length(1); + expect(resp.users[0].email).to.be.eq(TEST_ADMIN_USER.email); + }); + }); + + it("should remove user from permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + let staffMember; + getStaffMembersStartsWith(TEST_ADMIN_USER.email) + .its("body.data.staffUsers.edges") + .then(staffMemberResp => { + staffMember = staffMemberResp[0].node; + createPermissionGroup({ + name: permissionName, + userIdsArray: `["${staffMember.id}"]`, + permissionsArray: "[MANAGE_PRODUCTS]" + }); + }) + .then(({ group }) => { + cy.visit(permissionGroupDetails(group.id)) + .get(PERMISSION_GROUP_DETAILS.removeUserButton) + .click() + .get(BUTTON_SELECTORS.submit) + .click() + .addAliasToGraphRequest("PermissionGroupUpdate") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@PermissionGroupUpdate"); + cy.visit(staffMemberDetailsUrl(staffMember.id)); + cy.get(SHARED_ELEMENTS.header).should("be.visible"); + cy.contains(permissionName).should("not.exist"); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/productTypes.js b/cypress/integration/configuration/productTypes.js new file mode 100644 index 000000000..556728bbb --- /dev/null +++ b/cypress/integration/configuration/productTypes.js @@ -0,0 +1,106 @@ +import faker from "faker"; + +import { createAttribute } from "../../apiRequests/Attribute"; +import { + createTypeProduct, + getProductType +} from "../../apiRequests/productType"; +import { PRODUCT_TYPE_DETAILS } from "../../elements/productTypes/productTypeDetails"; +import { createProductType } from "../../steps/productTypeSteps"; +import { assignElements } from "../../steps/shared/assignElements"; +import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; +import { visitAndWaitForProgressBarToDisappear } from "../../steps/shared/progressBar"; +import filterTests from "../../support/filterTests"; +import { productTypeDetailsUrl, urlList } from "../../url/urlList"; +import { deleteProductsStartsWith } from "../../utils/products/productsUtils"; + +filterTests(["all"], () => { + describe("Tests for product types", () => { + const startsWith = "ProductType"; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteProductsStartsWith(startsWith); + createAttribute({ name: startsWith }); + }); + + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.productTypes) + .softExpectSkeletonIsVisible(); + }); + + it("Create product type without shipping required", () => { + const name = `${startsWith}${faker.datatype.number()}`; + + createProductType(name, false) + .then(productType => { + getProductType(productType.id); + }) + .then(productType => { + expect(productType.name).to.be.eq(name); + expect(productType.isShippingRequired).to.be.false; + }); + }); + + it("Create product type with shipping required", () => { + const name = `${startsWith}${faker.datatype.number()}`; + const shippingWeight = 10; + + createProductType(name, shippingWeight) + .then(productType => { + getProductType(productType.id); + }) + .then(productType => { + expect(productType.name).to.be.eq(name); + expect(productType.isShippingRequired).to.be.true; + expect(productType.weight.value).to.eq(shippingWeight); + }); + }); + + it("Update product type with product attribute", () => { + const name = `${startsWith}${faker.datatype.number()}`; + + createTypeProduct({ name }) + .then(productType => { + visitAndWaitForProgressBarToDisappear( + productTypeDetailsUrl(productType.id) + ) + .get(PRODUCT_TYPE_DETAILS.assignProductAttributeButton) + .click(); + cy.addAliasToGraphRequest("AssignProductAttribute"); + assignElements(startsWith, false); + confirmationMessageShouldDisappear(); + cy.wait("@AssignProductAttribute"); + getProductType(productType.id); + }) + .then(productType => { + expect(productType.productAttributes[0].name).to.eq(startsWith); + }); + }); + + it("Update product type with variant attribute", () => { + const name = `${startsWith}${faker.datatype.number()}`; + + createTypeProduct({ name, hasVariants: false }) + .then(productType => { + visitAndWaitForProgressBarToDisappear( + productTypeDetailsUrl(productType.id) + ) + .get(PRODUCT_TYPE_DETAILS.hasVariantsButton) + .click() + .get(PRODUCT_TYPE_DETAILS.assignVariantAttributeButton) + .click(); + cy.addAliasToGraphRequest("AssignProductAttribute"); + assignElements(startsWith, false); + confirmationMessageShouldDisappear(); + cy.wait("@AssignProductAttribute"); + getProductType(productType.id); + }) + .then(productType => { + expect(productType.variantAttributes[0].name).to.eq(startsWith); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/shippingMethods/channelsInShipping.js b/cypress/integration/configuration/shippingMethods/channelsInShipping.js new file mode 100644 index 000000000..891aa8124 --- /dev/null +++ b/cypress/integration/configuration/shippingMethods/channelsInShipping.js @@ -0,0 +1,129 @@ +// +import faker from "faker"; + +import { createChannel } from "../../../apiRequests/Channels"; +import { + addChannelToShippingMethod, + addChannelToShippingZone +} from "../../../apiRequests/ShippingMethod"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; +import { SHIPPING_ZONE_DETAILS } from "../../../elements/shipping/shipping-zone-details"; +import { selectChannelInHeader } from "../../../steps/channelsSteps"; +import { waitForProgressBarToNotExist } from "../../../steps/shared/progressBar"; +import filterTests from "../../../support/filterTests"; +import { getFormattedCurrencyAmount } from "../../../support/format/formatCurrencyAmount"; +import { urlList } from "../../../url/urlList"; +import * as channelsUtils from "../../../utils/channelsUtils"; +import * as shippingUtils from "../../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Channels in shippingMethod", () => { + const startsWith = "ChannelShippingMethod"; + let defaultChannel; + let plAddress; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + shippingUtils.deleteShippingStartsWith(startsWith); + channelsUtils.deleteChannelsStartsWith(startsWith); + + channelsUtils + .getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(addresses => { + plAddress = addresses.plAddress; + }); + }); + + it("should display different price for each channel", () => { + const shippingName = `${startsWith}${faker.datatype.number()}`; + const defaultChannelPrice = 11; + const createdChannelPrice = 7; + const createdChannelCurrency = "PLN"; + + let shippingMethod; + let shippingZone; + let createdChannel; + + cy.clearSessionData().loginUserViaRequest(); + createChannel({ + name: shippingName, + currencyCode: createdChannelCurrency + }) + .then(channel => { + createdChannel = channel; + shippingUtils.createShipping({ + channelId: defaultChannel.id, + name: shippingName, + address: plAddress, + price: defaultChannelPrice + }); + }) + .then( + ({ + shippingMethod: shippingMethodResp, + shippingZone: shippingZoneResp + }) => { + shippingZone = shippingZoneResp; + shippingMethod = shippingMethodResp; + addChannelToShippingZone(shippingZone.id, createdChannel.id).then( + () => { + addChannelToShippingMethod( + shippingMethod.id, + createdChannel.id, + createdChannelPrice + ); + } + ); + } + ) + .then(() => { + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.shipping) + .visit(urlList.shippingMethods) + .get(SHARED_ELEMENTS.header) + .should("be.visible"); + waitForProgressBarToNotExist(); + cy.addAliasToGraphRequest("ShippingZone"); + cy.getTextFromElement(SHARED_ELEMENTS.table); + }) + .then(tableText => { + if (!tableText.includes(shippingZone.name)) { + cy.get(BUTTON_SELECTORS.nextPaginationButton).click(); + } + cy.contains(shippingZone.name).click(); + cy.wait("@ShippingZone"); + selectChannelInHeader(defaultChannel.name); + cy.getTextFromElement( + SHIPPING_ZONE_DETAILS.shippingRatePriceTableCell + ) + .then(text => { + const expectedValue = getFormattedCurrencyAmount( + defaultChannelPrice, + defaultChannel.currencyCode + ); + expect(text).to.be.eq(expectedValue); + + selectChannelInHeader(createdChannel.name); + }) + .then(() => { + cy.getTextFromElement( + SHIPPING_ZONE_DETAILS.shippingRatePriceTableCell + ); + }) + .then(text => { + const expectedValue = getFormattedCurrencyAmount( + createdChannelPrice, + createdChannelCurrency + ); + expect(text).to.be.eq(expectedValue); + }); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/shippingMethods/createShippingMethod.js b/cypress/integration/configuration/shippingMethods/createShippingMethod.js new file mode 100644 index 000000000..f1129df44 --- /dev/null +++ b/cypress/integration/configuration/shippingMethods/createShippingMethod.js @@ -0,0 +1,144 @@ +// +import faker from "faker"; + +import { createCheckout } from "../../../apiRequests/Checkout"; +import { createWarehouse } from "../../../apiRequests/Warehouse"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { + createShippingRate, + createShippingZone, + rateOptions +} from "../../../steps/shippingMethodSteps"; +import filterTests from "../../../support/filterTests"; +import { urlList } from "../../../url/urlList"; +import * as channelsUtils from "../../../utils/channelsUtils"; +import * as productsUtils from "../../../utils/products/productsUtils"; +import * as shippingUtils from "../../../utils/shippingUtils"; +import { isShippingAvailableInCheckout } from "../../../utils/storeFront/checkoutUtils"; + +filterTests(["all"], () => { + describe("Create shipping method", () => { + const startsWith = "CreateShippingMethods-"; + const name = `${startsWith}${faker.datatype.number()}`; + const price = 8; + const deliveryTime = { min: 2, max: 5 }; + let defaultChannel; + let plAddress; + let variantsList; + let warehouse; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productsUtils.deleteProductsStartsWith(startsWith); + shippingUtils.deleteShippingStartsWith(startsWith); + + channelsUtils + .getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(addresses => { + plAddress = addresses.plAddress; + createWarehouse({ name, address: plAddress }); + }) + .then(warehouseResp => { + warehouse = warehouseResp; + productsUtils.createTypeAttributeAndCategoryForProduct(startsWith); + }) + .then( + ({ + productType: productTypeResp, + category: categoryResp, + attribute: attributeResp + }) => { + productsUtils.createProductInChannel({ + name, + channelId: defaultChannel.id, + productTypeId: productTypeResp.id, + attributeId: attributeResp.id, + categoryId: categoryResp.id, + warehouseId: warehouse.id, + quantityInWarehouse: 10 + }); + } + ) + .then(({ variantsList: variantsListResp }) => { + variantsList = variantsListResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create price based shipping method", () => { + const shippingName = `${startsWith}${faker.datatype.number()}`; + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.shipping + ); + cy.visit(urlList.shippingMethods).softExpectSkeletonIsVisible(); + createShippingZone( + shippingName, + warehouse.name, + plAddress.countryFullName, + defaultChannel.name + ); + createShippingRate({ + rateName: shippingName, + price, + rateOption: rateOptions.PRICE_OPTION, + deliveryTime + }); + + createCheckout({ + channelSlug: defaultChannel.slug, + email: "test@example.com", + variantsList, + address: plAddress, + auth: "token" + }).then(({ checkout }) => { + const isShippingAvailable = isShippingAvailableInCheckout( + checkout, + shippingName + ); + expect(isShippingAvailable).to.be.true; + }); + }); + + it("should create weight based shipping method", () => { + const shippingName = `${startsWith}${faker.datatype.number()}`; + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.shipping + ); + cy.visit(urlList.shippingMethods).softExpectSkeletonIsVisible(); + createShippingZone( + shippingName, + warehouse.name, + plAddress.countryFullName, + defaultChannel.name + ); + createShippingRate({ + rateName: shippingName, + price, + rateOption: rateOptions.WEIGHT_OPTION, + deliveryTime + }); + createCheckout({ + channelSlug: defaultChannel.slug, + email: "test@example.com", + variantsList, + address: plAddress, + auth: "token" + }).then(({ checkout }) => { + const isShippingAvailable = isShippingAvailableInCheckout( + checkout, + shippingName + ); + expect(isShippingAvailable).to.be.true; + }); + }); + }); +}); diff --git a/cypress/integration/configuration/shippingMethods/postalCodes.js b/cypress/integration/configuration/shippingMethods/postalCodes.js new file mode 100644 index 000000000..08ff31bdd --- /dev/null +++ b/cypress/integration/configuration/shippingMethods/postalCodes.js @@ -0,0 +1,137 @@ +// +import faker from "faker"; + +import { createCheckout } from "../../../apiRequests/Checkout"; +import { createShippingZone } from "../../../apiRequests/ShippingMethod"; +import { createWarehouse } from "../../../apiRequests/Warehouse"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { + createRateWithPostalCode, + postalCodesOptions +} from "../../../steps/shippingMethodSteps"; +import filterTests from "../../../support/filterTests"; +import { shippingZoneDetailsUrl } from "../../../url/urlList"; +import { getDefaultChannel } from "../../../utils/channelsUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../../utils/products/productsUtils"; +import { deleteShippingStartsWith } from "../../../utils/shippingUtils"; +import { isShippingAvailableInCheckout } from "../../../utils/storeFront/checkoutUtils"; + +filterTests(["all"], () => { + describe("Postal codes in shipping", () => { + const startsWith = "CyShippingMethods-"; + const name = `${startsWith}${faker.datatype.number()}`; + + const price = 10; + + let defaultChannel; + let usAddress; + let secondUsAddress; + let shippingZone; + let warehouse; + let variantsList; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteShippingStartsWith(startsWith); + deleteProductsStartsWith(startsWith); + + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then( + ({ + usAddress: usAddressResp, + secondUsAddress: secondUsAddressResp + }) => { + usAddress = usAddressResp; + secondUsAddress = secondUsAddressResp; + createShippingZone(name, "US", defaultChannel.id); + } + ) + .then(shippingZoneResp => { + shippingZone = shippingZoneResp; + createWarehouse({ + name, + shippingZone: shippingZone.id, + address: usAddress + }); + }) + .then(warehouseResp => { + warehouse = warehouseResp; + createTypeAttributeAndCategoryForProduct(name); + }) + .then(({ attribute, productType, category }) => { + createProductInChannel({ + name, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id + }); + }) + .then(({ variantsList: variantsListResp }) => { + variantsList = variantsListResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.shipping) + .visit(shippingZoneDetailsUrl(shippingZone.id)); + }); + + it("Create shipping method with included postal codes", () => { + const rateName = `${startsWith}${faker.datatype.number()}`; + + createRateWithPostalCode({ + rateName, + price, + postalCodeOption: postalCodesOptions.INCLUDE_OPTION, + maxPostalCode: usAddress.postalCode, + minPostalCode: usAddress.postalCode + }); + isShippingAvailableForAddress(usAddress, rateName).then( + isAvailable => expect(isAvailable).to.be.true + ); + isShippingAvailableForAddress(secondUsAddress, rateName).then( + isAvailable => expect(isAvailable).to.be.false + ); + }); + + it("Create shipping method with excluded postal codes", () => { + const rateName = `${startsWith}${faker.datatype.number()}`; + + createRateWithPostalCode({ + rateName, + price, + postalCodeOption: postalCodesOptions.EXCLUDE_OPTION, + maxPostalCode: usAddress.postalCode, + minPostalCode: usAddress.postalCode + }); + isShippingAvailableForAddress(usAddress, rateName).then( + isAvailable => expect(isAvailable).to.be.false + ); + isShippingAvailableForAddress(secondUsAddress, rateName).then( + isAvailable => expect(isAvailable).to.be.true + ); + }); + + function isShippingAvailableForAddress(address, rateName) { + return createCheckout({ + address, + channelSlug: defaultChannel.slug, + email: "example@example.com", + variantsList + }).then(({ checkout }) => + isShippingAvailableInCheckout(checkout, rateName) + ); + } + }); +}); diff --git a/cypress/integration/configuration/shippingMethods/shippingWeight.js b/cypress/integration/configuration/shippingMethods/shippingWeight.js new file mode 100644 index 000000000..c38244d6e --- /dev/null +++ b/cypress/integration/configuration/shippingMethods/shippingWeight.js @@ -0,0 +1,190 @@ +// +import faker from "faker"; + +import { createCheckout } from "../../../apiRequests/Checkout"; +import { + createShippingRate as createShippingRateViaApi, + createShippingZone +} from "../../../apiRequests/ShippingMethod"; +import { updateShopWeightUnit } from "../../../apiRequests/shopSettings"; +import { createWarehouse } from "../../../apiRequests/Warehouse"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; +import { SHIPPING_RATE_DETAILS } from "../../../elements/shipping/shipping-rate-details"; +import { + changeWeightUnit, + createShippingRate, + rateOptions +} from "../../../steps/shippingMethodSteps"; +import filterTests from "../../../support/filterTests"; +import { + shippingZoneDetailsUrl, + urlList, + weightRateUrl +} from "../../../url/urlList"; +import { getDefaultChannel } from "../../../utils/channelsUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../../utils/products/productsUtils"; +import { deleteShippingStartsWith } from "../../../utils/shippingUtils"; +import { isShippingAvailableInCheckout } from "../../../utils/storeFront/checkoutUtils"; + +filterTests(["all"], () => { + describe("Shipping weight limits", () => { + const startsWith = "CyWeightRates-"; + const name = `${startsWith}${faker.datatype.number()}`; + + const price = 10; + + let defaultChannel; + let usAddress; + let shippingZone; + let warehouse; + let variantsList; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteShippingStartsWith(startsWith); + deleteProductsStartsWith(startsWith); + + updateShopWeightUnit("KG"); + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(({ usAddress: usAddressResp }) => { + usAddress = usAddressResp; + createShippingZone(name, "US", defaultChannel.id); + }) + .then(shippingZoneResp => { + shippingZone = shippingZoneResp; + createWarehouse({ + name, + shippingZone: shippingZone.id, + address: usAddress + }); + }) + .then(warehouseResp => { + warehouse = warehouseResp; + createTypeAttributeAndCategoryForProduct(name); + }) + .then(({ attribute, productType, category }) => { + createProductInChannel({ + name, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id, + weight: 10 + }); + }) + .then(({ variantsList: variantsListResp }) => { + variantsList = variantsListResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.shipping) + .visit(shippingZoneDetailsUrl(shippingZone.id)); + }); + + it("should be possible to buy product in a shipping weight limits", () => { + const rateName = `${startsWith}${faker.datatype.number()}`; + createShippingRate({ + rateName, + price, + rateOption: rateOptions.WEIGHT_OPTION, + weightLimits: { + max: 11, + min: 10 + } + }); + createCheckout({ + address: usAddress, + channelSlug: defaultChannel.slug, + email: "example@example.com", + variantsList + }).then(({ checkout }) => { + expect(isShippingAvailableInCheckout(checkout, rateName)).to.be.true; + }); + }); + + it("should not be possible to buy product not in a shipping weight limits", () => { + const rateName = `${startsWith}${faker.datatype.number()}`; + createShippingRate({ + rateName, + price, + rateOption: rateOptions.WEIGHT_OPTION, + weightLimits: { + max: 101, + min: 100 + } + }); + createCheckout({ + address: usAddress, + channelSlug: defaultChannel.slug, + email: "example@example.com", + variantsList + }).then(({ checkout }) => { + expect(isShippingAvailableInCheckout(checkout, rateName)).to.be.false; + }); + }); + + // Log in as user with shipping permissions after resolving SALEOR-3407 bug + it("should recalculate weight after changing shipping weight unit", () => { + const rateName = `${startsWith}${faker.datatype.number()}`; + const minWeightInKg = 1; + const maxWeightInKg = 10; + const minWeightInG = minWeightInKg * 1000; + const maxWeightInG = maxWeightInKg * 1000; + let shippingMethod; + + cy.clearSessionData().loginUserViaRequest(); + + createShippingRateViaApi({ + name: rateName, + shippingZone: shippingZone.id, + type: "WEIGHT", + maxWeight: maxWeightInKg, + minWeight: minWeightInKg + }) + .then(({ shippingMethod: shippingMethodResp }) => { + shippingMethod = shippingMethodResp; + cy.visit(urlList.shippingMethods) + .get(SHARED_ELEMENTS.progressBar) + .should("not.exist"); + changeWeightUnit("G"); + + cy.addAliasToGraphRequest("ShippingZone"); + cy.visit(weightRateUrl(shippingZone.id, shippingMethod.id)) + .wait("@ShippingZone") + .its("response.body"); + }) + .then(responseArray => { + const shippingMethods = responseArray.find( + element => element.data.shippingZone + ).data.shippingZone.shippingMethods; + const rate = shippingMethods.find( + element => element.id === shippingMethod.id + ); + expect(rate.minimumOrderWeight.unit).to.eq("G"); + cy.get(SHARED_ELEMENTS.progressBar) + .should("not.be.visible") + .get(SHIPPING_RATE_DETAILS.minWeightInput) + .invoke("val"); + }) + .then(actualMinWeight => { + expect(parseInt(actualMinWeight, 10)).to.eq(minWeightInG); + cy.get(SHIPPING_RATE_DETAILS.maxWeightInput).invoke("val"); + }) + .then(actualMaxWeight => { + expect(parseInt(actualMaxWeight, 10)).to.eq(maxWeightInG); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/siteSettings.js b/cypress/integration/configuration/siteSettings.js new file mode 100644 index 000000000..0ab1e6de3 --- /dev/null +++ b/cypress/integration/configuration/siteSettings.js @@ -0,0 +1,78 @@ +import faker from "faker"; + +import { getShopInfo, updateShopAddress } from "../../apiRequests/shopSettings"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SITE_SETTINGS_DETAILS } from "../../elements/siteSettings/site-settings-details"; +import { fillUpBasicAddress } from "../../steps/shared/addressForm"; +import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; + +filterTests(["all"], () => { + describe("Tests for site settings", () => { + let address; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + cy.fixture("addresses").then(({ usAddress, plAddress }) => { + address = usAddress; + updateShopAddress(plAddress); + }); + }); + + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.siteSettings); + }); + + it("should change store name", () => { + const name = `Cypress-${faker.datatype.number()}`; + + cy.get(SITE_SETTINGS_DETAILS.nameInput) + .clearAndType(name) + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + getShopInfo().then(shopInfo => { + expect(shopInfo.name).to.eq(name); + }); + }); + + it("should change site url", () => { + const url = `http://cypress${faker.datatype.number()}.saleor.com`; + + cy.get(SITE_SETTINGS_DETAILS.urlInput) + .clearAndType(url) + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + getShopInfo().then(shopInfo => { + expect(shopInfo.domain.host).to.eq(url); + }); + }); + + it("should change store description", () => { + const description = faker.lorem.sentence(); + + cy.get(SITE_SETTINGS_DETAILS.descriptionInput) + .clearAndType(description) + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + getShopInfo().then(shopInfo => { + expect(shopInfo.description).to.eq(description); + }); + }); + + it("should change store address", () => { + fillUpBasicAddress(address); + cy.get(BUTTON_SELECTORS.confirm).click(); + confirmationMessageShouldDisappear(); + getShopInfo().then(({ companyAddress }) => { + expect(companyAddress.companyName).to.eq(address.companyName); + cy.expectCorrectBasicAddress(companyAddress, address); + }); + }); + }); +}); diff --git a/cypress/integration/configuration/warehouse.js b/cypress/integration/configuration/warehouse.js new file mode 100644 index 000000000..06605dabc --- /dev/null +++ b/cypress/integration/configuration/warehouse.js @@ -0,0 +1,115 @@ +// +import faker from "faker"; + +import { createShippingZone } from "../../apiRequests/ShippingMethod"; +import { createWarehouse, getWarehouse } from "../../apiRequests/Warehouse"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHIPPING_ZONE_DETAILS } from "../../elements/shipping/shipping-zone-details"; +import { WAREHOUSES_DETAILS } from "../../elements/warehouses/warehouse-details"; +import { WAREHOUSES_LIST } from "../../elements/warehouses/warehouses-list"; +import { fillUpBasicAddress } from "../../steps/shared/addressForm"; +import { fillAutocompleteSelect } from "../../steps/shared/selects"; +import filterTests from "../../support/filterTests"; +import { + shippingZoneDetailsUrl, + urlList, + warehouseDetailsUrl +} from "../../url/urlList"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import { deleteShippingStartsWith } from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Warehouse settings", () => { + const startsWith = "CyWarehouse"; + let usAddress; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteShippingStartsWith(startsWith); + cy.fixture("addresses").then(addresses => { + usAddress = addresses.usAddress; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create warehouse", () => { + const name = `${startsWith}${faker.datatype.number()}`; + cy.visit(urlList.warehouses) + .get(WAREHOUSES_LIST.createNewButton) + .click(); + cy.get(WAREHOUSES_DETAILS.nameInput).type(name); + fillUpBasicAddress(usAddress); + cy.addAliasToGraphRequest("WarehouseCreate") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@WarehouseCreate") + .its("response.body.data.createWarehouse.warehouse") + .then(warehouse => { + getWarehouse(warehouse.id); + }) + .then(warehouse => { + const addressResp = warehouse.address; + chai.softExpect(warehouse.name).to.be.eq(name); + cy.expectCorrectBasicAddress(addressResp, usAddress); + }); + }); + + it("should add warehouse to shipping zone", () => { + const name = `${startsWith}${faker.datatype.number()}`; + let defaultChannel; + let warehouse; + let shippingZone; + + getDefaultChannel() + .then(channelResp => { + defaultChannel = channelResp; + createWarehouse({ + name, + address: usAddress + }); + }) + .then(warehouseResp => { + warehouse = warehouseResp; + createShippingZone(name, "US", defaultChannel.id); + }) + .then(shippingZoneResp => { + shippingZone = shippingZoneResp; + cy.visit(shippingZoneDetailsUrl(shippingZone.id)); + fillAutocompleteSelect( + SHIPPING_ZONE_DETAILS.warehouseSelector, + warehouse.name + ); + cy.addAliasToGraphRequest("UpdateShippingZone") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@UpdateShippingZone"); + getWarehouse(warehouse.id); + }) + .then(warehouseResp => { + expect(warehouseResp.shippingZones.edges[0].node.id).to.be.eq( + shippingZone.id + ); + }); + }); + + it("should delete warehouse", () => { + const name = `${startsWith}${faker.datatype.number()}`; + createWarehouse({ + name, + address: usAddress + }).then(warehouse => { + cy.visit(warehouseDetailsUrl(warehouse.id)) + .get(BUTTON_SELECTORS.deleteButton) + .click() + .addAliasToGraphRequest("WarehouseDelete") + .get(BUTTON_SELECTORS.submit) + .click() + .wait("@WarehouseDelete"); + getWarehouse(warehouse.id).should("be.null"); + }); + }); + }); +}); diff --git a/cypress/integration/customerRegistration.js b/cypress/integration/customerRegistration.js new file mode 100644 index 000000000..5918f72d1 --- /dev/null +++ b/cypress/integration/customerRegistration.js @@ -0,0 +1,85 @@ +import faker from "faker"; + +import { confirmAccount, customerRegistration } from "../apiRequests/Customer"; +import { CUSTOMER_DETAILS } from "../elements/customers/customer-details"; +import { BUTTON_SELECTORS } from "../elements/shared/button-selectors"; +import { confirmationMessageShouldDisappear } from "../steps/shared/confirmationMessage"; +import filterTests from "../support/filterTests"; +import { customerDetailsUrl } from "../url/urlList"; +import { getDefaultChannel } from "../utils/channelsUtils"; +import { getMailActivationLinkForUser } from "../utils/users"; + +describe("Tests for customer registration", () => { + const startsWith = "Registration"; + const email = `${startsWith}${faker.datatype.number()}@example.com`; + + let defaultChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + getDefaultChannel().then(channel => { + defaultChannel = channel; + }); + }); + + filterTests(["stagedOnly"], () => { + it("should register customer", () => { + const email = `${startsWith}${faker.datatype.number()}@example.com`; + customerRegistration({ email, channel: defaultChannel.slug }); + getMailActivationLinkForUser(email) + .then(urlLink => { + const tokenRegex = /token=(.*)/; + const token = urlLink.match(tokenRegex)[1]; + cy.clearSessionData(); + confirmAccount(email, token); + }) + .then(() => { + cy.loginUserViaRequest("token", { + email, + password: Cypress.env("USER_PASSWORD") + }).its("body.data.tokenCreate"); + }) + .then(({ errors, token }) => { + expect(errors.length).to.eq(0); + expect(token).to.be.ok; + }); + }); + }); + + filterTests(["all"], () => { + it("shouldn't register customer with duplicated email", () => { + const duplicatedEmail = Cypress.env("USER_NAME"); + customerRegistration({ + duplicatedEmail, + channel: defaultChannel.slug + }).then(({ user, errors }) => { + expect(errors[0].field).to.eq("email"); + expect(user).to.not.be.ok; + }); + }); + + it("should activate customer from dashboard", () => { + customerRegistration({ email, channel: defaultChannel.slug }) + .then(({ user }) => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(customerDetailsUrl(user.id)) + .get(CUSTOMER_DETAILS.isActiveCheckbox) + .click() + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + cy.clearSessionData() + .loginUserViaRequest("token", { + email, + password: Cypress.env("USER_PASSWORD") + }) + .its("body.data.tokenCreate"); + }) + .then(({ token, errors }) => { + expect(errors.length).to.eq(0); + expect(token).to.be.ok; + }); + }); + }); +}); diff --git a/cypress/integration/discounts/sales.js b/cypress/integration/discounts/sales.js new file mode 100644 index 000000000..61f360329 --- /dev/null +++ b/cypress/integration/discounts/sales.js @@ -0,0 +1,201 @@ +// + +import faker from "faker"; + +import { createChannel } from "../../apiRequests/Channels"; +import { updateChannelInProduct } from "../../apiRequests/Product"; +import { + assignProducts, + createSale, + discountOptions +} from "../../steps/discounts/salesSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import * as channelsUtils from "../../utils/channelsUtils"; +import { deleteSalesStartsWith } from "../../utils/discounts/salesUtils"; +import * as productsUtils from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; +import { getProductPrice } from "../../utils/storeFront/storeFrontProductUtils"; + +filterTests(["all"], () => { + describe("Sales discounts", () => { + const startsWith = "CySales-"; + + let productType; + let attribute; + let category; + let defaultChannel; + let warehouse; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + channelsUtils.deleteChannelsStartsWith(startsWith); + deleteSalesStartsWith(startsWith); + productsUtils.deleteProductsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + + const name = `${startsWith}${faker.datatype.number()}`; + productsUtils + .createTypeAttributeAndCategoryForProduct(name) + .then( + ({ + productType: productTypeResp, + attribute: attributeResp, + category: categoryResp + }) => { + productType = productTypeResp; + attribute = attributeResp; + category = categoryResp; + + channelsUtils.getDefaultChannel(); + } + ) + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(addresses => { + createShipping({ + channelId: defaultChannel.id, + name, + address: addresses.plAddress, + price: 100 + }); + }) + .then(({ warehouse: warehouseResp }) => { + warehouse = warehouseResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create percentage discount", () => { + const saleName = `${startsWith}${faker.datatype.number()}`; + const discountValue = 50; + const productPrice = 100; + + productsUtils + .createProductInChannel({ + name: saleName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price: productPrice + }) + .then(({ product: productResp }) => { + /* Uncomment after fixing SALEOR-3367 bug + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) + */ + + cy.visit(urlList.sales); + cy.softExpectSkeletonIsVisible(); + const product = productResp; + createSale({ + saleName, + channelName: defaultChannel.name, + discountValue, + discountOption: discountOptions.PERCENTAGE + }); + assignProducts(product.name); + getProductPrice(product.id, defaultChannel.slug); + }) + .then(price => { + const expectedPrice = (productPrice * discountValue) / 100; + expect(expectedPrice).to.be.eq(price); + }); + }); + + it("should create fixed price discount", () => { + const saleName = `${startsWith}${faker.datatype.number()}`; + const discountValue = 50; + const productPrice = 100; + + productsUtils + .createProductInChannel({ + name: saleName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price: productPrice + }) + .then(({ product: productResp }) => { + /* Uncomment after fixing SALEOR-3367 bug + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) + */ + + cy.visit(urlList.sales); + cy.softExpectSkeletonIsVisible(); + const product = productResp; + createSale({ + saleName, + channelName: defaultChannel.name, + discountValue, + discountOption: discountOptions.FIXED + }); + assignProducts(product.name); + getProductPrice(product.id, defaultChannel.slug); + }) + .then(price => { + const expectedPrice = productPrice - discountValue; + expect(expectedPrice).to.be.eq(price); + }); + }); + + it("should not displayed discount not assign to channel", () => { + const saleName = `${startsWith}${faker.datatype.number()}`; + let channel; + let product; + const discountValue = 50; + const productPrice = 100; + + createChannel({ name: saleName }).then( + channelResp => (channel = channelResp) + ); + productsUtils + .createProductInChannel({ + name: saleName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price: productPrice + }) + .then(({ product: productResp }) => { + product = productResp; + updateChannelInProduct({ + productId: product.id, + channelId: channel.id + }); + }) + .then(() => { + /* Uncomment after fixing SALEOR-3367 bug + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) + */ + + cy.visit(urlList.sales); + cy.softExpectSkeletonIsVisible(); + createSale({ + saleName, + channelName: channel.name, + discountValue + }); + assignProducts(product.name); + getProductPrice(product.id, defaultChannel.slug); + }) + .then(price => expect(price).to.equal(productPrice)); + }); + }); +}); diff --git a/cypress/integration/discounts/vouchers.js b/cypress/integration/discounts/vouchers.js new file mode 100644 index 000000000..eba0deda1 --- /dev/null +++ b/cypress/integration/discounts/vouchers.js @@ -0,0 +1,182 @@ +// +import faker from "faker"; + +import { createChannel } from "../../apiRequests/Channels"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { + createVoucher, + discountOptions +} from "../../steps/discounts/vouchersSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import * as channelsUtils from "../../utils/channelsUtils"; +import { deleteVouchersStartsWith } from "../../utils/discounts/vouchersUtils"; +import { createCheckoutWithVoucher } from "../../utils/ordersUtils"; +import * as productsUtils from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Vouchers discounts", () => { + const startsWith = "CyVou-"; + const productPrice = 100; + const shippingPrice = 100; + + let defaultChannel; + let createdChannel; + let productType; + let attribute; + let category; + let shippingMethod; + let variants; + let address; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + channelsUtils.deleteChannelsStartsWith(startsWith); + productsUtils.deleteProductsStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + deleteVouchersStartsWith(startsWith); + + const name = `${startsWith}${faker.datatype.number()}`; + + productsUtils + .createTypeAttributeAndCategoryForProduct(name) + .then( + ({ + productType: productTypeResp, + attribute: attributeResp, + category: categoryResp + }) => { + productType = productTypeResp; + attribute = attributeResp; + category = categoryResp; + + channelsUtils.getDefaultChannel(); + } + ) + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(addresses => { + address = addresses.plAddress; + createShipping({ + channelId: defaultChannel.id, + name, + address, + price: shippingPrice + }); + }) + .then( + ({ shippingMethod: shippingMethodResp, warehouse: warehouse }) => { + shippingMethod = shippingMethodResp; + productsUtils.createProductInChannel({ + name, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price: productPrice + }); + } + ) + .then(({ variantsList: variantsResp }) => { + variants = variantsResp; + createChannel({ name }); + }) + .then(channel => { + createdChannel = channel; + }); + }); + + it("should create percentage voucher", () => { + const voucherValue = 50; + + loginAndCreateCheckoutForVoucherWithDiscount( + discountOptions.PERCENTAGE, + voucherValue + ).then(amount => { + const expectedAmount = + (productPrice * voucherValue) / 100 + shippingPrice; + expect(amount).to.be.eq(expectedAmount); + }); + }); + + it("should create fixed price voucher", () => { + const voucherValue = 50; + loginAndCreateCheckoutForVoucherWithDiscount( + discountOptions.FIXED, + voucherValue + ).then(amount => { + const expectedAmount = productPrice + shippingPrice - voucherValue; + expect(amount).to.be.eq(expectedAmount); + }); + }); + + it("should create free shipping voucher", () => { + loginAndCreateCheckoutForVoucherWithDiscount( + discountOptions.SHIPPING, + null + ).then(amount => { + const expectedAmount = productPrice; + expect(amount).to.be.eq(expectedAmount); + }); + }); + + it("should create voucher not available for selected channel", () => { + const randomName = `${startsWith}${faker.datatype.number()}`; + const voucherValue = 50; + + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.vouchers); + cy.softExpectSkeletonIsVisible(); + createVoucher({ + voucherCode: randomName, + voucherValue, + discountOption: discountOptions.PERCENTAGE, + channelName: createdChannel.name + }); + createCheckoutForCreatedVoucher(randomName).then(resp => { + const errorField = resp.checkoutErrors[0].field; + expect(errorField).to.be.eq("promoCode"); + }); + }); + + function createCheckoutForCreatedVoucher(voucherCode) { + return createCheckoutWithVoucher({ + channelSlug: defaultChannel.slug, + variantsList: variants, + address, + shippingMethodId: shippingMethod.id, + voucherCode, + auth: "token" + }); + } + + function loginAndCreateCheckoutForVoucherWithDiscount( + discount, + voucherValue + ) { + const voucherCode = `${startsWith}${faker.datatype.number()}`; + + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.discount) + .visit(urlList.vouchers); + cy.softExpectSkeletonIsVisible(); + createVoucher({ + voucherCode, + voucherValue, + discountOption: discount, + channelName: defaultChannel.name + }); + return createCheckoutForCreatedVoucher(voucherCode).its( + "checkout.totalPrice.gross.amount" + ); + } + }); +}); diff --git a/cypress/integration/homePage/homePage.js b/cypress/integration/homePage/homePage.js new file mode 100644 index 000000000..b29dec296 --- /dev/null +++ b/cypress/integration/homePage/homePage.js @@ -0,0 +1,22 @@ +import { TEST_ADMIN_USER, USER_WITHOUT_NAME } from "../../Data/users"; +import { expectWelcomeMessageIncludes } from "../../steps/homePageSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; + +filterTests(["all"], () => { + describe("Displaying welcome message on home page", () => { + it("should display user name on home page", () => { + cy.loginUserViaRequest(); + cy.visit(urlList.homePage); + expectWelcomeMessageIncludes( + `${TEST_ADMIN_USER.name} ${TEST_ADMIN_USER.lastName}` + ); + }); + + it("should display user email on home page", () => { + cy.loginUserViaRequest("auth", USER_WITHOUT_NAME); + cy.visit(urlList.homePage); + expectWelcomeMessageIncludes(`${USER_WITHOUT_NAME.email}`); + }); + }); +}); diff --git a/cypress/integration/homePage/homePageAnalitics.js b/cypress/integration/homePage/homePageAnalitics.js new file mode 100644 index 000000000..337e02de6 --- /dev/null +++ b/cypress/integration/homePage/homePageAnalitics.js @@ -0,0 +1,262 @@ +import faker from "faker"; + +import { + createCustomer, + deleteCustomersStartsWith +} from "../../apiRequests/Customer"; +import { HOMEPAGE_SELECTORS } from "../../elements/homePage/homePage-selectors"; +import { changeChannel } from "../../steps/homePageSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import * as homePageUtils from "../../utils/homePageUtils"; +import { + createReadyToFulfillOrder, + createWaitingForCaptureOrder +} from "../../utils/ordersUtils"; +import * as productsUtils from "../../utils/products/productsUtils"; +import * as shippingUtils from "../../utils/shippingUtils"; + +// + +filterTests(["all", "critical"], () => { + describe("Homepage analytics", () => { + const startsWith = "CyHomeAnalytics"; + + let customerId; + let defaultChannel; + let createdVariants; + let productType; + let attribute; + let category; + let warehouse; + let shippingMethod; + let addresses; + + const productPrice = 22; + const shippingPrice = 12; + const randomName = startsWith + faker.datatype.number(); + const randomEmail = `${startsWith}${randomName}@example.com`; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productsUtils.deleteProductsStartsWith(startsWith); + deleteCustomersStartsWith(startsWith); + shippingUtils.deleteShippingStartsWith(startsWith); + + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(addressesFixture => (addresses = addressesFixture)) + .then(() => + createCustomer(randomEmail, randomName, addresses.plAddress) + ) + .then(resp => { + customerId = resp.body.data.customerCreate.user.id; + shippingUtils.createShipping({ + channelId: defaultChannel.id, + name: randomName, + address: addresses.plAddress, + price: shippingPrice + }); + }) + .then( + ({ + warehouse: warehouseResp, + shippingMethod: shippingMethodResp + }) => { + warehouse = warehouseResp; + shippingMethod = shippingMethodResp; + productsUtils.createTypeAttributeAndCategoryForProduct(randomName); + } + ) + .then( + ({ + productType: productTypeResp, + attribute: attributeResp, + category: categoryResp + }) => { + productType = productTypeResp; + attribute = attributeResp; + category = categoryResp; + productsUtils.createProductInChannel({ + name: randomName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + quantityInWarehouse: 20, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price: productPrice + }); + } + ) + .then(({ variantsList: variantsResp }) => { + createdVariants = variantsResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should all elements be visible on the dashboard", () => { + cy.visit(urlList.homePage) + .softAssertVisibility(HOMEPAGE_SELECTORS.sales) + .softAssertVisibility(HOMEPAGE_SELECTORS.orders) + .softAssertVisibility(HOMEPAGE_SELECTORS.activity) + .softAssertVisibility(HOMEPAGE_SELECTORS.topProducts) + .softAssertVisibility(HOMEPAGE_SELECTORS.ordersReadyToFulfill) + .softAssertVisibility(HOMEPAGE_SELECTORS.paymentsWaitingForCapture) + .softAssertVisibility(HOMEPAGE_SELECTORS.productsOutOfStock); + }); + + it("should correct amount of ready to fullfil orders be displayed", () => { + homePageUtils + .getOrdersReadyToFulfill(defaultChannel.slug) + .as("ordersReadyToFulfill"); + createReadyToFulfillOrder({ + customerId, + shippingMethodId: shippingMethod.id, + channelId: defaultChannel.id, + variantsList: createdVariants, + address: addresses.plAddress + }); + cy.get("@ordersReadyToFulfill").then(ordersReadyToFulfillBefore => { + const allOrdersReadyToFulfill = ordersReadyToFulfillBefore + 1; + const notANumberRegex = "\\D*"; + const ordersReadyToFulfillRegexp = new RegExp( + `${notANumberRegex}${allOrdersReadyToFulfill}${notANumberRegex}` + ); + cy.visit(urlList.homePage); + changeChannel(defaultChannel.name); + cy.contains( + HOMEPAGE_SELECTORS.ordersReadyToFulfill, + ordersReadyToFulfillRegexp + ).should("be.visible"); + }); + }); + + it("should correct amount of payments waiting for capture be displayed", () => { + homePageUtils + .getOrdersReadyForCapture(defaultChannel.slug) + .as("ordersReadyForCapture"); + + createWaitingForCaptureOrder({ + channelSlug: defaultChannel.slug, + email: randomEmail, + variantsList: createdVariants, + shippingMethodId: shippingMethod.id, + address: addresses.plAddress + }); + + cy.get("@ordersReadyForCapture").then(ordersReadyForCaptureBefore => { + const allOrdersReadyForCapture = ordersReadyForCaptureBefore + 1; + const notANumberRegex = "\\D*"; + const ordersReadyForCaptureRegexp = new RegExp( + `${notANumberRegex}${allOrdersReadyForCapture}${notANumberRegex}` + ); + cy.visit(urlList.homePage); + changeChannel(defaultChannel.name); + cy.contains( + HOMEPAGE_SELECTORS.ordersReadyForCapture, + ordersReadyForCaptureRegexp + ).should("be.visible"); + }); + }); + + it("should correct amount of products out of stock be displayed", () => { + homePageUtils + .getProductsOutOfStock(defaultChannel.slug) + .as("productsOutOfStock"); + const productOutOfStockRandomName = startsWith + faker.datatype.number(); + + productsUtils.createProductInChannel({ + name: productOutOfStockRandomName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + quantityInWarehouse: 0, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price: productPrice + }); + + cy.get("@productsOutOfStock").then(productsOutOfStockBefore => { + const allProductsOutOfStock = productsOutOfStockBefore + 1; + const notANumberRegex = "\\D*"; + const productsOutOfStockRegexp = new RegExp( + `${notANumberRegex}${allProductsOutOfStock}${notANumberRegex}` + ); + cy.visit(urlList.homePage); + changeChannel(defaultChannel.name); + cy.contains( + HOMEPAGE_SELECTORS.productsOutOfStock, + productsOutOfStockRegexp + ).should("be.visible"); + }); + }); + + it("should correct amount of sales be displayed", () => { + homePageUtils.getSalesAmount(defaultChannel.slug).as("salesAmount"); + + createReadyToFulfillOrder({ + customerId, + shippingMethodId: shippingMethod.id, + channelId: defaultChannel.id, + variantsList: createdVariants, + address: addresses.plAddress + }); + + cy.get("@salesAmount").then(salesAmount => { + const totalAmount = salesAmount + productPrice; + const totalAmountString = totalAmount.toFixed(2); + const totalAmountIntegerValue = totalAmountString.split(".")[0]; + const totalAmountDecimalValue = totalAmountString.split(".")[1]; + const decimalSeparator = "[,.]"; + const totalAmountIntegerWithThousandsSeparator = new Intl.NumberFormat( + "en" + ) + .format(totalAmountIntegerValue) + .replaceAll(",", "[,.]*"); + const totalAmountWithSeparators = `${totalAmountIntegerWithThousandsSeparator}${decimalSeparator}${totalAmountDecimalValue}`; + const notANumberRegex = "\\D*"; + const salesAmountRegexp = new RegExp( + `${notANumberRegex}${totalAmountWithSeparators}${notANumberRegex}` + ); + cy.visit(urlList.homePage); + changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.sales, salesAmountRegexp).should( + "be.visible" + ); + }); + }); + + it("should correct amount of orders be displayed", () => { + homePageUtils.getTodaysOrders(defaultChannel.slug).as("todaysOrders"); + + createReadyToFulfillOrder({ + customerId, + shippingMethodId: shippingMethod.id, + channelId: defaultChannel.id, + variantsList: createdVariants, + address: addresses.plAddress + }); + + cy.get("@todaysOrders").then(ordersBefore => { + const allOrders = ordersBefore + 1; + const notANumberRegex = "\\D*"; + const ordersRegexp = new RegExp( + `${notANumberRegex}${allOrders}${notANumberRegex}` + ); + cy.visit(urlList.homePage); + changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.orders, ordersRegexp).should( + "be.visible" + ); + }); + }); + }); +}); diff --git a/cypress/integration/login_form.js b/cypress/integration/login_form.js new file mode 100644 index 000000000..e98623dfa --- /dev/null +++ b/cypress/integration/login_form.js @@ -0,0 +1,42 @@ +// +import { LOGIN_SELECTORS } from "../elements/account/login-selectors"; +import filterTests from "../support/filterTests"; +import { urlList } from "../url/urlList"; + +filterTests(["all"], () => { + describe("User authorization", () => { + beforeEach(() => { + cy.clearSessionData(); + }); + + it("should successfully log in an user", () => { + cy.visit(urlList.homePage); + cy.loginUser(); + cy.get(LOGIN_SELECTORS.welcomePage); + }); + + it("should fail for wrong password", () => { + cy.visit(urlList.homePage) + .get(LOGIN_SELECTORS.emailAddressInput) + .type("admin@example.com") + .get(LOGIN_SELECTORS.emailPasswordInput) + .type("wrong-password") + .get(LOGIN_SELECTORS.signInButton) + .click() + .get(LOGIN_SELECTORS.warningCredentialMessage); + }); + + it("should successfully log out an user", () => { + cy.window().then(win => { + win.sessionStorage.clear(); + }); + cy.visit(urlList.homePage); + cy.loginUser(); + cy.get(LOGIN_SELECTORS.userMenu) + .click() + .get(LOGIN_SELECTORS.accountSettings) + .click(); + cy.location("pathname").should("contains", "/staff/"); + }); + }); +}); diff --git a/cypress/integration/metadata.js b/cypress/integration/metadata.js new file mode 100644 index 000000000..ad0569e36 --- /dev/null +++ b/cypress/integration/metadata.js @@ -0,0 +1,100 @@ +import faker from "faker"; + +import { updateMetadata, updatePrivateMetadata } from "../apiRequests/Metadata"; +import { createDraftOrder, getOrder } from "../apiRequests/Order"; +import { getProductMetadata } from "../apiRequests/storeFront/ProductDetails"; +import filterTests from "../support/filterTests"; +import { getDefaultChannel } from "../utils/channelsUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct +} from "../utils/products/productsUtils"; + +filterTests(["all"], () => { + describe("Test for metadata", () => { + const startsWith = "Metadata"; + const name = `${startsWith}${faker.datatype.number()}`; + const metadata = { key: "metadataKey", value: "metadataValue" }; + let channel; + let product; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + getDefaultChannel() + .then(channelResp => { + channel = channelResp; + createTypeAttributeAndCategoryForProduct(name); + }) + .then(({ attribute, category, productType }) => { + createProductInChannel({ + attributeId: attribute.id, + categoryId: category.id, + channelId: channel.id, + name, + productTypeId: productType.id + }); + }) + .then(({ product: productResp }) => { + product = productResp; + }); + }); + + it("should create metadata for product", () => { + cy.clearSessionData().loginUserViaRequest(); + updateMetadata(product.id, metadata.key, metadata.value); + updatePrivateMetadata(product.id, metadata.key, metadata.value) + .then(() => { + getProductMetadata({ + productId: product.id, + channelSlug: channel.slug, + auth: "auth", + withPrivateMetadata: true + }).its("data"); + }) + .then(({ product: productResp }) => { + expect(productResp.metadata[0].key).to.eq(metadata.key); + expect(productResp.metadata[0].value).to.eq(metadata.value); + expect(productResp.privateMetadata[0].key).to.eq(metadata.key); + expect(productResp.privateMetadata[0].value).to.eq(metadata.value); + getProductMetadata({ + productId: product.id, + channelSlug: channel.slug, + auth: "token", + withPrivateMetadata: true + }); + }) + .then(({ errors }) => { + expect(errors[0].extensions.exception.code).to.eq("PermissionDenied"); + getProductMetadata({ + productId: product.id, + channelSlug: channel.slug, + auth: "token", + withPrivateMetadata: false + }).its("data"); + }) + .then(({ product: productResp }) => { + expect(productResp.metadata[0].key).to.eq(metadata.key); + expect(productResp.metadata[0].value).to.eq(metadata.value); + }); + }); + it("should create metadata for order", () => { + let order; + cy.clearSessionData().loginUserViaRequest(); + createDraftOrder({ channelId: channel.id }) + .then(orderResp => { + order = orderResp; + updateMetadata(order.id, metadata.key, metadata.value); + updatePrivateMetadata(order.id, metadata.key, metadata.value); + }) + .then(() => { + getOrder(order.id); + }) + .then(orderResp => { + expect(orderResp.metadata[0].key).to.eq(metadata.key); + expect(orderResp.metadata[0].value).to.eq(metadata.value); + expect(orderResp.privateMetadata[0].key).to.eq(metadata.key); + expect(orderResp.privateMetadata[0].value).to.eq(metadata.value); + }); + }); + }); +}); diff --git a/cypress/integration/navigation.js b/cypress/integration/navigation.js new file mode 100644 index 000000000..7683958cb --- /dev/null +++ b/cypress/integration/navigation.js @@ -0,0 +1,52 @@ +import { PERMISSIONS_OPTIONS } from "../Data/permissionsUsers"; +import * as permissionsSteps from "../steps/permissions"; +import filterTests from "../support/filterTests"; + +describe("Navigation for users with different permissions", () => { + Object.keys(PERMISSIONS_OPTIONS).forEach(key => { + const tags = key === "all" ? ["critical", "all"] : ["all"]; + filterTests(tags, () => { + it(`should navigate as an user with ${key} permission`, () => { + const permissionOption = PERMISSIONS_OPTIONS[key]; + const permissions = permissionOption.permissions; + cy.clearSessionData(); + permissionsSteps.navigateToAllAvailablePageAndCheckIfDisplayed( + permissionOption + ); + if (key === "all") { + return; + } + permissionsSteps + .getDisplayedSelectors() + .then(selectors => { + permissionsSteps.expectAllSelectorsPermitted( + permissions, + selectors + ); + }) + .then(() => { + if (!permissions) { + return; + } + permissions.forEach(permission => { + if (permission.parent) { + cy.get(permission.parent.parentMenuSelector) + .click() + .then(() => { + permissionsSteps.getDisplayedSelectors( + permission.parent.parentSelectors + ); + }) + .then(parentSelectors => { + permissionsSteps.expectAllSelectorsPermitted( + permissions, + parentSelectors + ); + }); + } + }); + }); + }); + }); + }); +}); diff --git a/cypress/integration/orders/channelsInDraftOrders.js b/cypress/integration/orders/channelsInDraftOrders.js new file mode 100644 index 000000000..ccfe34543 --- /dev/null +++ b/cypress/integration/orders/channelsInDraftOrders.js @@ -0,0 +1,101 @@ +// +import faker from "faker"; + +import { createChannel } from "../../apiRequests/Channels"; +import { CHANNEL_FORM_SELECTORS } from "../../elements/channels/channel-form-selectors"; +import { HEADER_SELECTORS } from "../../elements/header/header-selectors"; +import { DRAFT_ORDER_SELECTORS } from "../../elements/orders/draft-order-selectors"; +import { ORDERS_SELECTORS } from "../../elements/orders/orders-selectors"; +import { + selectChannelInHeader, + selectChannelInPicker +} from "../../steps/channelsSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import * as channelsUtils from "../../utils/channelsUtils"; + +filterTests(["all"], () => { + describe("Channels in draft orders", () => { + const startsWith = "CyChannelInDraftOrders-"; + const randomName = startsWith + faker.datatype.number(); + + let defaultChannel; + let otherChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + channelsUtils.deleteChannelsStartsWith(startsWith); + channelsUtils + .getDefaultChannel() + .then(channel => { + defaultChannel = channel; + createChannel({ name: randomName }); + }) + .then(channelResp => { + otherChannel = channelResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("Draft order channel should be taken from global channel picker", () => { + let channelName; + cy.visit(urlList.homePage); + cy.getTextFromElement(HEADER_SELECTORS.channelSelect).then( + channelInHeader => { + channelName = channelInHeader; + } + ); + cy.visit(urlList.orders) + .get(ORDERS_SELECTORS.createOrder) + .click(); + cy.getTextFromElement(CHANNEL_FORM_SELECTORS.channelSelect).then( + selectedChannelName => { + expect(channelName).to.contains(selectedChannelName); + } + ); + cy.get(CHANNEL_FORM_SELECTORS.confirmButton).click(); + cy.getTextFromElement(DRAFT_ORDER_SELECTORS.salesChannel).then( + channelNameInDraftOrder => { + expect(channelName).to.contains(channelNameInDraftOrder); + } + ); + }); + it("Draft order channel should be taken from global channel picker when changed", () => { + cy.visit(urlList.homePage); + selectChannelInHeader(otherChannel.name); + cy.visit(urlList.orders); + cy.get(ORDERS_SELECTORS.createOrder).click(); + cy.getTextFromElement(CHANNEL_FORM_SELECTORS.channelSelect).then( + channelInSelect => { + expect(channelInSelect).to.be.eq(otherChannel.name); + } + ); + cy.get(CHANNEL_FORM_SELECTORS.confirmButton).click(); + cy.getTextFromElement(DRAFT_ORDER_SELECTORS.salesChannel).then( + channelInDraftOrder => { + expect(channelInDraftOrder).to.be.eq(otherChannel.name); + } + ); + }); + it("should create draft order with chosen channel", () => { + cy.visit(urlList.homePage); + selectChannelInHeader(defaultChannel.name); + cy.visit(urlList.orders); + cy.get(ORDERS_SELECTORS.createOrder).click(); + cy.getTextFromElement(CHANNEL_FORM_SELECTORS.channelSelect).then( + channelInSelect => { + expect(channelInSelect).to.be.eq(defaultChannel.name); + } + ); + selectChannelInPicker(otherChannel.name); + cy.getTextFromElement(DRAFT_ORDER_SELECTORS.salesChannel).then( + channelInDraftOrder => { + expect(channelInDraftOrder).to.be.eq(otherChannel.name); + } + ); + }); + }); +}); diff --git a/cypress/integration/orders/draftOrders.js b/cypress/integration/orders/draftOrders.js new file mode 100644 index 000000000..79c4e2ed1 --- /dev/null +++ b/cypress/integration/orders/draftOrders.js @@ -0,0 +1,105 @@ +// +import faker from "faker"; + +import { + createCustomer, + deleteCustomersStartsWith +} from "../../apiRequests/Customer"; +import { DRAFT_ORDERS_LIST_SELECTORS } from "../../elements/orders/draft-orders-list-selectors"; +import { ORDERS_SELECTORS } from "../../elements/orders/orders-selectors"; +import { selectChannelInPicker } from "../../steps/channelsSteps"; +import { finalizeDraftOrder } from "../../steps/draftOrderSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import * as productsUtils from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Draft orders", () => { + const startsWith = "CyDraftOrders-"; + const randomName = startsWith + faker.datatype.number(); + + let defaultChannel; + let warehouse; + let address; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteCustomersStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + productsUtils.deleteProductsStartsWith(startsWith); + + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + }) + .then(() => { + cy.fixture("addresses"); + }) + .then(addresses => { + address = addresses.plAddress; + createCustomer( + `${randomName}@example.com`, + randomName, + addresses.plAddress, + true + ); + createShipping({ + channelId: defaultChannel.id, + name: randomName, + address: addresses.plAddress + }); + }) + .then(({ warehouse: warehouseResp }) => { + warehouse = warehouseResp; + productsUtils.createTypeAttributeAndCategoryForProduct(randomName); + }) + .then( + ({ + productType: productTypeResp, + attribute: attributeResp, + category: categoryResp + }) => { + productsUtils.createProductInChannel({ + name: randomName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productTypeResp.id, + attributeId: attributeResp.id, + categoryId: categoryResp.id + }); + } + ); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should move draft order to orders", () => { + cy.visit(urlList.orders); + cy.softExpectSkeletonIsVisible(); + cy.get(ORDERS_SELECTORS.createOrder).click(); + selectChannelInPicker(defaultChannel.name); + finalizeDraftOrder(randomName, address).then(draftOrderNumber => { + cy.visit(urlList.orders); + cy.contains(ORDERS_SELECTORS.orderRow, draftOrderNumber).should( + $order => { + expect($order).to.be.visible; + } + ); + cy.visit(urlList.draftOrders); + cy.contains( + DRAFT_ORDERS_LIST_SELECTORS.draftOrderRow, + draftOrderNumber + ).should($draftOrder => { + expect($draftOrder).to.not.exist; + }); + }); + }); + }); +}); diff --git a/cypress/integration/orders/orders.js b/cypress/integration/orders/orders.js new file mode 100644 index 000000000..0a67be907 --- /dev/null +++ b/cypress/integration/orders/orders.js @@ -0,0 +1,211 @@ +// +import faker from "faker"; + +import { + createCustomer, + deleteCustomersStartsWith +} from "../../apiRequests/Customer"; +import { getOrder } from "../../apiRequests/Order"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { ORDER_REFUND } from "../../elements/orders/order-refund"; +import { ORDERS_SELECTORS } from "../../elements/orders/orders-selectors"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; +import { selectChannelInPicker } from "../../steps/channelsSteps"; +import { finalizeDraftOrder } from "../../steps/draftOrderSteps"; +import { fillAutocompleteSelect } from "../../steps/shared/selects"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import { + createFulfilledOrder, + createOrder, + createReadyToFulfillOrder +} from "../../utils/ordersUtils"; +import * as productsUtils from "../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Orders", () => { + const startsWith = "CyOrders-"; + const randomName = startsWith + faker.datatype.number(); + + let customer; + let defaultChannel; + let warehouse; + let shippingMethod; + let variantsList; + let address; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteCustomersStartsWith(startsWith); + deleteShippingStartsWith(startsWith); + productsUtils.deleteProductsStartsWith(startsWith); + + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + }) + .then(() => { + cy.fixture("addresses"); + }) + .then(addresses => { + address = addresses.plAddress; + createCustomer( + `${randomName}@example.com`, + randomName, + address, + true + ); + }) + .then(customerResp => { + customer = customerResp.body.data.customerCreate.user; + createShipping({ + channelId: defaultChannel.id, + name: randomName, + address + }); + }) + .then( + ({ + warehouse: warehouseResp, + shippingMethod: shippingMethodResp + }) => { + shippingMethod = shippingMethodResp; + warehouse = warehouseResp; + productsUtils.createTypeAttributeAndCategoryForProduct(randomName); + } + ) + .then( + ({ + productType: productTypeResp, + attribute: attributeResp, + category: categoryResp + }) => { + productsUtils.createProductInChannel({ + name: randomName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productTypeResp.id, + attributeId: attributeResp.id, + categoryId: categoryResp.id + }); + } + ) + .then(({ variantsList: variantsResp }) => { + variantsList = variantsResp; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.order + ); + }); + + it("should create order with selected channel", () => { + // Remove login as admin after fixing SALEOR-3154 + cy.clearSessionData().loginUserViaRequest(); + cy.visit(urlList.orders) + .get(ORDERS_SELECTORS.createOrder) + .click(); + selectChannelInPicker(defaultChannel.name); + finalizeDraftOrder(randomName, address).then(draftOrderNumber => { + cy.visit(urlList.orders); + cy.contains(ORDERS_SELECTORS.orderRow, draftOrderNumber).click(); + cy.contains(ORDERS_SELECTORS.salesChannel, defaultChannel.name).should( + "be.visible" + ); + }); + }); + + // This test will pass after fixing SALEOR-3154 + it("should not be possible to change channel in order", () => { + createOrder({ + customerId: customer.id, + channelId: defaultChannel.id, + shippingMethodId: shippingMethod.id, + variantsList, + address + }).then(order => { + cy.visit(urlList.orders); + cy.contains(ORDERS_SELECTORS.orderRow, order.number).click(); + cy.get(ORDERS_SELECTORS.salesChannel) + .find("[button]") + .should("not.exist"); + }); + }); + + it("should cancel fulfillment", () => { + let order; + createFulfilledOrder({ + customerId: customer.id, + channelId: defaultChannel.id, + shippingMethodId: shippingMethod.id, + variantsList, + address, + warehouse: warehouse.id + }) + .then(({ order: orderResp }) => { + order = orderResp; + cy.visit(urlList.orders); + cy.softExpectSkeletonIsVisible(); + cy.contains(ORDERS_SELECTORS.orderRow, order.number).click(); + cy.get(SHARED_ELEMENTS.skeleton) + .should("not.exist") + .get(ORDERS_SELECTORS.orderFulfillmentFrame) + .find(BUTTON_SELECTORS.showMoreButton) + .click() + .get(ORDERS_SELECTORS.cancelFulfillment) + .click(); + }) + .then(() => { + fillAutocompleteSelect( + ORDERS_SELECTORS.cancelFulfillmentSelectField, + warehouse.name + ); + cy.addAliasToGraphRequest("OrderFulfillmentCancel"); + cy.get(BUTTON_SELECTORS.submit).click(); + cy.wait("@OrderFulfillmentCancel"); + getOrder(order.id); + }) + .then(orderResp => { + expect(orderResp.status).to.be.eq("UNFULFILLED"); + }); + }); + + it("should make a refund", () => { + let order; + createReadyToFulfillOrder({ + customerId: customer.id, + channelId: defaultChannel.id, + shippingMethodId: shippingMethod.id, + variantsList, + address + }) + .then(({ order: orderResp }) => { + order = orderResp; + cy.visit(urlList.orders); + cy.softExpectSkeletonIsVisible(); + cy.contains(ORDERS_SELECTORS.orderRow, order.number).click(); + cy.get(ORDERS_SELECTORS.refundButton) + .click() + .get(ORDER_REFUND.productsQuantityInput) + .type("1") + .addAliasToGraphRequest("OrderFulfillmentRefundProducts"); + cy.get(BUTTON_SELECTORS.submit) + .click() + .wait("@OrderFulfillmentRefundProducts"); + getOrder(order.id); + }) + .then(orderResp => { + expect(orderResp.paymentStatus).to.be.eq("FULLY_REFUNDED"); + }); + }); + }); +}); diff --git a/cypress/integration/pages/pageTypes.js b/cypress/integration/pages/pageTypes.js new file mode 100644 index 000000000..e260750fe --- /dev/null +++ b/cypress/integration/pages/pageTypes.js @@ -0,0 +1,64 @@ +import faker from "faker"; + +import { createAttribute } from "../../apiRequests/Attribute"; +import { createPageType, getPageType } from "../../apiRequests/PageTypes"; +import { PAGE_TYPE_DETAILS } from "../../elements/pageTypes/pageTypeDetails"; +import { PAGE_TYPES_LIST } from "../../elements/pageTypes/pageTypesList"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; +import { assignElements } from "../../steps/shared/assignElements"; +import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; +import filterTests from "../../support/filterTests"; +import { pageTypeDetailsUrl, urlList } from "../../url/urlList"; + +filterTests(["all"], () => { + describe("Tests for page types", () => { + const startsWith = "PageTypes"; + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create page type", () => { + const randomName = startsWith + faker.datatype.number(); + + cy.visit(urlList.pageTypes) + .get(PAGE_TYPES_LIST.createPageTypeButton) + .click() + .get(PAGE_TYPE_DETAILS.nameInput) + .type(randomName) + .addAliasToGraphRequest("PageTypeCreate") + .get(BUTTON_SELECTORS.confirm) + .click(); + confirmationMessageShouldDisappear(); + cy.wait("@PageTypeCreate") + .its("response.body.data.pageTypeCreate.pageType") + .then(pageType => { + getPageType(pageType.id); + }) + .then(pageType => { + expect(pageType.name).to.eq(randomName); + }); + }); + + it("should assign attribute", () => { + const randomName = startsWith + faker.datatype.number(); + + createAttribute({ name: randomName, type: "PAGE_TYPE" }); + createPageType(randomName) + .then(({ pageType }) => { + cy.visit(pageTypeDetailsUrl(pageType.id)) + .get(SHARED_ELEMENTS.progressBar) + .should("be.not.visible") + .get(PAGE_TYPE_DETAILS.assignAttributesButton) + .click(); + assignElements(randomName, false); + confirmationMessageShouldDisappear(); + getPageType(pageType.id); + }) + .then(pageType => { + expect(pageType.attributes[0].name).to.eq(randomName); + }); + }); + }); +}); diff --git a/cypress/integration/products/createProduct.js b/cypress/integration/products/createProduct.js new file mode 100644 index 000000000..26b4a05cb --- /dev/null +++ b/cypress/integration/products/createProduct.js @@ -0,0 +1,145 @@ +// +import faker from "faker"; + +import { createAttribute } from "../../apiRequests/Attribute"; +import { createTypeProduct } from "../../apiRequests/productType"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { PRODUCT_DETAILS } from "../../elements/catalog/products/product-details"; +import { PRODUCTS_LIST } from "../../elements/catalog/products/products-list"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; +import { metadataForms } from "../../steps/catalog/metadataSteps"; +import { + fillUpPriceList, + priceInputLists +} from "../../steps/catalog/products/priceList"; +import { fillUpCommonFieldsForAllProductTypes } from "../../steps/catalog/products/productSteps"; +import { selectChannelInDetailsPages } from "../../steps/channelsSteps"; +import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { + expectCorrectProductInformation, + expectCorrectProductVariantInformation +} from "../../utils/products/checkProductInfo"; +import * as productUtils from "../../utils/products/productsUtils"; + +filterTests(["all", "critical"], () => { + describe("Create product", () => { + const startsWith = "CyCreateProduct-"; + const name = `${startsWith}${faker.datatype.number()}`; + const generalInfo = { + name: `${startsWith}${faker.datatype.number()}`, + description: faker.lorem.sentence(), + rating: 2 + }; + const seo = { + title: "testTitle", + description: generalInfo.description + }; + const metadata = { + public: { + metadataForm: metadataForms.public, + name: "metadataName", + value: "metadataValue" + }, + private: { + metadataForm: metadataForms.private, + name: "privateMetadataName", + value: "privateMetadataValue" + } + }; + let attribute; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productUtils.deleteProductsStartsWith(startsWith); + createAttribute({ name }).then(attributeResp => { + attribute = attributeResp; + }); + }); + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create product with variants", () => { + const randomName = `${startsWith}${faker.datatype.number()}`; + seo.slug = randomName; + const productData = { + generalInfo, + seo, + metadata, + productOrganization: { productType: randomName }, + attribute + }; + createTpeAndFillUpProductFields(randomName, true, productData).then( + productOrgResp => (productData.productOrganization = productOrgResp) + ); + cy.addAliasToGraphRequest("ProductDetails"); + cy.get(BUTTON_SELECTORS.confirm).click(); + confirmationMessageShouldDisappear(); + cy.wait("@ProductDetails"); + cy.get("@ProductDetails") + .its("response.body") + .then(resp => { + const productResp = resp.find(element => element.data.product).data + .product; + expectCorrectProductInformation(productResp, productData); + }); + }); + + it("should create product without variants", () => { + const prices = { sellingPrice: 6, costPrice: 3 }; + const randomName = `${startsWith}${faker.datatype.number()}`; + seo.slug = randomName; + const productData = { + generalInfo, + seo, + metadata, + productOrganization: { productType: randomName }, + attribute + }; + createTpeAndFillUpProductFields(randomName, false, productData).then( + productOrgResp => (productData.productOrganization = productOrgResp) + ); + selectChannelInDetailsPages(); + fillUpPriceList(prices.sellingPrice); + fillUpPriceList(prices.costPrice, priceInputLists.costPrice); + cy.get(PRODUCT_DETAILS.skuInput).type(randomName); + cy.addAliasToGraphRequest("ProductDetails"); + cy.get(BUTTON_SELECTORS.confirm).click(); + confirmationMessageShouldDisappear(); + cy.wait("@ProductDetails"); + cy.get("@ProductDetails") + .its("response.body") + .then(resp => { + const productResp = resp.find(element => element.data.product).data + .product; + expectCorrectProductInformation(productResp, productData); + expectCorrectProductVariantInformation( + productResp.variants, + randomName, + prices + ); + }); + }); + + function createTpeAndFillUpProductFields( + randomName, + hasVariants, + productData + ) { + createTypeProduct({ + name: randomName, + attributeId: attribute.id, + hasVariants + }); + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.product) + .visit(urlList.products) + .get(PRODUCTS_LIST.createProductBtn) + .click(); + return fillUpCommonFieldsForAllProductTypes(productData); + } + }); +}); diff --git a/cypress/integration/products/menageProducts/availableForPurchaseProducts.js b/cypress/integration/products/menageProducts/availableForPurchaseProducts.js new file mode 100644 index 000000000..9cca22ef4 --- /dev/null +++ b/cypress/integration/products/menageProducts/availableForPurchaseProducts.js @@ -0,0 +1,121 @@ +import faker from "faker"; + +import { getProductDetails } from "../../../apiRequests/storeFront/ProductDetails"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { updateProductIsAvailableForPurchase } from "../../../steps/catalog/products/productSteps"; +import filterTests from "../../../support/filterTests"; +import { productDetailsUrl } from "../../../url/urlList"; +import { getDefaultChannel } from "../../../utils/channelsUtils"; +import * as productsUtils from "../../../utils/products/productsUtils"; +import * as shippingUtils from "../../../utils/shippingUtils"; +import { isProductAvailableForPurchase } from "../../../utils/storeFront/storeFrontProductUtils"; + +// + +filterTests(["all"], () => { + describe("Products available in listings", () => { + const startsWith = "CyAvailForPurchase-"; + const name = `${startsWith}${faker.datatype.number()}`; + let productType; + let attribute; + let category; + let defaultChannel; + let warehouse; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + shippingUtils.deleteShippingStartsWith(startsWith); + productsUtils.deleteProductsStartsWith(startsWith); + + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(addressesFixture => { + shippingUtils.createShipping({ + channelId: defaultChannel.id, + name, + address: addressesFixture.plAddress + }); + }) + .then(({ warehouse: warehouseResp }) => { + warehouse = warehouseResp; + }); + + productsUtils + .createTypeAttributeAndCategoryForProduct(name) + .then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + productType = productTypeResp; + attribute = attributeResp; + category = categoryResp; + } + ); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.product + ); + }); + + it("should update product to available for purchase", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + let product; + + productsUtils + .createProductInChannel({ + name: productName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + isAvailableForPurchase: false + }) + .then(({ product: productResp }) => { + product = productResp; + const productUrl = productDetailsUrl(product.id); + updateProductIsAvailableForPurchase(productUrl, true); + }) + .then(() => { + getProductDetails(product.id, defaultChannel.slug); + }) + .then(resp => { + expect(isProductAvailableForPurchase(resp)).to.be.eq(true); + }); + }); + + it("should update product to not available for purchase", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + let product; + + productsUtils + .createProductInChannel({ + name: productName, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }) + .then(({ product: productResp }) => { + product = productResp; + const productUrl = productDetailsUrl(product.id); + updateProductIsAvailableForPurchase(productUrl, false); + }) + .then(() => { + getProductDetails(product.id, defaultChannel.slug); + }) + .then(resp => { + expect(isProductAvailableForPurchase(resp)).to.be.eq(false); + }); + }); + }); +}); diff --git a/cypress/integration/products/menageProducts/publishedProducts.js b/cypress/integration/products/menageProducts/publishedProducts.js new file mode 100644 index 000000000..217871efe --- /dev/null +++ b/cypress/integration/products/menageProducts/publishedProducts.js @@ -0,0 +1,109 @@ +import faker from "faker"; + +import { getProductDetails } from "../../../apiRequests/storeFront/ProductDetails"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { updateProductPublish } from "../../../steps/catalog/products/productSteps"; +import filterTests from "../../../support/filterTests"; +import { productDetailsUrl } from "../../../url/urlList"; +import { getDefaultChannel } from "../../../utils/channelsUtils"; +import * as productsUtils from "../../../utils/products/productsUtils"; +import { isProductVisible } from "../../../utils/storeFront/storeFrontProductUtils"; + +// + +filterTests(["all"], () => { + describe("Published products", () => { + const startsWith = "CyPublishedProducts-"; + const name = `${startsWith}${faker.datatype.number()}`; + let productType; + let attribute; + let category; + let defaultChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productsUtils.deleteProductsStartsWith(startsWith); + productsUtils + .createTypeAttributeAndCategoryForProduct(name) + .then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + productType = productTypeResp; + attribute = attributeResp; + category = categoryResp; + getDefaultChannel(); + } + ) + .then(channel => { + defaultChannel = channel; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.product + ); + }); + + it("should update product to published", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + + productsUtils + .createProductInChannel({ + name: productName, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + isPublished: false, + isAvailableForPurchase: false + }) + .then(({ product: productResp }) => { + const product = productResp; + const productUrl = productDetailsUrl(product.id); + updateProductPublish(productUrl, true); + getProductDetails(product.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isProductVisible(resp, productName); + expect(isVisible).to.be.eq(true); + }); + }); + + it("should update product to not published", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + let product; + + productsUtils + .createProductInChannel({ + name: productName, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id + }) + .then(({ product: productResp }) => { + product = productResp; + const productUrl = productDetailsUrl(product.id); + updateProductPublish(productUrl, false); + getProductDetails(product.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isProductVisible(resp, productName); + expect(isVisible).to.be.eq(false); + cy.loginInShop(); + }) + .then(() => { + getProductDetails(product.id, defaultChannel.slug); + }) + .then(resp => { + const isVisible = isProductVisible(resp, productName); + expect(isVisible).to.be.eq(true); + }); + }); + }); +}); diff --git a/cypress/integration/products/menageProducts/visibleInListingsProducts.js b/cypress/integration/products/menageProducts/visibleInListingsProducts.js new file mode 100644 index 000000000..431a6ce87 --- /dev/null +++ b/cypress/integration/products/menageProducts/visibleInListingsProducts.js @@ -0,0 +1,118 @@ +import faker from "faker"; + +import { searchInShop } from "../../../apiRequests/storeFront/Search"; +import { ONE_PERMISSION_USERS } from "../../../Data/users"; +import { updateProductVisibleInListings } from "../../../steps/catalog/products/productSteps"; +import filterTests from "../../../support/filterTests"; +import { productDetailsUrl } from "../../../url/urlList"; +import { getDefaultChannel } from "../../../utils/channelsUtils"; +import * as productsUtils from "../../../utils/products/productsUtils"; +import { isProductVisibleInSearchResult } from "../../../utils/storeFront/storeFrontProductUtils"; + +// + +filterTests(["all"], () => { + describe("Products displayed in listings", () => { + const startsWith = "CyVisibleInListings-"; + const name = `${startsWith}${faker.datatype.number()}`; + let productType; + let attribute; + let category; + let defaultChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + productsUtils.deleteProductsStartsWith(startsWith); + productsUtils + .createTypeAttributeAndCategoryForProduct(name) + .then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + productType = productTypeResp; + attribute = attributeResp; + category = categoryResp; + getDefaultChannel(); + } + ) + .then(channel => { + defaultChannel = channel; + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.product + ); + }); + + it("should update product to visible in listings", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + + productsUtils + .createProductInChannel({ + name: productName, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + visibleInListings: false, + isAvailableForPurchase: false + }) + .then(({ product: productResp }) => { + const product = productResp; + const productUrl = productDetailsUrl(product.id); + updateProductVisibleInListings(productUrl); + searchInShop(productName); + }) + .then(resp => { + const isProductVisible = isProductVisibleInSearchResult( + resp, + productName + ); + expect(isProductVisible).to.be.eq(true); + }); + }); + + it("should update product to not visible in listings", () => { + const productName = `${startsWith}${faker.datatype.number()}`; + + productsUtils + .createProductInChannel({ + name: productName, + channelId: defaultChannel.id, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + visibleInListings: true + }) + .then(({ product: productResp }) => { + const product = productResp; + const productUrl = productDetailsUrl(product.id); + updateProductVisibleInListings(productUrl); + + searchInShop(productName).then(resp => { + const isProductVisible = isProductVisibleInSearchResult( + resp, + productName + ); + expect(isProductVisible).to.be.eq(false); + }); + cy.loginInShop(); + }) + .then(() => { + searchInShop(productName); + }) + .then(resp => { + const isProductVisible = isProductVisibleInSearchResult( + resp, + productName + ); + expect(isProductVisible).to.be.eq(true); + }); + }); + }); +}); diff --git a/cypress/integration/products/productsList/filteringProducts.js b/cypress/integration/products/productsList/filteringProducts.js new file mode 100644 index 000000000..eae0f1577 --- /dev/null +++ b/cypress/integration/products/productsList/filteringProducts.js @@ -0,0 +1,123 @@ +import faker from "faker"; + +import { createCollection } from "../../../apiRequests/Collections"; +import { updateProduct } from "../../../apiRequests/Product"; +import { PRODUCTS_LIST } from "../../../elements/catalog/products/products-list"; +import { + selectChannel, + selectFilterOption, + selectProductsOutOfStock +} from "../../../steps/catalog/products/productsListSteps"; +import { waitForProgressBarToNotExist } from "../../../steps/shared/progressBar"; +import filterTests from "../../../support/filterTests"; +import { urlList } from "../../../url/urlList"; +import { getDefaultChannel } from "../../../utils/channelsUtils"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../../utils/products/productsUtils"; +import { + createShipping, + deleteShippingStartsWith +} from "../../../utils/shippingUtils"; + +filterTests(["all"], () => { + describe("Filtering products", () => { + const startsWith = "CyFilterProducts-"; + const name = `${startsWith}${faker.datatype.number()}`; + const stockQuantity = 747; + const price = 342; + let attribute; + let productType; + let category; + let warehouse; + let channel; + let collection; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteShippingStartsWith(startsWith); + deleteProductsStartsWith(startsWith); + createTypeAttributeAndCategoryForProduct(name).then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + attribute = attributeResp; + productType = productTypeResp; + category = categoryResp; + } + ); + createCollection(name).then( + collectionResp => (collection = collectionResp) + ); + getDefaultChannel() + .then(channelResp => { + channel = channelResp; + cy.fixture("addresses"); + }) + .then(addresses => { + createShipping({ + channelId: channel.id, + name, + address: addresses.plAddress + }); + }) + .then(({ warehouse: warehouseResp }) => { + warehouse = warehouseResp; + createProductInChannel({ + name, + channelId: channel.id, + warehouseId: warehouse.id, + quantityInWarehouse: stockQuantity, + price, + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id + }); + }) + .then(({ product: product }) => { + updateProduct(product.id, { collections: [collection.id] }); + }); + }); + beforeEach(() => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.products); + }); + const filterProductsBy = ["category", "collection", "productType"]; + filterProductsBy.forEach(filterBy => { + it(`should filter products by ${filterBy}`, () => { + cy.softExpectSkeletonIsVisible(); + waitForProgressBarToNotExist(); + selectFilterOption(filterBy, name); + cy.getTextFromElement(PRODUCTS_LIST.productsNames).then(product => { + expect(product).to.includes(name); + }); + }); + }); + + it("should filter products out of stock", () => { + cy.softExpectSkeletonIsVisible(); + const productOutOfStock = `${startsWith}${faker.datatype.number()}`; + createProductInChannel({ + name: productOutOfStock, + channelId: channel.id, + warehouseId: warehouse.id, + quantityInWarehouse: 0, + productTypeId: productType.id, + attributeId: attribute.id, + categoryId: category.id, + price + }); + waitForProgressBarToNotExist(); + selectChannel(channel.slug); + selectProductsOutOfStock(); + cy.getTextFromElement(PRODUCTS_LIST.productsNames).then(product => { + expect(product).to.includes(productOutOfStock); + }); + }); + }); +}); diff --git a/cypress/integration/products/productsList/pagination.js b/cypress/integration/products/productsList/pagination.js new file mode 100644 index 000000000..e4075d579 --- /dev/null +++ b/cypress/integration/products/productsList/pagination.js @@ -0,0 +1,64 @@ +import { PRODUCTS_LIST } from "../../../elements/catalog/products/products-list"; +import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; +import { + getDisplayedColumnArray, + isNumberOfProductsSameAsInSelectResultsOnPage +} from "../../../steps/catalog/products/productsListSteps"; +import { waitForProgressBarToNotExist } from "../../../steps/shared/progressBar"; +import filterTests from "../../../support/filterTests"; +import { urlList } from "../../../url/urlList"; + +filterTests(["all"], () => { + describe("Products", () => { + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + cy.visit(urlList.products); + }); + it("Should go to the next page", () => { + cy.softExpectSkeletonIsVisible(); + cy.get(PRODUCTS_LIST.productsList) + .should("be.visible") + .get(PRODUCTS_LIST.emptyProductRow) + .should("not.exist") + .get(PRODUCTS_LIST.previousPagePagination) + .should("be.disabled"); + let firstPageProducts; + getDisplayedColumnArray("name").then( + productsList => (firstPageProducts = productsList) + ); + cy.addAliasToGraphRequest("ProductList"); + cy.get(PRODUCTS_LIST.nextPageButton).click(); + waitForProgressBarToNotExist(); + cy.wait("@ProductList"); + getDisplayedColumnArray("name").then(productList => { + expect(productList).to.not.equal(firstPageProducts); + }); + cy.get(PRODUCTS_LIST.previousPagePagination).then($button => { + expect($button).to.be.enabled; + }); + }); + it("should displayed correct number of results per page", () => { + cy.softExpectSkeletonIsVisible(); + isNumberOfProductsSameAsInSelectResultsOnPage().then( + isTheSame => + expect(isTheSame, "check if number of displayed products is correct") + .to.be.true + ); + cy.get(PRODUCTS_LIST.resultsOnPageSelect) + .click() + .get( + `${PRODUCTS_LIST.rowNumberOption}${BUTTON_SELECTORS.notSelectedOption}` + ) + .first() + .click(); + waitForProgressBarToNotExist(); + isNumberOfProductsSameAsInSelectResultsOnPage().then( + isTheSame => + expect( + isTheSame, + "check if number of displayed products is correct, after changing results number in table footer" + ).to.be.true + ); + }); + }); +}); diff --git a/cypress/integration/products/productsList/sortingProducts.js b/cypress/integration/products/productsList/sortingProducts.js new file mode 100644 index 000000000..37b1cbd0c --- /dev/null +++ b/cypress/integration/products/productsList/sortingProducts.js @@ -0,0 +1,31 @@ +import { PRODUCTS_LIST } from "../../../elements/catalog/products/products-list"; +import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; +import { waitForProgressBarToNotExist } from "../../../steps/shared/progressBar"; +import filterTests from "../../../support/filterTests"; +import { urlList } from "../../../url/urlList"; +import { expectProductsSortedBy } from "../../../utils/products/productsListUtils"; + +filterTests(["all"], () => { + describe("Sorting products", () => { + const sortByList = ["name", "type"]; + sortByList.forEach(sortBy => { + it(`Sorting by ${sortBy}`, () => { + cy.clearSessionData() + .loginUserViaRequest() + .visit(urlList.products); + cy.softExpectSkeletonIsVisible(); + cy.get(SHARED_ELEMENTS.header).should("be.visible"); + if (sortBy !== "name") { + cy.get(PRODUCTS_LIST.tableHeaders[sortBy]).click(); + waitForProgressBarToNotExist(); + } + expectProductsSortedBy(sortBy); + cy.addAliasToGraphRequest("ProductList") + .get(PRODUCTS_LIST.tableHeaders[sortBy]) + .click(); + waitForProgressBarToNotExist().wait("@ProductList"); + expectProductsSortedBy(sortBy, false); + }); + }); + }); +}); diff --git a/cypress/integration/products/productsVariants.js b/cypress/integration/products/productsVariants.js new file mode 100644 index 000000000..7ba27a078 --- /dev/null +++ b/cypress/integration/products/productsVariants.js @@ -0,0 +1,209 @@ +import faker from "faker"; + +import { createChannel } from "../../apiRequests/Channels"; +import { + createProduct, + updateChannelInProduct +} from "../../apiRequests/Product"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { + createFirstVariant, + createVariant, + variantsShouldBeVisible +} from "../../steps/catalog/products/VariantsSteps"; +import { selectChannelInHeader } from "../../steps/channelsSteps"; +import filterTests from "../../support/filterTests"; +import { urlList } from "../../url/urlList"; +import { + deleteChannelsStartsWith, + getDefaultChannel +} from "../../utils/channelsUtils"; +import * as productUtils from "../../utils/products/productsUtils"; +import * as shippingUtils from "../../utils/shippingUtils"; +import { getProductVariants } from "../../utils/storeFront/storeFrontProductUtils"; +// + +filterTests(["all", "critical"], () => { + describe("Creating variants", () => { + const startsWith = "CyCreateVariants-"; + const attributeValues = ["value1", "value2"]; + + let defaultChannel; + let warehouse; + let attribute; + let productType; + let category; + let newChannel; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + shippingUtils.deleteShippingStartsWith(startsWith); + productUtils.deleteProductsStartsWith(startsWith); + deleteChannelsStartsWith(startsWith); + + const name = `${startsWith}${faker.datatype.number()}`; + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + cy.fixture("addresses"); + }) + .then(fixtureAddresses => + shippingUtils.createShipping({ + channelId: defaultChannel.id, + name, + address: fixtureAddresses.plAddress + }) + ) + .then(({ warehouse: warehouseResp }) => { + warehouse = warehouseResp; + createChannel({ isActive: true, name, currencyCode: "PLN" }); + }) + .then(resp => (newChannel = resp)); + + productUtils + .createTypeAttributeAndCategoryForProduct(name, attributeValues) + .then( + ({ + attribute: attributeResp, + productType: productTypeResp, + category: categoryResp + }) => { + attribute = attributeResp; + productType = productTypeResp; + category = categoryResp; + } + ); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest( + "auth", + ONE_PERMISSION_USERS.product + ); + }); + + it("should create variant visible on frontend", () => { + const name = `${startsWith}${faker.datatype.number()}`; + const price = 10; + let createdProduct; + + createProduct({ + attributeId: attribute.id, + name, + productTypeId: productType.id, + categoryId: category.id + }) + .then(resp => { + createdProduct = resp; + updateChannelInProduct({ + productId: createdProduct.id, + channelId: defaultChannel.id + }); + cy.visit(`${urlList.products}${createdProduct.id}`); + createFirstVariant({ + sku: name, + warehouseId: warehouse.id, + price, + attribute: attributeValues[0] + }); + selectChannelInHeader(defaultChannel.name); + variantsShouldBeVisible({ name, price }); + getProductVariants(createdProduct.id, defaultChannel.slug); + }) + .then(([variant]) => { + expect(variant).to.have.property("name", attributeValues[0]); + expect(variant).to.have.property("price", price); + }); + }); + + it("should create several variants", () => { + const name = `${startsWith}${faker.datatype.number()}`; + const secondVariantSku = `${startsWith}${faker.datatype.number()}`; + const variants = [{ price: 7 }, { name: attributeValues[1], price: 16 }]; + let createdProduct; + + productUtils + .createProductInChannel({ + name, + attributeId: attribute.id, + channelId: defaultChannel.id, + warehouseId: warehouse.id, + productTypeId: productType.id, + categoryId: category.id, + price: variants[0].price + }) + .then(({ product: productResp }) => { + createdProduct = productResp; + cy.visit(`${urlList.products}${createdProduct.id}`); + createVariant({ + sku: secondVariantSku, + warehouseName: warehouse.name, + attributeName: variants[1].name, + price: variants[1].price, + channelName: defaultChannel.name + }); + }) + .then(() => { + selectChannelInHeader(defaultChannel.name); + variantsShouldBeVisible({ + name: variants[1].name, + price: variants[1].price + }); + getProductVariants(createdProduct.id, defaultChannel.slug); + }) + .then(([firstVariant, secondVariant]) => { + expect(firstVariant).to.have.property("price", variants[0].price); + expect(secondVariant).to.have.property("name", variants[1].name); + expect(secondVariant).to.have.property("price", variants[1].price); + }); + }); + + it("should create variant for many channels", () => { + const name = `${startsWith}${faker.datatype.number()}`; + const variantsPrice = 10; + let createdProduct; + createProduct({ + attributeId: attribute.id, + name, + productTypeId: productType.id, + categoryId: category.id + }) + .then(productResp => { + createdProduct = productResp; + updateChannelInProduct({ + productId: createdProduct.id, + channelId: defaultChannel.id + }); + }) + .then(() => { + updateChannelInProduct({ + productId: createdProduct.id, + channelId: newChannel.id + }); + }) + .then(() => { + cy.visit(`${urlList.products}${createdProduct.id}`); + createFirstVariant({ + sku: name, + warehouseId: warehouse.id, + price: variantsPrice, + attribute: attributeValues[0] + }); + selectChannelInHeader(defaultChannel.name); + variantsShouldBeVisible({ name, price: variantsPrice }); + selectChannelInHeader(newChannel.name); + variantsShouldBeVisible({ name, price: variantsPrice }); + getProductVariants(createdProduct.id, defaultChannel.slug); + }) + .then(([variant]) => { + expect(variant).to.have.property("name", attributeValues[0]); + expect(variant).to.have.property("price", variantsPrice); + getProductVariants(createdProduct.id, newChannel.slug); + }) + .then(([variant]) => { + expect(variant).to.have.property("name", attributeValues[0]); + expect(variant).to.have.property("price", variantsPrice); + }); + }); + }); +}); diff --git a/cypress/integration/products/updatingProducts.js b/cypress/integration/products/updatingProducts.js new file mode 100644 index 000000000..d032110d6 --- /dev/null +++ b/cypress/integration/products/updatingProducts.js @@ -0,0 +1,152 @@ +import faker from "faker"; + +import { createCategory } from "../../apiRequests/Category"; +import { createCollection } from "../../apiRequests/Collections"; +import { getProductDetails } from "../../apiRequests/storeFront/ProductDetails"; +import { ONE_PERMISSION_USERS } from "../../Data/users"; +import { PRODUCT_DETAILS } from "../../elements/catalog/products/product-details"; +import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; +import { metadataForms } from "../../steps/catalog/metadataSteps"; +import { fillUpCommonFieldsForAllProductTypes } from "../../steps/catalog/products/productSteps"; +import { confirmationMessageShouldDisappear } from "../../steps/shared/confirmationMessage"; +import filterTests from "../../support/filterTests"; +import { productDetailsUrl } from "../../url/urlList"; +import { getDefaultChannel } from "../../utils/channelsUtils"; +import { deleteCollectionsStartsWith } from "../../utils/collectionsUtils"; +import { expectCorrectProductInformation } from "../../utils/products/checkProductInfo"; +import { + createProductInChannel, + createTypeAttributeAndCategoryForProduct, + deleteProductsStartsWith +} from "../../utils/products/productsUtils"; + +filterTests(["all"], () => { + describe("Update products", () => { + const startsWith = "CyUpdateProducts-"; + const name = `${startsWith}${faker.datatype.number()}`; + const description = faker.lorem.sentences(2); + + let defaultChannel; + let collection; + let product; + let attribute; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteProductsStartsWith(startsWith); + deleteCollectionsStartsWith(startsWith); + getDefaultChannel() + .then(channel => { + defaultChannel = channel; + createCollection(name); + }) + .then(collectionResp => { + collection = collectionResp; + createTypeAttributeAndCategoryForProduct(name); + }) + .then(({ attribute: attributeResp, category, productType }) => { + attribute = attributeResp; + createProductInChannel({ + attributeId: attribute.id, + categoryId: category.id, + productTypeId: productType.id, + channelId: defaultChannel.id, + name, + collectionId: collection.id, + description + }); + }) + .then(({ product: productResp }) => { + product = productResp; + }); + }); + + it("Should update product", () => { + const updatedName = `${startsWith}${faker.random.number()}`; + let updatedCategory; + let updatedCollection; + createCategory(updatedName) + .then(categoryResp => { + updatedCategory = categoryResp; + createCollection(updatedName); + }) + .then(collectionResp => { + updatedCollection = collectionResp; + const productData = { + generalInfo: { + name: updatedName, + description: faker.lorem.sentence(), + rating: 3 + }, + seo: { + slug: updatedName, + title: "newTitle", + description: "New description." + }, + metadata: { + private: { + metadataForm: metadataForms.private, + name: "newPrivate", + value: "value1" + }, + public: { + metadataForm: metadataForms.public, + name: "newPublic", + value: "value2" + } + }, + productOrganization: { + category: updatedCategory.name, + collection: updatedCollection.name + } + }; + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.product) + .visit(productDetailsUrl(product.id)) + .get(PRODUCT_DETAILS.collectionRemoveButtons) + .click(); + fillUpCommonFieldsForAllProductTypes(productData, false); + cy.addAliasToGraphRequest("UpdatePrivateMetadata"); + cy.addAliasToGraphRequest("UpdateMetadata"); + cy.addAliasToGraphRequest("ProductUpdate"); + cy.get(BUTTON_SELECTORS.confirm).click(); + confirmationMessageShouldDisappear(); + cy.wait("@ProductUpdate"); + cy.wait("@UpdateMetadata"); + cy.wait("@UpdatePrivateMetadata"); + productData.productOrganization.productType = name; + productData.attribute = attribute; + cy.loginUserViaRequest("token") + .then(() => { + getProductDetails(product.id, defaultChannel.slug, "auth").its( + "body.data.product" + ); + }) + .then(resp => { + expectCorrectProductInformation(resp, productData); + }); + }); + }); + + it("should delete product", () => { + cy.clearSessionData() + .loginUserViaRequest("auth", ONE_PERMISSION_USERS.product) + .visit(productDetailsUrl(product.id)) + .addAliasToGraphRequest("ProductDelete") + .get(BUTTON_SELECTORS.deleteButton) + .click() + .get(BUTTON_SELECTORS.submit) + .click() + .wait("@ProductDelete") + .loginUserViaRequest("token") + .then(() => { + getProductDetails(product.id, defaultChannel.slug).its("body.data"); + }) + .then( + productResp => + expect(productResp.product, "Check if product exist").to.be.null + ); + }); + }); +}); diff --git a/cypress/integration/staffMembers.js b/cypress/integration/staffMembers.js new file mode 100644 index 000000000..7072ed4e9 --- /dev/null +++ b/cypress/integration/staffMembers.js @@ -0,0 +1,115 @@ +import faker from "faker"; + +import { + deleteStaffMembersStartsWith, + updateStaffMember +} from "../apiRequests/StaffMembers"; +import { LEFT_MENU_SELECTORS } from "../elements/account/left-menu/left-menu-selectors"; +import { BUTTON_SELECTORS } from "../elements/shared/button-selectors"; +import { STAFF_MEMBER_DETAILS } from "../elements/staffMembers/staffMemberDetails"; +import { STAFF_MEMBERS_LIST } from "../elements/staffMembers/staffMembersList"; +import { expectWelcomeMessageIncludes } from "../steps/homePageSteps"; +import { getDisplayedSelectors } from "../steps/permissions"; +import { + fillUpSetPassword, + fillUpUserDetails, + updateUserActiveFlag +} from "../steps/user"; +import filterTests from "../support/filterTests"; +import { urlList, userDetailsUrl } from "../url/urlList"; +import { + getMailActivationLinkForUser, + inviteStaffMemberWithFirstPermission +} from "../utils/users"; + +filterTests(["stagedOnly"], () => { + describe("Staff members", () => { + const startsWith = "StaffMembers"; + const password = Cypress.env("USER_PASSWORD"); + const lastName = faker.name.lastName(); + const email = `${startsWith}${lastName}@example.com`; + let user; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deleteStaffMembersStartsWith(startsWith); + + inviteStaffMemberWithFirstPermission({ email }) + .then(({ user: userResp }) => { + user = userResp; + getMailActivationLinkForUser(email); + }) + .then(urlLink => { + cy.clearSessionData().visit(urlLink); + fillUpSetPassword(password); + cy.clearSessionData(); + }); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should invite user", () => { + const firstName = faker.name.firstName(); + const emailInvite = `${startsWith}${firstName}@example.com`; + + cy.visit(urlList.staffMembers) + .softExpectSkeletonIsVisible() + .get(STAFF_MEMBERS_LIST.inviteStaffMemberButton) + .click(); + fillUpUserDetails(firstName, lastName, emailInvite); + getMailActivationLinkForUser(emailInvite).then(urlLink => { + cy.clearSessionData().visit(urlLink); + fillUpSetPassword(password); + expectWelcomeMessageIncludes(`${firstName} ${lastName}`); + }); + }); + + it("should deactivate user", () => { + updateStaffMember({ userId: user.id, isActive: true }); + updateUserActiveFlag(user.id); + cy.clearSessionData() + .loginUserViaRequest("auth", { email, password }) + .its("body.data.tokenCreate") + .then(tokenCreate => { + chai + .softExpect( + tokenCreate.errors[0].code, + "logging in should return error" + ) + .to.be.eq("INVALID_CREDENTIALS"); + expect(tokenCreate.token).to.be.not.ok; + }); + }); + + it("should activate user", () => { + updateStaffMember({ userId: user.id, isActive: false }); + updateUserActiveFlag(user.id); + cy.clearSessionData() + .loginUserViaRequest("auth", { email, password }) + .visit(urlList.homePage); + expectWelcomeMessageIncludes(email); + }); + + it("should remove user permissions", () => { + cy.visit(userDetailsUrl(user.id)) + .get(STAFF_MEMBER_DETAILS.removePermissionButton) + .click() + .addAliasToGraphRequest("StaffMemberUpdate") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@StaffMemberUpdate") + .clearSessionData() + .loginUserViaRequest("auth", { email, password }) + .visit(urlList.homePage); + expectWelcomeMessageIncludes(email); + getDisplayedSelectors().then(displayedSelectors => { + expect(Object.values(displayedSelectors)).to.have.length(1); + expect(Object.values(displayedSelectors)[0]).to.eq( + LEFT_MENU_SELECTORS.home + ); + }); + }); + }); +}); diff --git a/cypress/integration/stagedOnly/adyen.js b/cypress/integration/stagedOnly/adyen.js deleted file mode 100644 index 3ade32aeb..000000000 --- a/cypress/integration/stagedOnly/adyen.js +++ /dev/null @@ -1,173 +0,0 @@ -import faker from "faker"; - -import { - addShippingMethod, - completeCheckout, - completeCheckoutWithAdyen, - createCheckout -} from "../../apiRequests/Checkout"; -import { getOrder } from "../../apiRequests/Order"; -import { getDefaultChannel } from "../../utils/channelsUtils"; -import { addAdyenPayment } from "../../utils/ordersUtils"; -import { - createProductInChannel, - createTypeAttributeAndCategoryForProduct, - deleteProductsStartsWith -} from "../../utils/products/productsUtils"; -import { - createShipping, - deleteShippingStartsWith -} from "../../utils/shippingUtils"; - -describe("Adyen payments", () => { - const startsWith = "CyChannelInDraftOrders-"; - const name = startsWith + faker.datatype.number(); - const email = `CyChannelInDraftOrders@example.com`; - - let address; - let defaultChannel; - let warehouse; - let shippingMethod; - let variantsList; - let checkout; - let paymentCards; - let cardData; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteProductsStartsWith(startsWith); - deleteShippingStartsWith(startsWith); - cy.fixture("cards").then(cardsResp => { - paymentCards = cardsResp; - cardData = { - clientData: paymentCards.clientData, - encryptedExpiryMonth: paymentCards.encryptedExpiryMonth, - encryptedExpiryYear: paymentCards.encryptedExpiryYear, - encryptedSecurityCode: paymentCards.encryptedSecurityCodes.matches - }; - }); - cy.fixture("addresses") - .then(addresses => { - address = addresses.usAddress; - getDefaultChannel(); - }) - .then(channelResp => { - defaultChannel = channelResp; - createShipping({ - channelId: channelResp.id, - name, - address, - price: 10 - }); - }) - .then( - ({ - warehouse: warehouseResp, - shippingZone: shippingZoneResp, - shippingMethod: shippingMethodResp - }) => { - warehouse = warehouseResp; - shippingMethod = shippingMethodResp; - } - ); - createTypeAttributeAndCategoryForProduct(name) - .then(({ productType, attribute, category }) => { - createProductInChannel({ - name, - channelId: defaultChannel.id, - warehouseId: warehouse.id, - productTypeId: productType.id, - attributeId: attribute.id, - categoryId: category.id - }); - }) - .then(({ variantsList: variants }) => (variantsList = variants)); - }); - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - createCheckout({ - channelSlug: defaultChannel.slug, - email, - variantsList, - address, - billingAddress: address, - auth: "token" - }) - .then(({ checkout: checkoutResp }) => { - checkout = checkoutResp; - addShippingMethod(checkout.id, shippingMethod.id); - }) - .then(({ checkout: checkoutResp }) => { - addAdyenPayment(checkout.id, checkoutResp.totalPrice.gross.amount); - }); - }); - it("should purchase products with simple card", () => { - const simpleCard = cardData; - simpleCard.encryptedCardNumber = - paymentCards.cards.simpleCard.encryptedCardNumber; - simpleCard.brand = paymentCards.cards.simpleCard.brand; - completeCheckout(checkout.id, simpleCard) - .then(({ order }) => { - getOrder(order.id); - }) - .then(order => { - expect(order.paymentStatus).to.eq("FULLY_CHARGED"); - }); - }); - it("should purchase product with 3D secure 2 Auth", () => { - const threeDSecureCard = cardData; - threeDSecureCard.encryptedCardNumber = - paymentCards.cards.threeDSecureTwoAuth.encryptedCardNumber; - threeDSecureCard.brand = paymentCards.cards.threeDSecureTwoAuth.brand; - completeCheckout(checkout.id, threeDSecureCard) - .then(({ order }) => { - getOrder(order.id); - }) - .then(order => { - expect(order.paymentStatus).to.eq("FULLY_CHARGED"); - }); - }); - it("should purchase product with 3D secure 1 Auth", () => { - const threeDSecureCardOneAuth = cardData; - threeDSecureCardOneAuth.encryptedCardNumber = - paymentCards.cards.threeDSecureOneAuth.encryptedCardNumber; - threeDSecureCardOneAuth.brand = - paymentCards.cards.threeDSecureOneAuth.brand; - completeCheckout(checkout.id, threeDSecureCardOneAuth) - .then(({ order }) => { - getOrder(order.id); - }) - .then(order => { - expect(order.paymentStatus).to.eq("FULLY_CHARGED"); - }); - }); - it("should fail with unknown security number", () => { - const simpleCard = cardData; - simpleCard.encryptedCardNumber = - paymentCards.cards.simpleCard.encryptedCardNumber; - simpleCard.brand = paymentCards.cards.simpleCard.brand; - simpleCard.encryptedSecurityCode = - paymentCards.encryptedSecurityCodes.unknown; - completeCheckout(checkout.id, simpleCard).then(({ checkoutErrors }) => { - expect(checkoutErrors).to.have.length(1); - }); - }); - it("should fail with timeout in 3D authorization", () => { - const errorCard = cardData; - errorCard.encryptedCardNumber = - paymentCards.cards.errorCard.encryptedCardNumber; - errorCard.brand = paymentCards.cards.errorCard.brand; - completeCheckout(checkout.id, errorCard).then(({ checkoutErrors }) => { - expect(checkoutErrors).to.have.length(1); - }); - }); - it("should fail with closed account", () => { - const closeAccount = cardData; - closeAccount.encryptedCardNumber = - paymentCards.cards.closeAccount.encryptedCardNumber; - closeAccount.brand = paymentCards.cards.closeAccount.brand; - completeCheckout(checkout.id, closeAccount).then(({ checkoutErrors }) => { - expect(checkoutErrors).to.have.length(1); - }); - }); -}); diff --git a/cypress/integration/stagedOnly/customerRegistration.js b/cypress/integration/stagedOnly/customerRegistration.js deleted file mode 100644 index 08922922c..000000000 --- a/cypress/integration/stagedOnly/customerRegistration.js +++ /dev/null @@ -1,40 +0,0 @@ -import faker from "faker"; - -import { - confirmAccount, - customerRegistration -} from "../../apiRequests/Customer"; -import { getDefaultChannel } from "../../utils/channelsUtils"; -import { getMailActivationLinkForUser } from "../../utils/users"; - -describe("Tests for customer registration with email", () => { - const startsWith = "RegistrationEmail"; - let defaultChannel; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - getDefaultChannel().then(channel => (defaultChannel = channel)); - }); - - it("should register customer", () => { - const email = `${startsWith}${faker.datatype.number()}@example.com`; - customerRegistration({ email, channel: defaultChannel.slug }); - getMailActivationLinkForUser(email) - .then(urlLink => { - const tokenRegex = /token=(.*)/; - const token = urlLink.match(tokenRegex)[1]; - cy.clearSessionData(); - confirmAccount(email, token); - }) - .then(() => { - cy.loginUserViaRequest("token", { - email, - password: Cypress.env("USER_PASSWORD") - }).its("body.data.tokenCreate"); - }) - .then(({ errors, token }) => { - expect(errors.length).to.eq(0); - expect(token).to.be.ok; - }); - }); -}); diff --git a/cypress/integration/stagedOnly/staffMembers.js b/cypress/integration/stagedOnly/staffMembers.js deleted file mode 100644 index 3829816f5..000000000 --- a/cypress/integration/stagedOnly/staffMembers.js +++ /dev/null @@ -1,112 +0,0 @@ -import faker from "faker"; - -import { - deleteStaffMembersStartsWith, - updateStaffMember -} from "../../apiRequests/StaffMembers"; -import { LEFT_MENU_SELECTORS } from "../../elements/account/left-menu/left-menu-selectors"; -import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors"; -import { STAFF_MEMBER_DETAILS } from "../../elements/staffMembers/staffMemberDetails"; -import { STAFF_MEMBERS_LIST } from "../../elements/staffMembers/staffMembersList"; -import { expectWelcomeMessageIncludes } from "../../steps/homePageSteps"; -import { getDisplayedSelectors } from "../../steps/permissions"; -import { - fillUpSetPassword, - fillUpUserDetails, - updateUserActiveFlag -} from "../../steps/user"; -import { urlList, userDetailsUrl } from "../../url/urlList"; -import { - getMailActivationLinkForUser, - inviteStaffMemberWithFirstPermission -} from "../../utils/users"; - -describe("Staff members", () => { - const startsWith = "StaffMembers"; - const password = Cypress.env("USER_PASSWORD"); - const lastName = faker.name.lastName(); - const email = `${startsWith}${lastName}@example.com`; - let user; - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - deleteStaffMembersStartsWith(startsWith); - - inviteStaffMemberWithFirstPermission({ email }) - .then(({ user: userResp }) => { - user = userResp; - getMailActivationLinkForUser(email); - }) - .then(urlLink => { - cy.clearSessionData().visit(urlLink); - fillUpSetPassword(password); - cy.clearSessionData(); - }); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should invite user", () => { - const firstName = faker.name.firstName(); - const emailInvite = `${startsWith}${firstName}@example.com`; - - cy.visit(urlList.staffMembers) - .softExpectSkeletonIsVisible() - .get(STAFF_MEMBERS_LIST.inviteStaffMemberButton) - .click(); - fillUpUserDetails(firstName, lastName, emailInvite); - getMailActivationLinkForUser(emailInvite).then(urlLink => { - cy.clearSessionData().visit(urlLink); - fillUpSetPassword(password); - expectWelcomeMessageIncludes(`${firstName} ${lastName}`); - }); - }); - - it("should deactivate user", () => { - updateStaffMember({ userId: user.id, isActive: true }); - updateUserActiveFlag(user.id); - cy.clearSessionData() - .loginUserViaRequest("auth", { email, password }) - .its("body.data.tokenCreate") - .then(tokenCreate => { - chai - .softExpect( - tokenCreate.errors[0].code, - "logging in should return error" - ) - .to.be.eq("INVALID_CREDENTIALS"); - expect(tokenCreate.token).to.be.not.ok; - }); - }); - - it("should activate user", () => { - updateStaffMember({ userId: user.id, isActive: false }); - updateUserActiveFlag(user.id); - cy.clearSessionData() - .loginUserViaRequest("auth", { email, password }) - .visit(urlList.homePage); - expectWelcomeMessageIncludes(email); - }); - - it("should remove user permissions", () => { - cy.visit(userDetailsUrl(user.id)) - .get(STAFF_MEMBER_DETAILS.removePermissionButton) - .click() - .addAliasToGraphRequest("StaffMemberUpdate") - .get(BUTTON_SELECTORS.confirm) - .click() - .wait("@StaffMemberUpdate") - .clearSessionData() - .loginUserViaRequest("auth", { email, password }) - .visit(urlList.homePage); - expectWelcomeMessageIncludes(email); - getDisplayedSelectors().then(displayedSelectors => { - expect(Object.values(displayedSelectors)).to.have.length(1); - expect(Object.values(displayedSelectors)[0]).to.eq( - LEFT_MENU_SELECTORS.home - ); - }); - }); -}); diff --git a/cypress/steps/collectionsSteps.js b/cypress/steps/collectionsSteps.js index 32101f79c..8ae319164 100644 --- a/cypress/steps/collectionsSteps.js +++ b/cypress/steps/collectionsSteps.js @@ -4,6 +4,7 @@ import { SELECT_CHANNELS_TO_ASSIGN } from "../elements/channels/select-channels- import { ASSIGN_ELEMENTS_SELECTORS } from "../elements/shared/assign-elements-selectors"; import { BUTTON_SELECTORS } from "../elements/shared/button-selectors"; import { SHARED_ELEMENTS } from "../elements/shared/sharedElements"; +import { confirmationMessageShouldDisappear } from "./shared/confirmationMessage"; export function createCollection(collectionName, isPublished, channel) { const publishedSelector = isPublished @@ -29,11 +30,12 @@ export function createCollection(collectionName, isPublished, channel) { .click(); cy.addAliasToGraphRequest("CreateCollection"); cy.get(COLLECTION_SELECTORS.saveButton).click(); - cy.get(SHARED_ELEMENTS.confirmationMsg).should("be.visible"); + confirmationMessageShouldDisappear(); return cy .wait("@CreateCollection") .its("response.body.data.collectionCreate.collection"); } + export function assignProductsToCollection(productName) { cy.get(COLLECTION_SELECTORS.addProductButton) .click() diff --git a/cypress/steps/shared/confirmationMessage.js b/cypress/steps/shared/confirmationMessage.js index 516cd2939..67fafefaa 100644 --- a/cypress/steps/shared/confirmationMessage.js +++ b/cypress/steps/shared/confirmationMessage.js @@ -1,8 +1,8 @@ import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; export function confirmationMessageShouldDisappear() { - cy.get(SHARED_ELEMENTS.confirmationMsg) + cy.get(SHARED_ELEMENTS.notificationSuccess) .should("be.visible") - .get(SHARED_ELEMENTS.confirmationMsg) + .get(SHARED_ELEMENTS.notificationSuccess) .should("not.exist"); } diff --git a/cypress/steps/shared/confirmationMessages.js b/cypress/steps/shared/confirmationMessages.js index 516cd2939..67fafefaa 100644 --- a/cypress/steps/shared/confirmationMessages.js +++ b/cypress/steps/shared/confirmationMessages.js @@ -1,8 +1,8 @@ import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements"; export function confirmationMessageShouldDisappear() { - cy.get(SHARED_ELEMENTS.confirmationMsg) + cy.get(SHARED_ELEMENTS.notificationSuccess) .should("be.visible") - .get(SHARED_ELEMENTS.confirmationMsg) + .get(SHARED_ELEMENTS.notificationSuccess) .should("not.exist"); } diff --git a/cypress/support/filterTests.js b/cypress/support/filterTests.js new file mode 100644 index 000000000..80c03dd17 --- /dev/null +++ b/cypress/support/filterTests.js @@ -0,0 +1,24 @@ +// / + +/** + * Filter Cypress tests based on a given tag or tags. If no tags are present, run tests. + * + * @param {[string]} definedTags An array of tags + * @param {Function} runTest All tests captured within a Cypress run + * @example npm run open --env tags=api + */ + +const filterTests = (definedTags, runTest) => { + if (Cypress.env("tags")) { + const tags = Cypress.env("tags").split("/"); + const found = definedTags.some($definedTag => tags.includes($definedTag)); + + if (found) { + runTest(); + } + } else { + runTest(); + } +}; + +export default filterTests; diff --git a/package.json b/package.json index c5a368137..d150ebceb 100644 --- a/package.json +++ b/package.json @@ -248,7 +248,8 @@ "cy:run": "cypress run", "cy:run:record": "npm run cy:run -- --record", "cy:open": "cypress open", - "cy:run:allEnv": "cypress run --spec 'cypress/integration/stagedOnly/*'", + "cy:run:critical": "cypress run --env tags=critical --spec 'cypress/integration/navigation.js','cypress/integration/products/*.js','cypress/integration/checkout/*.js'", + "cy:run:allEnv": "cypress run --env tags=all", "test:e2e:run": "start-server-and-test start http://localhost:9000 cy:run", "test:e2e:run:record": "start-server-and-test start http://localhost:9000 cy:run:record", "test:e2e:dev": "start-server-and-test start http://localhost:9000 cy:open",