-
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
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -46,4 +46,30 @@ public final class SingleProductScreen: ScreenObject { | |||||||||||||||||||||||||||||||||||||||
| XCTAssertTrue(app.staticTexts["TIP"].exists) | ||||||||||||||||||||||||||||||||||||||||
| XCTAssertTrue(app.textViews[productName].exists) | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| public func verifyProductTypeScreenLoaded(productType: String) throws -> Self { | ||||||||||||||||||||||||||||||||||||||||
| 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 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
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 🙂
Outdated
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| import UITestsFoundation | ||
| import XCTest | ||
|
|
||
| class ProductFlow { | ||
|
|
||
| static func addAndVerifyNewProduct(productType: String) throws { | ||
| let product = try GetMocks.readNewProductData() | ||
|
|
||
| try TabNavComponent().goToProductsScreen() | ||
| .tapAddProduct() | ||
| .selectProductType(productType: productType) | ||
| .verifyProductTypeScreenLoaded(productType: productType) | ||
| .addProductTitle(productTitle: product.name) | ||
| .publishProduct() | ||
| .verifyNewProductScreenLoaded(productName: product.name) | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,14 +3,6 @@ import XCTest | |
|
|
||
| final class ProductsTests: XCTestCase { | ||
|
|
||
| let productTypes = [ | ||
| "physical": "Simple physical product", | ||
| "virtual": "Simple virtual product", | ||
| "variable": "Variable product", | ||
| "grouped": "Grouped product", | ||
| "external": "External product" | ||
| ] | ||
|
|
||
| override func setUpWithError() throws { | ||
| continueAfterFailure = false | ||
|
|
||
|
|
@@ -33,13 +25,14 @@ final class ProductsTests: XCTestCase { | |
| } | ||
|
|
||
| func test_add_simple_physical_product() throws { | ||
| let product = try GetMocks.readNewProductData() | ||
| try ProductFlow.addAndVerifyNewProduct(productType: "physical") | ||
| } | ||
|
|
||
| try TabNavComponent().goToProductsScreen() | ||
| .tapAddProduct() | ||
| .selectProductType(productType: productTypes["physical"]!) | ||
| .addProductTitle(productTitle: product.name) | ||
| .publishProduct() | ||
| .verifyNewProductScreenLoaded(productName: product.name) | ||
| func test_add_simple_virtual_product() throws { | ||
| try ProductFlow.addAndVerifyNewProduct(productType: "virtual") | ||
| } | ||
|
|
||
| func test_add_variable_product() throws { | ||
| try ProductFlow.addAndVerifyNewProduct(productType: "variable") | ||
| } | ||
|
Comment on lines
+31
to
37
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ➕ for extracting the repetitive part to a flow. Nice 👍 |
||
| } | ||
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:
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 productand in add product screen it'sPhysical, the common denominator in both is the wordphysical(case-insensitive) so i decided to go with that. it fits the needs of the test case while still keeping it reusable and clear.