saleor-dashboard/cypress/e2e/orders/orders.js
Paweł Chyła 55337b5998
Order details datagrid (#3325)
* Show available channels

* Add price  and updatedAt columns

* Fix sorting, only sort on selected columns

* Sort by channel

* Allow delete name and product type

* Fix show not product found

* Extract mssages

* Product datagrid custom column picker

* Column picker in data grid in dirty hack for bug

* fix storybook props

* Restore Datagrid defalt column picker with custom render

* Add sort by attributes

* Use datagrid loading cells

* Fix product searching

* Show attributes before last updated

* Readonly all fields in datagrid

* Fix creating new datagrid row

* Remove add new procut button from datagrid

* Show only active sorted column

* Temp fix for column filter

* Fix column mismatch

* Add comments and spred props to ColumnPicker

* Cleanup

* Update avatar size and styles

* On row click with hover on row styles

* Use new theme

* Change placeholder image

* Draw rounded image with border

* Readonly product datagrid

* Use new theme colors in datagrid

* Add vertical borders control to datagrid

* Add empty column to add padding

* Add coursor to datagrid

* Restore vertical borders, fix cursor pointer

* Add custom freezed column

* Initial tooltip for column

* Move tooltip to datagrid

* Adjust datagrid colors style, add possibility to select column

* Change datagrid selected cells colors

* Fix typo and extract messages

* Base order  datagrid

* Cleanup Datagrid component

* Cleanup and code refactor

* Remove cursor pointer props from readonlyCell

* Use money cell for total column

* Add custom cell renderers and fix types

* Simple tags implemenrtion for status and payment col

* Add colors from theme

* Make tagCell more dynamic

* Refactor Datagrid file structure

* Add loading indicators

* Selecting column without cells in readonly

* Add sort icons to orders list

* Refactor after CR. fix typos

* Change color of selected colum cell on hover

* Improve selected header text contrast

* Move useColumnPickerColumns to hooks dir with tests

* Add less padding to column picker button

* Remove double border top

* Fix cursor pointer for tagCell and moneyCell

* useGetCellContent hook

* On loading show only one row

* Add missing darkmod color for warning tag

* Refactor columns in datagrid

* Add new macaw theme provider to storybook

* Fix  passing props in datagrid

* Trigger deployment

* Fix column picker in products

* useDatagridColumns

* Fix one more time

* Add column picker with default columns

* Change color for selected header change to textBrandDefault

* Remove unused code, move attributes colums as last

* Cleanup useDatagridColumns

* Improve DatagridProps

* Static datagrid for products (#3144)

* Migrate top nav of product list page to new MacawUI (#3290)

* feat: migrate top nav of product page

* feat: add proper deprecation links

---------

Co-authored-by: Michał Droń <dron.official@yahoo.com>

* Datagrin on order details intial

* Adjust ExtraInfoLines

* Remove padding on datagrid card content

* Remove datagrid card paddding (#3310)

* Disable column icon when no rows in orders

* Datagrid row hover show only when readonly and row clickable

* Implement card view for product list (#3292)

* Add temporary view switcher

* Add basic product tile view

* Bump macaw-ui

* Add ellipsis

* Bump macaw-ui

* Add status dot & fix non-rectangular thumbnails

* Bump macaw-ui

* Add variable size placeholder icon

* Improve loader

* Fix top nav menu key error

* Add pagination

* Add unit tests

* Extract messages

* Extract status color to function

* CR Refactor

* Hold product view state in local storage (#3315)

* Remember view state for product list

* Use util status function for status dots

* Datagrin in orderDraftDetails

* Remove not used components

* Fix for empty column and hover in datagrid for product (#3324)

* Remove datagrid card paddding (#3310)

* Fix for empty column and hover in datagrid for product (#3324)

* Use themeValues from macaw (#3326)

* Upgrade macaw

* Use themeValues

* Use themeValues from macaw (#3326)

* Upgrade macaw

* Use themeValues

* Add empty column from datagrid, improve theme types

* Use theme type from typeof

* Use empty column and themeValues

* Filter empty column from default

* New product header (#3346)

* Extraxt messages

* Remve title left padding

* Fix switching view

* Add margin right to nav button

* Improve view switch

* Update switch view icons

* Add spacing to switch

* Add more space

* Add new filterbar to order list

* Code refactor and tests

* Refactor OrderDraftDetailsDatagrid

* Extract messages

* Refactor OrderDraftDetailsDatagrid

* Update alert messages

* Extract messages

* Write unit tests

* Improve switch component

* Overwrite Pill styles

* Common method to get status color for pills

* Local Pill component POC

* Add ThemeProvider to test wrapper

* Extract messages

* Refactor Pill

* Fix Pill path

* Fix tests mocks

* Remove scrollbar and border bottom

* Add custom border to to datagrid

* Fix borders

* Fix border bottom

* Refactor and cleanup

* Remove not needed selectionActions code

* Move logic code t misc

* Fix scrollbar and zindex datagrid borders

* Fix product tiles condition

* Use utils functions, remove not used code

* Refactor to hooks

* Loading prps instead of disabled

* use getStatusColor

* Move getMenuItems to separate function

* Fix loading props

* Use empty colum hook in OrderDetailsDatagrid

* Fix empty column when save column change

* Fix bottom line in layout overlap

* Show moneCell with discounted price

* Make quantity ediable in order draft datagrid

* Readonly datagrid cells

* Update onyl when column is quantity

* Fix message

* Keep first column in datagrid not removable

* Fix for not existing column

* Add loader over datagrid, fix problem with border top when empty text in variants

* Fix error color and change color in datagrid

* Use formatMoneyAmount

* Fix remove order draft product with discount

* Extract messages

* Add product sku to order draft details datagrid

* Fix loading state and change cell color

* Add MoneyDiscuntedCell

* Use MoneyDiscuntedCell in order draft details datagrid

* Add trash bin icon

* Restor discount modal for order draft summary

* Fix problem with deleting quantity

* Improve await for promises and handler zero quantity error

* Fix column order issue

* Add discount modal box shadow

* Allow decimal as percentage value for discount

* Fix max fixed value

* Remove double border

* Fix z-index issue on discount modal

* Remove padding on order details datagrid

* Add proper error message to common discount modal

* Fix is submit disabled

* Move status as last column in datagrid

* Add padding to money discount cell editor

* Make quantity column smaller

* Fix recalculating disount value

* Fix calculate change discount type

* Store calculated value without triming decimal, trim decimal in input

* Refactor money cells

* markCellsDirty rename to areCellsDirty

* Remove discount from MoneyCell

* Use const to store row height in discount editor

* Fix copy in discount modal

* Remove past on money discount cell

* Remove locale in product varaints

* Fix nullable sku

* Extract messages

* Fix keeping always first column

* Remove padding on tracking info

* Fix story

* Fix render 0 money amount

* Fix displaying not empty string money

* adding new tests: add new product, change quantity, add inline discount, delete product for grid - on orders details view (#3652)

* adding new e2e for grid on orders details view

* merging conflicts fix - and adding new TC numbers to new tests

* trigger tests

* failing tests fixes

---------

Co-authored-by: Michał Droń <dron.official@yahoo.com>
Co-authored-by: Krzysztof Żuraw <9116238+krzysztofzuraw@users.noreply.github.com>
Co-authored-by: Michał Droń <droniu@droniu.dev>
Co-authored-by: wojteknowacki <124166231+wojteknowacki@users.noreply.github.com>
Co-authored-by: wojteknowacki <wojciech.nowacki@saleor.io>
2023-05-18 09:52:13 +02:00

338 lines
9.9 KiB
JavaScript

/// <reference types="cypress"/>
/// <reference types="../../support"/>
import faker from "faker";
import {
BUTTON_SELECTORS,
ORDER_GRANT_REFUND,
ORDERS_SELECTORS,
SHARED_ELEMENTS,
} from "../../elements/";
import { MESSAGES } from "../../fixtures";
import { urlList } from "../../fixtures/urlList";
import { ONE_PERMISSION_USERS } from "../../fixtures/users";
import {
createCustomer,
deleteCustomersStartsWith,
} from "../../support/api/requests/Customer";
import {
getOrder,
updateOrdersSettings,
} from "../../support/api/requests/Order";
import { getDefaultChannel } from "../../support/api/utils/channelsUtils";
import {
createFulfilledOrder,
createOrder,
createReadyToFulfillOrder,
createUnconfirmedOrder,
} from "../../support/api/utils/ordersUtils";
import * as productsUtils from "../../support/api/utils/products/productsUtils";
import {
createShipping,
deleteShippingStartsWith,
} from "../../support/api/utils/shippingUtils";
import {
getDefaultTaxClass,
updateTaxConfigurationForChannel,
} from "../../support/api/utils/taxesUtils";
import { selectChannelInPicker } from "../../support/pages/channelsPage";
import { finalizeDraftOrder } from "../../support/pages/draftOrderPage";
import {
addNewProductToOrder,
applyFixedLineDiscountForProduct,
changeQuantityOfProducts,
deleteProductFromGridTableOnIndex,
} from "../../support/pages/ordersOperations";
describe("Orders", () => {
const startsWith = "CyOrders-";
const randomName = startsWith + faker.datatype.number();
let customer;
let defaultChannel;
let warehouse;
let shippingMethod;
let variantsList;
let address;
let taxClass;
const shippingPrice = 2;
const variantPrice = 1;
before(() => {
cy.clearSessionData().loginUserViaRequest();
deleteCustomersStartsWith(startsWith);
deleteShippingStartsWith(startsWith);
productsUtils.deleteProductsStartsWith(startsWith);
updateOrdersSettings();
getDefaultChannel()
.then(channel => {
defaultChannel = channel;
updateTaxConfigurationForChannel({ channelSlug: defaultChannel.slug });
getDefaultTaxClass();
})
.then(resp => {
taxClass = resp;
cy.fixture("addresses");
})
.then(addresses => {
address = addresses.plAddress;
createCustomer(`${randomName}@example.com`, randomName, address, true);
})
.then(customerResp => {
customer = customerResp.user;
createShipping({
channelId: defaultChannel.id,
name: randomName,
price: shippingPrice,
address,
taxClassId: taxClass.id,
});
})
.then(
({ warehouse: warehouseResp, shippingMethod: shippingMethodResp }) => {
shippingMethod = shippingMethodResp;
warehouse = warehouseResp;
productsUtils.createTypeAttributeAndCategoryForProduct({
name: randomName,
});
},
)
.then(
({
productType: productTypeResp,
attribute: attributeResp,
category: categoryResp,
}) => {
productsUtils.createProductInChannel({
name: randomName,
channelId: defaultChannel.id,
price: variantPrice,
warehouseId: warehouse.id,
productTypeId: productTypeResp.id,
attributeId: attributeResp.id,
categoryId: categoryResp.id,
taxClassId: taxClass.id,
});
},
)
.then(({ variantsList: variantsResp }) => {
variantsList = variantsResp;
cy.checkIfDataAreNotNull({
customer,
defaultChannel,
warehouse,
shippingMethod,
variantsList,
address,
});
});
});
beforeEach(() => {
cy.clearSessionData().loginUserViaRequest(
"auth",
ONE_PERMISSION_USERS.order,
);
});
it(
"should create order with selected channel. TC: SALEOR_2104",
{ tags: ["@orders", "@allEnv", "@stable", "@oldRelease"] },
() => {
cy.visit(urlList.orders).get(ORDERS_SELECTORS.createOrderButton).click();
selectChannelInPicker(defaultChannel.name);
finalizeDraftOrder(randomName, address);
},
);
it(
"should not be possible to change channel in order. TC: SALEOR_2105",
{ tags: ["@orders", "@allEnv", "@stable", "@oldRelease"] },
() => {
createOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
}).then(order => {
cy.visit(urlList.orders + `${order.id}`);
cy.get(ORDERS_SELECTORS.salesChannel)
.find("[button]")
.should("not.exist");
});
},
);
it(
"should cancel fulfillment. TC: SALEOR_2106",
{ tags: ["@orders", "@allEnv", "@stable", "@oldRelease"] },
() => {
let order;
createFulfilledOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
warehouse: warehouse.id,
})
.then(({ order: orderResp }) => {
order = orderResp;
cy.visit(urlList.orders + `${order.id}`);
cy.get(SHARED_ELEMENTS.skeleton)
.should("not.exist")
.get(ORDERS_SELECTORS.cancelFulfillment)
.click()
.get(ORDERS_SELECTORS.cancelFulfillmentSelectField)
.click()
.get(BUTTON_SELECTORS.selectOption)
.first()
.click()
.addAliasToGraphRequest("OrderFulfillmentCancel")
.get(BUTTON_SELECTORS.submit)
.click()
.waitForRequestAndCheckIfNoErrors("@OrderFulfillmentCancel");
getOrder(order.id);
})
.then(orderResp => {
expect(orderResp.status).to.be.eq("UNFULFILLED");
});
},
);
it(
"should make a refund. TC: 2107",
{ tags: ["@orders", "@allEnv", "@stable", "@oldRelease"] },
() => {
let order;
createReadyToFulfillOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
})
.then(({ order: orderResp }) => {
order = orderResp;
cy.visit(urlList.orders + `${order.id}`);
cy.get(ORDERS_SELECTORS.refundButton)
.click()
.get(ORDER_GRANT_REFUND.productsQuantityInput)
.type("1")
.addAliasToGraphRequest("OrderFulfillmentRefundProducts");
cy.get(BUTTON_SELECTORS.submit)
.click()
.waitForRequestAndCheckIfNoErrors(
"@OrderFulfillmentRefundProducts",
);
getOrder(order.id);
})
.then(orderResp => {
expect(orderResp.paymentStatus).to.be.eq("PARTIALLY_REFUNDED");
});
},
);
it(
"should add line item discount (for single product in order) . TC: SALEOR_2125",
{ tags: ["@orders", "@allEnv", "@stable"] },
() => {
const totalPrice = variantPrice + shippingPrice;
const inlineDiscount = 0.5;
const discountReason = "product damaged";
createUnconfirmedOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
}).then(unconfirmedOrderResponse => {
cy.visit(urlList.orders + `${unconfirmedOrderResponse.order.id}`);
applyFixedLineDiscountForProduct(inlineDiscount, discountReason);
cy.get(ORDERS_SELECTORS.priceCellFirstRowOrderDetails).should(
"have.text",
inlineDiscount,
);
cy.get(ORDERS_SELECTORS.orderSummarySubtotalPriceRow).should(
"contain.text",
variantPrice - inlineDiscount,
);
cy.get(ORDERS_SELECTORS.orderSummaryTotalPriceRow).should(
"contain.text",
totalPrice - inlineDiscount,
);
});
},
);
it(
"should remove product from unconfirmed order . TC: SALEOR_2126",
{ tags: ["@orders", "@allEnv", "@stable"] },
() => {
createUnconfirmedOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
}).then(unconfirmedOrderResponse => {
cy.visit(urlList.orders + `${unconfirmedOrderResponse.order.id}`);
deleteProductFromGridTableOnIndex(0);
cy.contains(MESSAGES.noProductFound).should("be.visible");
cy.get(ORDERS_SELECTORS.productDeleteFromRowButton).should("not.exist");
});
},
);
it(
"should change quantity of products on order detail view . TC: SALEOR_2127",
{ tags: ["@orders", "@allEnv", "@stable"] },
() => {
createUnconfirmedOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
}).then(unconfirmedOrderResponse => {
cy.visit(urlList.orders + `${unconfirmedOrderResponse.order.id}`);
changeQuantityOfProducts();
cy.get(ORDERS_SELECTORS.orderSummarySubtotalPriceRow).should(
"contain.text",
variantPrice * 2,
);
cy.get(ORDERS_SELECTORS.orderSummaryTotalPriceRow).should(
"contain.text",
shippingPrice + variantPrice * 2,
);
});
},
);
it(
"should add new product on order detail view . TC: SALEOR_2128",
{ tags: ["@orders", "@allEnv", "@stable"] },
() => {
createUnconfirmedOrder({
customerId: customer.id,
channelId: defaultChannel.id,
shippingMethod,
variantsList,
address,
}).then(unconfirmedOrderResponse => {
cy.visit(urlList.orders + `${unconfirmedOrderResponse.order.id}`);
cy.get(ORDERS_SELECTORS.dataGridTable).should("be.visible");
addNewProductToOrder().then(productName => {
cy.get(ORDERS_SELECTORS.productNameSecondRowOrderDetails).should(
"contain.text",
productName,
);
});
});
},
);
});