Saleor 7780 fix for collection tests (#2227)

* fix fox tests in collection

* removing then() in tests

* fixing failing collection tests and add stable tag to run will all tests
This commit is contained in:
Ewa Czerniak 2022-08-16 13:27:37 +02:00 committed by GitHub
parent 2c57de07e4
commit 29c7f785c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 370 additions and 354 deletions

View file

@ -8,6 +8,7 @@ import { BUTTON_SELECTORS } from "../../elements/shared/button-selectors";
import { collectionDetailsUrl, urlList } from "../../fixtures/urlList";
import { createChannel } from "../../support/api/requests/Channels";
import {
addChannelToCollection,
addProductToCollection,
createCollection as createCollectionRequest,
} from "../../support/api/requests/Collections";
@ -19,12 +20,6 @@ import { deleteCollectionsStartsWith } from "../../support/api/utils/catalog/col
import * as channelsUtils from "../../support/api/utils/channelsUtils";
import * as productsUtils from "../../support/api/utils/products/productsUtils";
import { deleteShippingStartsWith } from "../../support/api/utils/shippingUtils";
import {
isCollectionVisible,
isProductInCollectionVisible,
} from "../../support/api/utils/storeFront/collectionsUtils";
import { isProductVisibleInSearchResult } from "../../support/api/utils/storeFront/storeFrontProductUtils";
import filterTests from "../../support/filterTests";
import {
assignProductsToCollection,
createCollection,
@ -32,368 +27,366 @@ import {
updateCollection,
} from "../../support/pages/catalog/collectionsPage";
filterTests({ definedTags: ["all"] }, () => {
describe("As an admin I want to manage collections.", () => {
const startsWith = "CyCollections-";
const name = `${startsWith}${faker.datatype.number()}`;
describe("As an admin I want to manage collections.", () => {
const startsWith = "CyCollections-";
const productName = `${startsWith}${faker.datatype.number()}`;
let attribute;
let productType;
let category;
let product;
let attribute;
let productType;
let category;
let product;
let defaultChannel;
let defaultChannel;
before(() => {
cy.clearSessionData().loginUserViaRequest();
productsUtils.deleteProductsStartsWith(startsWith);
deleteCollectionsStartsWith(startsWith);
deleteShippingStartsWith(startsWith);
channelsUtils.deleteChannelsStartsWith(startsWith);
before(() => {
cy.clearSessionData().loginUserViaRequest();
productsUtils.deleteProductsStartsWith(startsWith);
deleteCollectionsStartsWith(startsWith);
deleteShippingStartsWith(startsWith);
channelsUtils.deleteChannelsStartsWith(startsWith);
channelsUtils
.getDefaultChannel()
.then(channel => {
defaultChannel = channel;
productsUtils.createTypeAttributeAndCategoryForProduct({
name: productName,
});
})
.then(
({
attribute: attributeResp,
productType: productTypeResp,
category: categoryResp,
}) => {
attribute = attributeResp;
productType = productTypeResp;
category = categoryResp;
productsUtils.createProductInChannel({
name: productName,
channelId: defaultChannel.id,
productTypeId: productType.id,
attributeId: attribute.id,
categoryId: category.id,
});
},
)
.then(({ product: productResp }) => (product = productResp));
});
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,
});
beforeEach(() => {
cy.clearSessionData().loginUserViaRequest();
});
it(
"should create hidden collection. TC: SALEOR_0301",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
cy.visit(urlList.collections).expectSkeletonIsVisible();
createCollection(collectionName, false, defaultChannel).then(
collectionResp => {
collection = collectionResp;
assignProductsToCollection(productName);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.its("collection.channelListings.0.isPublished")
.should("eq", false);
},
);
},
);
it(
"should create published collection. TC: SALEOR_0302",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
cy.visit(urlList.collections).expectSkeletonIsVisible();
createCollection(collectionName, true, defaultChannel).then(
collectionResp => {
collection = collectionResp;
assignProductsToCollection(productName);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.its("collection.channelListings.0.isPublished")
.should("eq", true);
},
);
},
);
it(
"should create collection not available for channel. TC: SALEOR_0303",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
let channel;
createChannel({ name: collectionName }).then(channelResp => {
channel = channelResp;
updateChannelInProduct(product.id, channel.id);
cy.visit(urlList.collections).expectSkeletonIsVisible();
createCollection(collectionName, false, channel).then(
collectionResp => {
collection = collectionResp;
assignProductsToCollection(productName);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.its("collection")
.should("be.null");
},
)
.then(({ product: productResp }) => (product = productResp));
});
);
});
},
);
beforeEach(() => {
cy.clearSessionData().loginUserViaRequest();
});
it(
"should create published collection with products hidden in listings. TC: SALEOR_0304",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
// Products "hidden in listings" are not displayed in Category listings or search results,
// but are listed on Collections
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
let createdProduct;
xit(
"should create hidden collection. TC: SALEOR_0301",
{ tags: ["@collection", "@allEnv"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
productsUtils
.createProductInChannel({
name: collectionName,
channelId: defaultChannel.id,
productTypeId: productType.id,
attributeId: attribute.id,
categoryId: category.id,
visibleInListings: false,
})
.then(({ product: productResp }) => (createdProduct = productResp));
cy.visit(urlList.collections);
cy.expectSkeletonIsVisible();
cy.visit(urlList.collections).expectSkeletonIsVisible();
createCollection(collectionName, true, defaultChannel).then(
collectionResp => {
collection = collectionResp;
createCollection(collectionName, false, defaultChannel)
.then(collectionResp => {
collection = collectionResp;
assignProductsToCollection(name);
assignProductsToCollection(collectionName);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.then(() => {
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
});
})
.then(({ collection: resp }) => {
const isVisible = isCollectionVisible(resp, collection.id);
expect(isVisible).to.equal(false);
});
},
);
.its("collection.products.edges.0.node.id")
.should("eq", createdProduct.id);
searchInShop(createdProduct.name)
.its("body.data.products.edges")
.should("be.empty");
},
);
},
);
it(
"should create published collection. TC: SALEOR_0302",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
it(
"should delete collection. TC: SALEOR_0305",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
cy.visit(urlList.collections);
cy.expectSkeletonIsVisible();
createCollectionRequest(collectionName).then(collectionResp => {
cy.visit(collectionDetailsUrl(collectionResp.id))
.get(BUTTON_SELECTORS.deleteButton)
.click()
.addAliasToGraphRequest("RemoveCollection")
.get(BUTTON_SELECTORS.submit)
.click()
.waitForRequestAndCheckIfNoErrors("@RemoveCollection");
getCollection({ collectionId: collectionResp.id })
.its("collection")
.should("be.null");
});
},
);
createCollection(collectionName, true, defaultChannel)
.then(collectionResp => {
collection = collectionResp;
assignProductsToCollection(name);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
});
})
.then(({ collection: resp }) => {
const isVisible = isCollectionVisible(resp, collection.id);
expect(isVisible).to.equal(true);
});
},
);
it(
"should update collection. TC: SALEOR_0306",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
const updatedName = `${startsWith}updatedCollection`;
it(
"create collection not available for channel. TC: SALEOR_0303",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
let channel;
let collection;
createChannel({ name: collectionName })
.then(channelResp => {
channel = channelResp;
updateChannelInProduct(product.id, channel.id);
})
.then(() => {
cy.visit(urlList.collections);
cy.expectSkeletonIsVisible();
createCollection(collectionName, true, channel);
})
.then(collectionResp => {
collection = collectionResp;
assignProductsToCollection(name);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
});
})
.then(({ collection: resp }) => {
const isVisible = isCollectionVisible(resp, collection.id);
expect(isVisible).to.equal(false);
});
},
);
createCollectionRequest(collectionName).then(collectionResp => {
collection = collectionResp;
it(
"create published collection with products hidden in listings. TC: SALEOR_0304",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
// Products "hidden in listings" are not displayed in Category listings or search results,
// but are listed on Collections
const collectionName = `${startsWith}${faker.datatype.number()}`;
let collection;
let createdProduct;
cy.visitAndWaitForProgressBarToDisappear(
collectionDetailsUrl(collection.id),
);
addChannelToCollection({
collectionId: collection.id,
channelId: defaultChannel.id,
});
updateCollection({ name: updatedName, description: updatedName });
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.its("collection")
.should("include", { name: updatedName })
.its("description")
.should("have.string", `{"text": "${updatedName}"}`);
});
},
);
it(
"should assign product to collection. TC: SALEOR_0307",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `Assign-${startsWith}${faker.datatype.number()}`;
const productName = `Product-To-Assign-${startsWith}${faker.datatype.number()}`;
let collection;
let productToAssign;
createCollectionRequest(collectionName).then(collectionResp => {
collection = collectionResp;
addChannelToCollection({
collectionId: collection.id,
channelId: defaultChannel.id,
});
productsUtils
.createProductInChannel({
name: collectionName,
name: productName,
channelId: defaultChannel.id,
productTypeId: productType.id,
attributeId: attribute.id,
categoryId: category.id,
visibleInListings: false,
})
.then(({ product: productResp }) => (createdProduct = productResp));
cy.visit(urlList.collections);
cy.expectSkeletonIsVisible();
createCollection(collectionName, true, defaultChannel)
.then(collectionResp => {
collection = collectionResp;
assignProductsToCollection(collectionName);
})
.then(() => {
.then(({ product: productResp }) => {
productToAssign = productResp;
cy.visitAndWaitForProgressBarToDisappear(
collectionDetailsUrl(collection.id),
);
cy.reload();
assignProductsToCollection(productToAssign.name);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
});
})
.then(({ collection: 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);
})
.its("collection.products.edges.0.node.id")
.should("include", productToAssign.id);
});
},
);
});
},
);
it(
"should delete collection. TC: SALEOR_0305",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
it(
"should remove product from collection. TC: SALEOR_0308",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const collectionName = `Remove-With-Assigned-Product-${startsWith}${faker.datatype.number()}`;
const productName = `Product-To-Assign-${startsWith}${faker.datatype.number()}`;
let collection;
let productToAssign;
createCollectionRequest(collectionName).then(collectionResp => {
cy.visit(collectionDetailsUrl(collectionResp.id))
.get(BUTTON_SELECTORS.deleteButton)
.click()
.addAliasToGraphRequest("RemoveCollection")
.get(BUTTON_SELECTORS.submit)
.click()
.waitForRequestAndCheckIfNoErrors("@RemoveCollection");
getCollection({ collectionId: collectionResp.id, auth: "auth" })
.its("collection")
.should("be.null");
createCollectionRequest(collectionName).then(collectionResp => {
collection = collectionResp;
addChannelToCollection({
collectionId: collection.id,
channelId: defaultChannel.id,
});
},
);
productsUtils
.createProductInChannel({
name: productName,
channelId: defaultChannel.id,
productTypeId: productType.id,
attributeId: attribute.id,
categoryId: category.id,
visibleInListings: false,
})
.then(({ product: productResp }) => {
productToAssign = productResp;
it(
"delete several collections on collections list page. TC: SALEOR_0309",
{ tags: ["@collection", "@allEnv"] },
() => {
const deleteSeveral = "delete-several-";
const firstCollectionName = `${deleteSeveral}${startsWith}${faker.datatype.number()}`;
const secondCollectionName = `${deleteSeveral}${startsWith}${faker.datatype.number()}`;
let firstCollection;
let secondCollection;
createCollectionRequest(firstCollectionName).then(collectionResp => {
firstCollection = collectionResp;
});
createCollectionRequest(secondCollectionName).then(collectionResp => {
secondCollection = collectionResp;
cy.visit(urlList.collections)
.searchInTable(deleteSeveral)
.get(collectionRow(firstCollection.id))
.find(BUTTON_SELECTORS.checkbox)
.click()
.get(collectionRow(secondCollection.id))
.find(BUTTON_SELECTORS.checkbox)
.click()
.get(BUTTON_SELECTORS.deleteIcon)
.click()
.addAliasToGraphRequest("CollectionBulkDelete")
.get(BUTTON_SELECTORS.submit)
.click()
.waitForRequestAndCheckIfNoErrors("@CollectionBulkDelete");
getCollection({ collectionId: firstCollection.id, auth: "auth" })
.its("collection")
.should("be.null");
getCollection({ collectionId: secondCollection.id, auth: "auth" })
.its("collection")
.should("be.null");
});
},
);
xit(
"should assign product to collection. TC: SALEOR_0307",
{ tags: ["@collection", "@allEnv"] },
() => {
const collectionName = `Assign-${startsWith}${faker.datatype.number()}`;
const productName = `Product-To-Assign-${startsWith}${faker.datatype.number()}`;
let collection;
let productToAssign;
createCollectionRequest(collectionName).then(collectionResp => {
collection = collectionResp;
productsUtils
.createProductInChannel({
name: productName,
channelId: defaultChannel.id,
productTypeId: productType.id,
attributeId: attribute.id,
categoryId: category.id,
visibleInListings: false,
})
.then(({ product: productResp }) => {
productToAssign = productResp;
cy.visit(collectionDetailsUrl(collection.id));
assignProductsToCollection(productToAssign.name);
getCollection({ collectionId: collection.id, auth: "auth" })
.its("collection.products.edges")
.should("have.length", 1)
.then(productArray => {
expect(productArray[0].node.id).to.equal(productToAssign.id);
});
addProductToCollection({
collectionId: collection.id,
productId: productToAssign.id,
});
});
},
);
it(
"remove product from collection. TC: SALEOR_0308",
{ tags: ["@collection", "@allEnv"] },
() => {
const collectionName = `Remove-With-Assigned-Product-${startsWith}${faker.datatype.number()}`;
const productName = `Product-To-Assign-${startsWith}${faker.datatype.number()}`;
let collection;
let productToAssign;
createCollectionRequest(collectionName).then(collectionResp => {
collection = collectionResp;
productsUtils
.createProductInChannel({
name: productName,
channelId: defaultChannel.id,
productTypeId: productType.id,
attributeId: attribute.id,
categoryId: category.id,
visibleInListings: false,
})
.then(({ product: productResp }) => {
productToAssign = productResp;
addProductToCollection({
collectionId: collection.id,
productId: productToAssign.id,
});
cy.visit(collectionDetailsUrl(collection.id));
getProductDetails(productToAssign.id, defaultChannel.slug, "auth")
.its("body.data.product.collections")
.should("have.length", 1);
getCollection({ collectionId: collection.id, auth: "auth" })
.its("collection.products.edges")
.should("have.length", 1);
removeProductsFromCollection(productToAssign.name);
getCollection({ collectionId: collection.id, auth: "auth" })
.its("collection.products.edges")
.should("be.empty");
});
});
},
);
it(
"should update collection. TC: SALEOR_0306",
{ tags: ["@collection", "@allEnv"] },
() => {
const collectionName = `${startsWith}${faker.datatype.number()}`;
const updatedName = `${startsWith}updatedCollection`;
createCollectionRequest(collectionName)
.then(collectionResp => {
cy.visitAndWaitForProgressBarToDisappear(
collectionDetailsUrl(collectionResp.id),
collectionDetailsUrl(collection.id),
);
updateCollection({ name: updatedName, description: updatedName });
getCollection({ collectionId: collectionResp.id, auth: "auth" });
})
.then(({ collection: collectionResp }) => {
expect(collectionResp.name).to.eq(updatedName);
const descriptionJson = JSON.parse(collectionResp.description);
const descriptionText = descriptionJson.blocks[0].data.text;
expect(descriptionText).to.eq(updatedName);
getProductDetails(productToAssign.id, defaultChannel.slug)
.its("body.data.product.collections")
.should("have.length", 1);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.its("collection.products.edges")
.should("have.length", 1);
removeProductsFromCollection(productToAssign.name);
getCollection({
collectionId: collection.id,
channelSlug: defaultChannel.slug,
})
.its("collection.products.edges")
.should("be.empty");
});
},
);
});
});
},
);
it(
"delete several collections on collections list page. TC: SALEOR_0309",
{ tags: ["@collection", "@allEnv", "@stable"] },
() => {
const deleteSeveral = "delete-several-";
const firstCollectionName = `${deleteSeveral}${startsWith}${faker.datatype.number()}`;
const secondCollectionName = `${deleteSeveral}${startsWith}${faker.datatype.number()}`;
let firstCollection;
let secondCollection;
createCollectionRequest(firstCollectionName).then(collectionResp => {
firstCollection = collectionResp;
});
createCollectionRequest(secondCollectionName).then(collectionResp => {
secondCollection = collectionResp;
cy.visit(urlList.collections)
.searchInTable(deleteSeveral)
.get(collectionRow(firstCollection.id))
.find(BUTTON_SELECTORS.checkbox)
.click()
.get(collectionRow(secondCollection.id))
.find(BUTTON_SELECTORS.checkbox)
.click()
.get(BUTTON_SELECTORS.deleteIcon)
.click()
.addAliasToGraphRequest("CollectionBulkDelete")
.get(BUTTON_SELECTORS.submit)
.click()
.waitForRequestAndCheckIfNoErrors("@CollectionBulkDelete");
getCollection({ collectionId: firstCollection.id })
.its("collection")
.should("be.null");
getCollection({ collectionId: secondCollection.id })
.its("collection")
.should("be.null");
});
},
);
});

View file

@ -61,6 +61,17 @@ export function addProductToCollection({ collectionId, productId }) {
collectionId: "${collectionId}"
products: ["${productId}"]
) {
collection{
products(first:100){
totalCount
edges{
node{
id
name
}
}
}
}
errors {
message
}
@ -68,3 +79,26 @@ export function addProductToCollection({ collectionId, productId }) {
}`;
return cy.sendRequestWithQuery(mutation);
}
export function addChannelToCollection({
collectionId,
channelId,
isPublished = true,
}) {
const mutation = `mutation collectionChannelListingUpdate {
collectionChannelListingUpdate(
id: "${collectionId}",
input: {
addChannels: {
channelId: "${channelId}"
isPublished: ${isPublished}
}
}) {
errors {
field
message
}
}
}`;
return cy.sendRequestWithQuery(mutation);
}

View file

@ -1,16 +1,13 @@
import { getValueWithDefault } from "../utils/Utils";
export function getCollection({ collectionId, channelSlug, auth = "token" }) {
const channelLine = getValueWithDefault(
channelSlug,
`channel: "${channelSlug}"`
);
export function getCollection({ collectionId, channelSlug, auth }) {
const query = `query Collection{
collection(id: "${collectionId}" ${channelLine}) {
collection(id: "${collectionId}" channel: "${channelSlug}") {
id
slug
name
description
channelListings{
isPublished
}
products(first:100){
totalCount
edges{

View file

@ -3,7 +3,7 @@ import { getValueWithDefault } from "../utils/Utils";
export function getProductDetails(productId, channelSlug, auth = "token") {
const privateMetadataLine = getValueWithDefault(
auth === "auth",
`privateMetadata{key value}`
`privateMetadata{key value}`,
);
const query = `fragment BasicProductFields on Product {
@ -80,14 +80,14 @@ export function getProductMetadata({
productId,
channelSlug,
auth,
withPrivateMetadata
withPrivateMetadata,
}) {
const privateMetadata = getValueWithDefault(
withPrivateMetadata,
`privateMetadata{
key
value
}`
}`,
);
const query = `query{

View file

@ -1,9 +0,0 @@
export const isCollectionVisible = (collection, collectionId) =>
collection !== null && collection.id === collectionId;
export const isProductInCollectionVisible = (collection, productId) => {
const productsList = collection.products;
return (
productsList.totalCount !== 0 && productsList.edges[0].node.id === productId
);
};

View file

@ -50,7 +50,8 @@ export function updateCollection({ name, description }) {
}
export function assignProductsToCollection(productName) {
cy.get(COLLECTION_SELECTORS.addProductButton)
cy.waitForProgressBarToNotBeVisible()
.get(COLLECTION_SELECTORS.addProductButton)
.click()
.addAliasToGraphRequest("SearchProducts")
.get(ASSIGN_ELEMENTS_SELECTORS.searchInput)