diff --git a/cypress/apiRequests/Channels.js b/cypress/apiRequests/Channels.js index b66c39804..6d8872798 100644 --- a/cypress/apiRequests/Channels.js +++ b/cypress/apiRequests/Channels.js @@ -20,41 +20,24 @@ class Channels { }`; return cy.sendRequestWithQuery(createChannelMutation); } - - deleteTestChannels(nameStartsWith) { + getChannels() { const getChannelsInfoQuery = `query{ - channels{ - name - id - isActive - slug - currencyCode - } - } - `; - cy.sendRequestWithQuery(getChannelsInfoQuery).then(resp => { - const channels = new Set(resp.body.data.channels); - channels.forEach(element => { - if (element.name.startsWith(nameStartsWith)) { - const targetChannels = Array.from(channels).filter(function(channel) { - return ( - element.currencyCode === channel.currencyCode && - element.id !== channel.id - ); - }); - if (targetChannels[0]) { - this.deleteChannel(element.id, targetChannels[0].id); - channels.delete(element); - } - } - }); - }); + channels{ + name + id + isActive + slug + currencyCode + } + } + `; + return cy.sendRequestWithQuery(getChannelsInfoQuery); } - deleteChannel(channelId, targetChennelId) { + deleteChannel(channelId, targetChannelId) { const deleteChannelMutation = `mutation{ channelDelete(id: "${channelId}", input:{ - targetChannel: "${targetChennelId}" + targetChannel: "${targetChannelId}" }){ channel{ name diff --git a/cypress/apiRequests/HomePage.js b/cypress/apiRequests/HomePage.js new file mode 100644 index 000000000..09026cc03 --- /dev/null +++ b/cypress/apiRequests/HomePage.js @@ -0,0 +1,37 @@ +class HomePage { + getSalesForChannel(channelSlug, period) { + const query = `query{ + ordersTotal(period: ${period}, channel:"${channelSlug}"){ + gross{ + amount + } + } + }`; + return cy.sendRequestWithQuery(query); + } + getOrdersForChannel(channelSlug, created) { + const query = `query{ + orders(created: ${created}, channel:"${channelSlug}"){ + totalCount + } + }`; + return cy.sendRequestWithQuery(query); + } + getOrdersWithStatus(status, channelSlug) { + const query = `query{ + orders(status: ${status}, channel:"${channelSlug}"){ + totalCount + } + }`; + return cy.sendRequestWithQuery(query); + } + getProductsOutOfStock(channelSlug) { + const query = `query{ + products(stockAvailability: OUT_OF_STOCK, channel:"${channelSlug}"){ + totalCount + } + }`; + return cy.sendRequestWithQuery(query); + } +} +export default HomePage; diff --git a/cypress/elements/dashboard/dashboard-selectors.js b/cypress/elements/homePage/homePage-selectors.js similarity index 91% rename from cypress/elements/dashboard/dashboard-selectors.js rename to cypress/elements/homePage/homePage-selectors.js index 40cc039fe..221cb68e8 100644 --- a/cypress/elements/dashboard/dashboard-selectors.js +++ b/cypress/elements/homePage/homePage-selectors.js @@ -1,4 +1,4 @@ -export const DASHBOARD_SELECTORS = { +export const HOMEPAGE_SELECTORS = { sales: "[data-test-id='sales-analytics']", orders: "[data-test-id='orders-analytics']", activity: "[data-test-id='activity-card']", diff --git a/cypress/integration/channels.js b/cypress/integration/channels.js index 31db58232..bfee7abae 100644 --- a/cypress/integration/channels.js +++ b/cypress/integration/channels.js @@ -14,16 +14,18 @@ import { ORDERS_SELECTORS } from "../elements/orders/orders-selectors"; import { BUTTON_SELECTORS } from "../elements/shared/button-selectors"; import ChannelsSteps from "../steps/channelsSteps"; import { urlList } from "../url/urlList"; +import ChannelsUtils from "../utils/channelsUtils"; describe("Channels", () => { const channelStartsWith = "Cypress:"; const currency = "PLN"; const channels = new Channels(); + const channelsUtils = new ChannelsUtils(); const channelsSteps = new ChannelsSteps(); before(() => { cy.clearSessionData().loginUserViaRequest(); - channels.deleteTestChannels(channelStartsWith); + channelsUtils.deleteChannels(channelStartsWith); }); beforeEach(() => { diff --git a/cypress/integration/dashboard.js b/cypress/integration/dashboard.js deleted file mode 100644 index c9983d820..000000000 --- a/cypress/integration/dashboard.js +++ /dev/null @@ -1,143 +0,0 @@ -import faker from "faker"; - -import Channels from "../apiRequests/Channels"; -import Customer from "../apiRequests/Customer"; -import { DASHBOARD_SELECTORS } from "../elements/dashboard/dashboard-selectors"; -import { HEADER_SELECTORS } from "../elements/header/header-selectors"; -import OrdersUtils from "../utils/ordersUtils"; -import ProductsUtils from "../utils/productsUtils"; -import ShippingUtils from "../utils/shippingUtils"; - -// -describe("User authorization", () => { - const startsWith = "Cy-"; - - const customer = new Customer(); - const channels = new Channels(); - const productsUtils = new ProductsUtils(); - const shippingUtils = new ShippingUtils(); - const ordersUtils = new OrdersUtils(); - - before(() => { - cy.clearSessionData().loginUserViaRequest(); - customer.deleteCustomers(startsWith); - shippingUtils.deleteShipping(startsWith); - productsUtils.deleteProducts(startsWith); - channels.deleteTestChannels(startsWith); - }); - - beforeEach(() => { - cy.clearSessionData().loginUserViaRequest(); - }); - - it("should all elements be visible on the dashboard", () => { - cy.visit("/") - .softAssertVisibility(DASHBOARD_SELECTORS.sales) - .softAssertVisibility(DASHBOARD_SELECTORS.orders) - .softAssertVisibility(DASHBOARD_SELECTORS.activity) - .softAssertVisibility(DASHBOARD_SELECTORS.topProducts) - .softAssertVisibility(DASHBOARD_SELECTORS.ordersReadyToFulfill) - .softAssertVisibility(DASHBOARD_SELECTORS.paymentsWaitingForCapture) - .softAssertVisibility(DASHBOARD_SELECTORS.productsOutOfStock); - }); - - it("should correct amount of orders be displayed", () => { - const randomName = startsWith + faker.random.number(); - const randomEmail = randomName + "@example.com"; - const randomNameProductOutOfStock = `${startsWith}${faker.random.number()}`; - const shippingPrice = 12; - const productPrice = 22; - const sales = productPrice * 2 + shippingPrice; - - // Create channel, customer, product - everything needed to create order - cy.fixture("addresses").then(json => { - channels - .createChannel(true, randomName, randomName, json.plAddress.currency) - .then(channelsResp => { - const channelId = channelsResp.body.data.channelCreate.channel.id; - const channelSlug = channelsResp.body.data.channelCreate.channel.slug; - customer - .createCustomer(randomEmail, randomName, json.plAddress) - .then(resp => { - const customerId = resp.body.data.customerCreate.user.id; - const customerEmail = resp.body.data.customerCreate.user.email; - shippingUtils - .createShipping( - channelId, - randomName, - json.plAddress, - shippingPrice - ) - .then(() => { - const shippingId = shippingUtils.getShippingMethodId(); - const warehouseId = shippingUtils.getWarehouseId(); - productsUtils - .createTypeAttributeAndCategoryForProduct(randomName) - .then(() => { - const productTypeId = productsUtils.getProductTypeId(); - const attributeId = productsUtils.getAttributeId(); - const categoryId = productsUtils.getCategoryId(); - productsUtils - .createProductInChannel( - randomName, - channelId, - warehouseId, - 10, - productTypeId, - attributeId, - categoryId, - productPrice - ) - .then(() => { - const variantsList = productsUtils.getCreatedVariants(); - - // Create order ready to fulfill - ordersUtils.createReadyToFulfillOrder( - customerId, - shippingId, - channelId, - variantsList - ); - - // Create order waiting for capture - ordersUtils.createWaitingForCaptureOrder( - channelSlug, - customerEmail, - variantsList, - shippingId - ); - }); - - // Create product out of stock - productsUtils.createProductInChannel( - randomNameProductOutOfStock, - channelId, - warehouseId, - 0, - productTypeId, - attributeId, - categoryId, - productPrice - ); - }); - }); - }); - }); - }); - cy.visit("/"); - cy.get(HEADER_SELECTORS.channelSelect) - .click() - .get(HEADER_SELECTORS.channelSelectList) - .contains(randomName) - .click() - .waitForGraph("Home"); - const salesRegexp = new RegExp(`\\D+${sales}[\,.]00\\D*`); - cy.contains(salesRegexp).should("be.visible"); - const regex = /^1\D+/; - cy.softAssertMatch(DASHBOARD_SELECTORS.ordersReadyToFulfill, regex) - .softAssertMatch(DASHBOARD_SELECTORS.paymentsWaitingForCapture, regex) - .softAssertMatch(DASHBOARD_SELECTORS.productsOutOfStock, regex) - .softAssertMatch(DASHBOARD_SELECTORS.sales, salesRegexp) - .softAssertMatch(DASHBOARD_SELECTORS.orders, /\D+2\D*/); - }); -}); diff --git a/cypress/integration/homePage.js b/cypress/integration/homePage.js new file mode 100644 index 000000000..c1f7e5cfc --- /dev/null +++ b/cypress/integration/homePage.js @@ -0,0 +1,205 @@ +import faker from "faker"; + +import Customer from "../apiRequests/Customer"; +import { HOMEPAGE_SELECTORS } from "../elements/homePage/homePage-selectors"; +import HomePageSteps from "../steps/homePageSteps"; +import { urlList } from "../url/urlList"; +import ChannelsUtils from "../utils/channelsUtils"; +import HomePageUtils from "../utils/homePageUtils"; +import OrdersUtils from "../utils/ordersUtils"; +import ProductsUtils from "../utils/productsUtils"; +import ShippingUtils from "../utils/shippingUtils"; + +// +describe("User authorization", () => { + const startsWith = "Cy-"; + + const customer = new Customer(); + const productsUtils = new ProductsUtils(); + const shippingUtils = new ShippingUtils(); + const ordersUtils = new OrdersUtils(); + const channelsUtils = new ChannelsUtils(); + const homePageUtils = new HomePageUtils(); + const homePageSteps = new HomePageSteps(); + + let customerId; + let defaultChannel; + const productPrice = 22; + const shippingPrice = 12; + const randomName = startsWith + faker.random.number(); + const randomEmail = randomName + "@example.com"; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + customer.deleteCustomers(startsWith); + shippingUtils.deleteShipping(startsWith); + productsUtils.deleteProducts(startsWith); + + channelsUtils.getDefaultChannel().then(channel => { + defaultChannel = channel; + cy.fixture("addresses").then(addressesFixture => { + customer + .createCustomer(randomEmail, randomName, addressesFixture.plAddress) + .then(resp => { + customerId = resp.body.data.customerCreate.user.id; + shippingUtils + .createShipping( + defaultChannel.id, + randomName, + addressesFixture.plAddress, + shippingPrice + ) + .then(() => { + const warehouseId = shippingUtils.getWarehouseId(); + productsUtils + .createTypeAttributeAndCategoryForProduct(randomName) + .then(() => { + const productTypeId = productsUtils.getProductTypeId(); + const attributeId = productsUtils.getAttributeId(); + const categoryId = productsUtils.getCategoryId(); + productsUtils.createProductInChannel( + randomName, + defaultChannel.id, + warehouseId, + 20, + productTypeId, + attributeId, + categoryId, + productPrice + ); + }); + }); + }); + }); + }); + }); + + 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"); + + ordersUtils.createReadyToFulfillOrder( + customerId, + shippingUtils.getShippingMethodId(), + defaultChannel.id, + productsUtils.getCreatedVariants() + ); + cy.get("@ordersReadyToFulfill").then(ordersReadyToFulfill => { + const regexp = new RegExp(`^${ordersReadyToFulfill + 1}\D*`); + cy.visit(urlList.homePage); + homePageSteps.changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.ordersReadyToFulfill, regexp).should( + "be.visible" + ); + }); + }); + it("should correct amount of payments waiting for capture be displayed", () => { + homePageUtils + .getOrdersReadyForCapture(defaultChannel.slug) + .as("ordersReadyForCapture"); + const shippingId = shippingUtils.getShippingMethodId(); + const variantsList = productsUtils.getCreatedVariants(); + + ordersUtils.createWaitingForCaptureOrder( + defaultChannel.slug, + randomEmail, + variantsList, + shippingId + ); + + cy.get("@ordersReadyForCapture").then(ordersReadyForCapture => { + const regexp = new RegExp(`^${ordersReadyForCapture + 1}\D*`); + cy.visit(urlList.homePage); + homePageSteps.changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.ordersReadyForCapture, regexp).should( + "be.visible" + ); + }); + }); + it("should correct amount of products out of stock be displayed", () => { + homePageUtils + .getProductsOutOfStock(defaultChannel.slug) + .as("productsOutOfStock"); + const productOutOfStockRandomName = startsWith + faker.random.number(); + const productsOutOfStockUtils = new ProductsUtils(); + const warehouseId = shippingUtils.getWarehouseId(); + const productTypeId = productsUtils.getProductTypeId(); + const attributeId = productsUtils.getAttributeId(); + const categoryId = productsUtils.getCategoryId(); + + productsOutOfStockUtils.createProductInChannel( + productOutOfStockRandomName, + defaultChannel.id, + warehouseId, + 0, + productTypeId, + attributeId, + categoryId, + productPrice + ); + + cy.get("@productsOutOfStock").then(productsOutOfStock => { + const regexp = new RegExp(`^${productsOutOfStock + 1}\\D*`); + cy.visit(urlList.homePage); + homePageSteps.changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.productsOutOfStock, regexp).should( + "be.visible" + ); + }); + }); + it("should correct amount of sales be displayed", () => { + homePageUtils.getSalesAmount(defaultChannel.slug).as("salesAmount"); + + ordersUtils.createReadyToFulfillOrder( + customerId, + shippingUtils.getShippingMethodId(), + defaultChannel.id, + productsUtils.getCreatedVariants() + ); + + cy.get("@salesAmount").then(salesAmount => { + let totalAmount = salesAmount + productPrice; + totalAmount = totalAmount + .toFixed(2) + .toString() + .replace(".", "[,.]"); + const regexp = new RegExp(`\\D*${totalAmount}\\D*`); + cy.visit(urlList.homePage); + homePageSteps.changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.sales, regexp).should("be.visible"); + }); + }); + it("should correct amount of orders be displayed", () => { + homePageUtils.getTodaysOrders(defaultChannel.slug).as("todaysOrders"); + + ordersUtils.createReadyToFulfillOrder( + customerId, + shippingUtils.getShippingMethodId(), + defaultChannel.id, + productsUtils.getCreatedVariants() + ); + + cy.get("@todaysOrders").then(todaysOrders => { + const regexp = new RegExp(`\\D*${todaysOrders + 1}\\D*`); + cy.visit(urlList.homePage); + homePageSteps.changeChannel(defaultChannel.name); + cy.contains(HOMEPAGE_SELECTORS.orders, regexp).should("be.visible"); + }); + }); +}); diff --git a/cypress/steps/homePageSteps.js b/cypress/steps/homePageSteps.js new file mode 100644 index 000000000..bd53c0972 --- /dev/null +++ b/cypress/steps/homePageSteps.js @@ -0,0 +1,12 @@ +import { HEADER_SELECTORS } from "../elements/header/header-selectors"; +class HomePageSteps { + changeChannel(channelName) { + cy.get(HEADER_SELECTORS.channelSelect) + .click() + .get(HEADER_SELECTORS.channelSelectList) + .contains(channelName) + .click() + .waitForGraph("Home"); + } +} +export default HomePageSteps; diff --git a/cypress/utils/channelsUtils.js b/cypress/utils/channelsUtils.js new file mode 100644 index 000000000..dbb053c6e --- /dev/null +++ b/cypress/utils/channelsUtils.js @@ -0,0 +1,40 @@ +import Channels from "../apiRequests/Channels"; + +class ChannelsUtils { + channels = new Channels(); + + deleteChannels(nameStartsWith) { + this.channels.getChannels().then(resp => { + const channelsArray = new Set(resp.body.data.channels); + if (channelsArray) { + channelsArray.forEach(element => { + if (element.name.startsWith(nameStartsWith)) { + const targetChannels = Array.from(channelsArray).filter(function( + channelElement + ) { + return ( + element.currencyCode === channelElement.currencyCode && + element.id !== channelElement.id + ); + }); + if (targetChannels[0]) { + this.channels.deleteChannel(element.id, targetChannels[0].id); + channelsArray.delete(element); + } + } + }); + } + }); + } + getDefaultChannel() { + return this.channels.getChannels().then(resp => { + const channelsArray = resp.body.data.channels; + return (this.defaultChannel = channelsArray.find(function( + channelElement + ) { + return channelElement.slug === "default-channel"; + })); + }); + } +} +export default ChannelsUtils; diff --git a/cypress/utils/homePageUtils.js b/cypress/utils/homePageUtils.js new file mode 100644 index 000000000..27d298105 --- /dev/null +++ b/cypress/utils/homePageUtils.js @@ -0,0 +1,30 @@ +import HomePage from "../apiRequests/HomePage"; +class HomePageUtils { + homePage = new HomePage(); + getOrdersReadyToFulfill(channelSlug) { + return this.homePage + .getOrdersWithStatus("READY_TO_FULFILL", channelSlug) + .then(resp => resp.body.data.orders.totalCount); + } + getOrdersReadyForCapture(channelSlug) { + return this.homePage + .getOrdersWithStatus("READY_TO_CAPTURE", channelSlug) + .then(resp => resp.body.data.orders.totalCount); + } + getProductsOutOfStock(channelSlug) { + return this.homePage + .getProductsOutOfStock(channelSlug) + .then(resp => resp.body.data.products.totalCount); + } + getSalesAmount(channelSlug) { + return this.homePage + .getSalesForChannel(channelSlug, "TODAY") + .then(resp => resp.body.data.ordersTotal.gross.amount); + } + getTodaysOrders(channelSlug) { + return this.homePage + .getOrdersForChannel(channelSlug, "TODAY") + .then(resp => resp.body.data.orders.totalCount); + } +} +export default HomePageUtils;