add tags (#1251)
* add tags * edit e2e.yaml * fix test for customer registration * add empty lines
This commit is contained in:
parent
b024a0fde6
commit
1f01a09e87
96 changed files with 5612 additions and 5425 deletions
2
.github/workflows/e2e.yml
vendored
2
.github/workflows/e2e.yml
vendored
|
@ -63,7 +63,7 @@ jobs:
|
||||||
start: npx local-web-server --spa index.html
|
start: npx local-web-server --spa index.html
|
||||||
wait-on: http://localhost:9000/
|
wait-on: http://localhost:9000/
|
||||||
wait-on-timeout: 120
|
wait-on-timeout: 120
|
||||||
spec: cypress/integration/allEnv/**/*.js
|
command: npm run cy:run:allEnv
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: ${{ failure() }}
|
if: ${{ failure() }}
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -5,8 +5,7 @@ export const SHARED_ELEMENTS = {
|
||||||
skeleton: '[data-test-id="skeleton"]',
|
skeleton: '[data-test-id="skeleton"]',
|
||||||
table: 'table[class*="Table"]',
|
table: 'table[class*="Table"]',
|
||||||
tableRow: '[data-test="id"]',
|
tableRow: '[data-test="id"]',
|
||||||
confirmationMsg: "[data-test='notification-success']",
|
notificationSuccess: '[data-test="notification"][data-test-type="success"]',
|
||||||
notificationSuccess: '[data-test="notification-success"]',
|
|
||||||
dialog: '[role="dialog"]',
|
dialog: '[role="dialog"]',
|
||||||
searchInput: '[data-test-id="searchInput"]',
|
searchInput: '[data-test-id="searchInput"]',
|
||||||
selectOption: '[data-test="selectFieldOption"]',
|
selectOption: '[data-test="selectFieldOption"]',
|
||||||
|
|
182
cypress/integration/adyen.js
Normal file
182
cypress/integration/adyen.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,136 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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");
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,118 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
|
|
||||||
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"
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,178 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,120 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
|
|
||||||
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
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,160 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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");
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,148 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,124 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,141 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,134 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,187 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,112 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,198 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
|
|
||||||
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));
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,177 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -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}`);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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";
|
|
||||||
|
|
||||||
// <reference types="cypress" />
|
|
||||||
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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,39 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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/");
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,98 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,102 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,200 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,141 +0,0 @@
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -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";
|
|
||||||
|
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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";
|
|
||||||
|
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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";
|
|
||||||
|
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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";
|
|
||||||
|
|
||||||
// <reference types="cypress" />
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
110
cypress/integration/apps.js
Normal file
110
cypress/integration/apps.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
139
cypress/integration/categories.js
Normal file
139
cypress/integration/categories.js
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
124
cypress/integration/checkout/productWithoutShipping.js
Normal file
124
cypress/integration/checkout/productWithoutShipping.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
240
cypress/integration/checkout/purchaseWithProductTypes.js
Normal file
240
cypress/integration/checkout/purchaseWithProductTypes.js
Normal file
|
@ -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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
168
cypress/integration/checkout/stocksInCheckout.js
Normal file
168
cypress/integration/checkout/stocksInCheckout.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
71
cypress/integration/checkout/warehouses.js
Normal file
71
cypress/integration/checkout/warehouses.js
Normal file
|
@ -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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
184
cypress/integration/collections.js
Normal file
184
cypress/integration/collections.js
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
123
cypress/integration/configuration/attributes/attributes.js
Normal file
123
cypress/integration/configuration/attributes/attributes.js
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
123
cypress/integration/configuration/attributes/contentAttribute.js
Normal file
123
cypress/integration/configuration/attributes/contentAttribute.js
Normal file
|
@ -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
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
163
cypress/integration/configuration/channels.js
Normal file
163
cypress/integration/configuration/channels.js
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
66
cypress/integration/configuration/customer.js
Normal file
66
cypress/integration/configuration/customer.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
151
cypress/integration/configuration/inactiveChannel.js
Normal file
151
cypress/integration/configuration/inactiveChannel.js
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
69
cypress/integration/configuration/navigation.js
Normal file
69
cypress/integration/configuration/navigation.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
151
cypress/integration/configuration/permissions.js
Normal file
151
cypress/integration/configuration/permissions.js
Normal file
|
@ -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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
106
cypress/integration/configuration/productTypes.js
Normal file
106
cypress/integration/configuration/productTypes.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,129 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,144 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
137
cypress/integration/configuration/shippingMethods/postalCodes.js
Normal file
137
cypress/integration/configuration/shippingMethods/postalCodes.js
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,190 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
78
cypress/integration/configuration/siteSettings.js
Normal file
78
cypress/integration/configuration/siteSettings.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
115
cypress/integration/configuration/warehouse.js
Normal file
115
cypress/integration/configuration/warehouse.js
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
85
cypress/integration/customerRegistration.js
Normal file
85
cypress/integration/customerRegistration.js
Normal file
|
@ -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;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
201
cypress/integration/discounts/sales.js
Normal file
201
cypress/integration/discounts/sales.js
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
182
cypress/integration/discounts/vouchers.js
Normal file
182
cypress/integration/discounts/vouchers.js
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
22
cypress/integration/homePage/homePage.js
Normal file
22
cypress/integration/homePage/homePage.js
Normal file
|
@ -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}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
262
cypress/integration/homePage/homePageAnalitics.js
Normal file
262
cypress/integration/homePage/homePageAnalitics.js
Normal file
|
@ -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";
|
||||||
|
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
42
cypress/integration/login_form.js
Normal file
42
cypress/integration/login_form.js
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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/");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
100
cypress/integration/metadata.js
Normal file
100
cypress/integration/metadata.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
52
cypress/integration/navigation.js
Normal file
52
cypress/integration/navigation.js
Normal file
|
@ -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
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
101
cypress/integration/orders/channelsInDraftOrders.js
Normal file
101
cypress/integration/orders/channelsInDraftOrders.js
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
105
cypress/integration/orders/draftOrders.js
Normal file
105
cypress/integration/orders/draftOrders.js
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
211
cypress/integration/orders/orders.js
Normal file
211
cypress/integration/orders/orders.js
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
64
cypress/integration/pages/pageTypes.js
Normal file
64
cypress/integration/pages/pageTypes.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
145
cypress/integration/products/createProduct.js
Normal file
145
cypress/integration/products/createProduct.js
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
// <reference types="cypress" />
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -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";
|
||||||
|
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
109
cypress/integration/products/menageProducts/publishedProducts.js
Normal file
109
cypress/integration/products/menageProducts/publishedProducts.js
Normal file
|
@ -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";
|
||||||
|
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -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";
|
||||||
|
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
123
cypress/integration/products/productsList/filteringProducts.js
Normal file
123
cypress/integration/products/productsList/filteringProducts.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
64
cypress/integration/products/productsList/pagination.js
Normal file
64
cypress/integration/products/productsList/pagination.js
Normal file
|
@ -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
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
31
cypress/integration/products/productsList/sortingProducts.js
Normal file
31
cypress/integration/products/productsList/sortingProducts.js
Normal file
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
209
cypress/integration/products/productsVariants.js
Normal file
209
cypress/integration/products/productsVariants.js
Normal file
|
@ -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";
|
||||||
|
// <reference types="cypress" />
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
152
cypress/integration/products/updatingProducts.js
Normal file
152
cypress/integration/products/updatingProducts.js
Normal file
|
@ -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
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
115
cypress/integration/staffMembers.js
Normal file
115
cypress/integration/staffMembers.js
Normal file
|
@ -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
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -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 { ASSIGN_ELEMENTS_SELECTORS } from "../elements/shared/assign-elements-selectors";
|
||||||
import { BUTTON_SELECTORS } from "../elements/shared/button-selectors";
|
import { BUTTON_SELECTORS } from "../elements/shared/button-selectors";
|
||||||
import { SHARED_ELEMENTS } from "../elements/shared/sharedElements";
|
import { SHARED_ELEMENTS } from "../elements/shared/sharedElements";
|
||||||
|
import { confirmationMessageShouldDisappear } from "./shared/confirmationMessage";
|
||||||
|
|
||||||
export function createCollection(collectionName, isPublished, channel) {
|
export function createCollection(collectionName, isPublished, channel) {
|
||||||
const publishedSelector = isPublished
|
const publishedSelector = isPublished
|
||||||
|
@ -29,11 +30,12 @@ export function createCollection(collectionName, isPublished, channel) {
|
||||||
.click();
|
.click();
|
||||||
cy.addAliasToGraphRequest("CreateCollection");
|
cy.addAliasToGraphRequest("CreateCollection");
|
||||||
cy.get(COLLECTION_SELECTORS.saveButton).click();
|
cy.get(COLLECTION_SELECTORS.saveButton).click();
|
||||||
cy.get(SHARED_ELEMENTS.confirmationMsg).should("be.visible");
|
confirmationMessageShouldDisappear();
|
||||||
return cy
|
return cy
|
||||||
.wait("@CreateCollection")
|
.wait("@CreateCollection")
|
||||||
.its("response.body.data.collectionCreate.collection");
|
.its("response.body.data.collectionCreate.collection");
|
||||||
}
|
}
|
||||||
|
|
||||||
export function assignProductsToCollection(productName) {
|
export function assignProductsToCollection(productName) {
|
||||||
cy.get(COLLECTION_SELECTORS.addProductButton)
|
cy.get(COLLECTION_SELECTORS.addProductButton)
|
||||||
.click()
|
.click()
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements";
|
import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements";
|
||||||
|
|
||||||
export function confirmationMessageShouldDisappear() {
|
export function confirmationMessageShouldDisappear() {
|
||||||
cy.get(SHARED_ELEMENTS.confirmationMsg)
|
cy.get(SHARED_ELEMENTS.notificationSuccess)
|
||||||
.should("be.visible")
|
.should("be.visible")
|
||||||
.get(SHARED_ELEMENTS.confirmationMsg)
|
.get(SHARED_ELEMENTS.notificationSuccess)
|
||||||
.should("not.exist");
|
.should("not.exist");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements";
|
import { SHARED_ELEMENTS } from "../../elements/shared/sharedElements";
|
||||||
|
|
||||||
export function confirmationMessageShouldDisappear() {
|
export function confirmationMessageShouldDisappear() {
|
||||||
cy.get(SHARED_ELEMENTS.confirmationMsg)
|
cy.get(SHARED_ELEMENTS.notificationSuccess)
|
||||||
.should("be.visible")
|
.should("be.visible")
|
||||||
.get(SHARED_ELEMENTS.confirmationMsg)
|
.get(SHARED_ELEMENTS.notificationSuccess)
|
||||||
.should("not.exist");
|
.should("not.exist");
|
||||||
}
|
}
|
||||||
|
|
24
cypress/support/filterTests.js
Normal file
24
cypress/support/filterTests.js
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// / <reference types="Cypress" />
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
|
@ -248,7 +248,8 @@
|
||||||
"cy:run": "cypress run",
|
"cy:run": "cypress run",
|
||||||
"cy:run:record": "npm run cy:run -- --record",
|
"cy:run:record": "npm run cy:run -- --record",
|
||||||
"cy:open": "cypress open",
|
"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": "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: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",
|
"test:e2e:dev": "start-server-and-test start http://localhost:9000 cy:open",
|
||||||
|
|
Loading…
Reference in a new issue