-
Notifications
You must be signed in to change notification settings - Fork 121
[UI Test] - Add validation on new product screen and new add product tests #8407
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
You can test the changes from this Pull Request by:
|
pachlava
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wow, that's a lot of new tests, @jostnes 👍
I left some comments, but they are nitpicks, nothing really serious. I'm approving the PR as is, and you can adjust it as you like.
Thank you 🙇
| let productTypeLabel = NSPredicate(format: "label CONTAINS[c] %@", productType) | ||
| app.staticTexts.containing(productTypeLabel).firstMatch.tap() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just thinking aloud: the buttons for product type selection have no identifiers (as of now), so identifiers can't be used (which would be justified, since this non-asserting function can potentially be used in tests for localizations). So, we can go for exact text values (as you did before). Is there a reason for less strict locator (only part of a string / case-insensitive) that you're using now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah i actually tried to add identifiers for the cells but it looks like it will take more effort than i anticipated so i dropped that for now.
so the reason is that i wanted to be able to reuse it in the test like this:
...
.selectProductType(productType: productType)
.verifyProductTypeScreenLoaded(productType: productType)
...
the test wants the product type in both, using simple physical product as an example, in select product the text for that is Simple physical product and in add product screen it's Physical, the common denominator in both is the word physical (case-insensitive) so i decided to go with that. it fits the needs of the test case while still keeping it reusable and clear.
| let priceLabel = NSPredicate(format: "label CONTAINS[c] %@", "price") | ||
| let inventoryLabel = NSPredicate(format: "label CONTAINS[c] %@", "inventory") | ||
| let productTypeLabel = NSPredicate(format: "label CONTAINS[c] %@", productType) | ||
| let addVariationLabel = NSPredicate(format: "label CONTAINS[c] %@", "add variations") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since this is an asserting function, I think it would benefit from more strict matching (this is a tested code):
| let priceLabel = NSPredicate(format: "label CONTAINS[c] %@", "price") | |
| let inventoryLabel = NSPredicate(format: "label CONTAINS[c] %@", "inventory") | |
| let productTypeLabel = NSPredicate(format: "label CONTAINS[c] %@", productType) | |
| let addVariationLabel = NSPredicate(format: "label CONTAINS[c] %@", "add variations") | |
| let priceLabel = NSPredicate(format: "label == 'Add Price'") | |
| let inventoryLabel = NSPredicate(format: "label == 'Inventory'") | |
| let productTypeLabel = NSPredicate(format: "label ==[c] '\(productType)'") | |
| let addVariationLabel = NSPredicate(format: "label == 'Add variations'") |
Also, it would be easier to understand what exactly is missing, if an assertion fails.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated in c9a64bc
|
|
||
| // different product types displays different fields on add product screen | ||
| // this is to validate that the correct screens are displayed | ||
| switch productType { | ||
| case "physical", "virtual": | ||
| XCTAssertTrue(app.staticTexts.containing(priceLabel).firstMatch.exists) | ||
| XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists) | ||
| case "variable": | ||
| XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists) | ||
| XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
inventoryLabel is present for both cases, so it can be moved to common?
| // different product types displays different fields on add product screen | |
| // this is to validate that the correct screens are displayed | |
| switch productType { | |
| case "physical", "virtual": | |
| XCTAssertTrue(app.staticTexts.containing(priceLabel).firstMatch.exists) | |
| XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists) | |
| case "variable": | |
| XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists) | |
| XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists) | |
| XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists) | |
| // different product types displays different fields on add product screen | |
| // this is to validate that the correct screens are displayed | |
| switch productType { | |
| case "physical", "virtual": | |
| XCTAssertTrue(app.staticTexts.containing(priceLabel).firstMatch.exists) | |
| case "variable": | |
| XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ah ok, this was written with the future in mind, the next product type (grouped) we introduce, inventoryLabel will no longer be a common field so i'll leave it as is for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! This is what I thought about, just wanted to be sure 🙂
| } | ||
|
|
||
| public func verifyProductTypeScreenLoaded(productType: String) throws -> Self { | ||
| let priceLabel = NSPredicate(format: "label CONTAINS[c] %@", "price") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
WDYT of renaming priceLabel to addPriceLabel, as done for addVariationLabel?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated in c9a64bc
| XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists) | ||
| XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists) | ||
| default: | ||
| // fail test if product type doesn't exist |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the line below this comment has a good descriptive error message, so it's not necessary:
| // fail test if product type doesn't exist |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed in c9a64bc
| func test_add_simple_virtual_product() throws { | ||
| try ProductFlow.addAndVerifyNewProduct(productType: "virtual") | ||
| } | ||
|
|
||
| func test_add_variable_product() throws { | ||
| try ProductFlow.addAndVerifyNewProduct(productType: "variable") | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
➕ for extracting the repetitive part to a flow. Nice 👍
Generated by 🚫 dangerJS |
Description
This PR adds a new validation (
verifyProductTypeScreenLoaded()) for the add product test to validate that the correct product screen is displayed. This also adds 2 new add product (virtual and variable) UI tests.Testing instructions
Tests should pass in CI and locally. The tests should also fail when the expected fields are not displayed on screen.
RELEASE-NOTES.txtif necessary.