Skip to content

Commit 73e5cb7

Browse files
committed
Sample end-to-end workflow scenarios
1 parent d4d238b commit 73e5cb7

File tree

13 files changed

+436
-11
lines changed

13 files changed

+436
-11
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@
9090
<artifactId>allure-cucumber7-jvm</artifactId>
9191
<scope>test</scope>
9292
</dependency>
93+
<dependency>
94+
<groupId>com.github.javafaker</groupId>
95+
<artifactId>javafaker</artifactId>
96+
<version>1.0.2</version>
97+
</dependency>
9398
</dependencies>
9499
<build>
95100
<plugins>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.serenitydojo.playwright.toolshop.actions.api;
2+
3+
import com.microsoft.playwright.Page;
4+
import com.microsoft.playwright.options.RequestOptions;
5+
import com.serenitydojo.playwright.toolshop.domain.User;
6+
7+
public class UserAPIClient {
8+
private final Page page;
9+
10+
private static final String REGISTER_USER = "https://api.practicesoftwaretesting.com/users/register";
11+
12+
public UserAPIClient(Page page) {
13+
this.page = page;
14+
}
15+
16+
public void registerUser(User user) {
17+
var response = page.request().post(
18+
REGISTER_USER,
19+
RequestOptions.create()
20+
.setData(user)
21+
.setHeader("Content-Type", "application/json")
22+
.setHeader("Accept", "application/json"));
23+
if (response.status() != 201) {
24+
throw new IllegalStateException("Could not create user: " + response.text());
25+
}
26+
}
27+
}

src/test/java/com/serenitydojo/playwright/toolshop/catalog/AddToCartTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class AddToCartTest implements TakesFinalScreenshot, WithTracing {
2424
ProductList productList;
2525
ProductDetails productDetails;
2626
NavBar navBar;
27-
CheckoutCart checkoutCart;
27+
ShoppingCart shoppingCart;
2828

2929
@BeforeEach
3030
void openHomePage() {
@@ -37,7 +37,7 @@ void setUp(Page page) {
3737
productList = new ProductList(page);
3838
productDetails = new ProductDetails(page);
3939
navBar = new NavBar(page);
40-
checkoutCart = new CheckoutCart(page);
40+
shoppingCart = new ShoppingCart(page);
4141
}
4242

4343

@@ -48,12 +48,12 @@ void whenCheckingOutASingleItem() {
4848
searchComponent.searchBy("pliers");
4949
productList.viewProductDetails("Combination Pliers");
5050

51-
productDetails.increaseQuanityBy(2);
51+
productDetails.setQuantityTo(2);
5252
productDetails.addToCart();
5353

5454
navBar.openCart();
5555

56-
List<CartLineItem> lineItems = checkoutCart.getLineItems();
56+
List<CartLineItem> lineItems = shoppingCart.getLineItems();
5757

5858
Assertions.assertThat(lineItems)
5959
.hasSize(1)
@@ -72,7 +72,7 @@ void whenCheckingOutMultipleItems() {
7272
navBar.openHomePage();
7373

7474
productList.viewProductDetails("Bolt Cutters");
75-
productDetails.increaseQuanityBy(2);
75+
productDetails.setQuantityTo(2);
7676
productDetails.addToCart();
7777

7878
navBar.openHomePage();
@@ -81,7 +81,7 @@ void whenCheckingOutMultipleItems() {
8181

8282
navBar.openCart();
8383

84-
List<CartLineItem> lineItems = checkoutCart.getLineItems();
84+
List<CartLineItem> lineItems = shoppingCart.getLineItems();
8585

8686
Assertions.assertThat(lineItems).hasSize(2);
8787
List<String> productNames = lineItems.stream().map(CartLineItem::title).toList();
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.serenitydojo.playwright.toolshop.catalog.pageobjects;
2+
3+
import com.microsoft.playwright.Page;
4+
5+
import java.util.List;
6+
7+
public class AddressForm {
8+
private final Page page;
9+
10+
public AddressForm(Page page) {
11+
this.page = page;
12+
}
13+
14+
public void confirmAddress() {
15+
page.getByTestId("proceed-3").click();
16+
}
17+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.serenitydojo.playwright.toolshop.catalog.pageobjects;
2+
3+
import com.microsoft.playwright.Page;
4+
import com.microsoft.playwright.options.AriaRole;
5+
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
10+
11+
public class PaymentForm {
12+
private final Page page;
13+
14+
public PaymentForm(Page page) {
15+
this.page = page;
16+
}
17+
18+
public void choosePaymentMethod(String paymentMethod) {
19+
choosePaymentMethod(paymentMethod, new HashMap<>());
20+
}
21+
public void choosePaymentMethod(String paymentMethod, Map<String,String> paymentDetails) {
22+
page.getByTestId("payment-method").selectOption(paymentMethod);
23+
24+
// Complete details if required for payment type
25+
26+
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Confirm")).click();
27+
28+
assertThat(page.locator(".alert-success")).hasText("Payment was successful");
29+
30+
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Confirm")).click();
31+
32+
}
33+
}

src/test/java/com/serenitydojo/playwright/toolshop/catalog/pageobjects/ProductDetails.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public ProductDetails(Page page) {
1212
}
1313

1414
@Step("Increase product quantity")
15-
public void increaseQuanityBy(int increment) {
16-
for (int i = 1; i <= increment; i++) {
15+
public void setQuantityTo(int quantity) {
16+
for (int i = 1; i <= quantity; i++) {
1717
page.getByTestId("increase-quantity").click();
1818
}
1919
}
@@ -28,4 +28,5 @@ public void addToCart() {
2828
}
2929
);
3030
}
31+
3132
}
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package com.serenitydojo.playwright.toolshop.catalog.pageobjects;
22

33
import com.microsoft.playwright.Page;
4-
import io.qameta.allure.Step;
54

65
import java.util.List;
76

8-
public class CheckoutCart {
7+
public class ShoppingCart {
98
private final Page page;
109

11-
public CheckoutCart(Page page) {
10+
public ShoppingCart(Page page) {
1211
this.page = page;
1312
}
1413

@@ -36,4 +35,11 @@ private String price(String value) {
3635
return value.replace("$", "");
3736
}
3837

38+
public void proceedToCheckout() {
39+
page.getByTestId("proceed-1").click();
40+
}
41+
42+
public void proceedToCheckoutAfterAuthentication() {
43+
page.getByTestId("proceed-2").click();
44+
}
3945
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.serenitydojo.playwright.toolshop.catalog.workflow;
2+
3+
import com.microsoft.playwright.Page;
4+
import com.serenitydojo.playwright.toolshop.actions.api.UserAPIClient;
5+
import com.serenitydojo.playwright.toolshop.domain.User;
6+
import com.serenitydojo.playwright.toolshop.login.LoginPage;
7+
8+
public class AuthenticationWorkflow {
9+
10+
private final UserAPIClient userAPI;
11+
private final LoginPage loginPage;
12+
13+
public AuthenticationWorkflow(Page page) {
14+
this.userAPI = new UserAPIClient(page);
15+
this.loginPage = new LoginPage(page);
16+
}
17+
18+
public User registerUserCalled(String firstName) {
19+
User someUser = User.randomUserNamed(firstName);
20+
userAPI.registerUser(someUser);
21+
return someUser;
22+
}
23+
24+
public void loginAs(User user) {
25+
loginPage.open();
26+
loginPage.loginAs(user);
27+
}
28+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.serenitydojo.playwright.toolshop.catalog.workflow;
2+
3+
import com.microsoft.playwright.Page;
4+
import com.serenitydojo.playwright.toolshop.catalog.pageobjects.*;
5+
import io.qameta.allure.Step;
6+
7+
public class PurchaseWorkflow {
8+
9+
Page page;
10+
NavBar navBar;
11+
SearchComponent searchComponent;
12+
ProductList productList;
13+
ProductDetails productDetails;
14+
ShoppingCart shoppingCart;
15+
AddressForm addressForm;
16+
PaymentForm paymentForm;
17+
18+
public PurchaseWorkflow(Page page) {
19+
this.page = page;
20+
this.navBar = new NavBar(page);
21+
this.searchComponent = new SearchComponent(page);
22+
this.productList = new ProductList(page);
23+
this.productDetails = new ProductDetails(page);
24+
this.shoppingCart = new ShoppingCart(page);
25+
this.addressForm = new AddressForm(page);
26+
this.paymentForm = new PaymentForm(page);
27+
}
28+
29+
@Step("Add product to cart")
30+
public void addProductToCart(String productName, int quantity) {
31+
navBar.openHomePage();
32+
searchComponent.searchBy(productName);
33+
productList.viewProductDetails(productName);
34+
productDetails.setQuantityTo(quantity);
35+
productDetails.addToCart();
36+
}
37+
38+
public void checkOutCart() {
39+
navBar.openCart();
40+
shoppingCart.proceedToCheckout();
41+
}
42+
43+
public void proceedToCheckoutAfterAuthentication() {
44+
shoppingCart.proceedToCheckoutAfterAuthentication();
45+
}
46+
47+
public void confirmAddress() {
48+
addressForm.confirmAddress();
49+
}
50+
51+
public void choosePaymentMethod(String paymentMethod) {
52+
paymentForm.choosePaymentMethod(paymentMethod);
53+
}
54+
55+
public String confirmationMessage() {
56+
return page.locator("#order-confirmation").textContent();
57+
}
58+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.serenitydojo.playwright.toolshop.domain;
2+
3+
import com.github.javafaker.Faker;
4+
5+
import java.time.LocalDate;
6+
import java.time.format.DateTimeFormatter;
7+
8+
/**
9+
* {
10+
* "first_name": "John",
11+
* "last_name": "Doe",
12+
* "address": "Street 1",
13+
* "city": "City",
14+
* "state": "State",
15+
* "country": "Country",
16+
* "postcode": "1234AA",
17+
* "phone": "0987654321",
18+
* "dob": "1970-01-01",
19+
* "password": "S1!uper-secret",
20+
* "email": "[email protected]"
21+
* }
22+
*/
23+
public record User(
24+
String first_name,
25+
String last_name,
26+
String address,
27+
String city,
28+
String state,
29+
String country,
30+
String postcode,
31+
String phone,
32+
String dob,
33+
String password,
34+
String email
35+
) {
36+
public static User randomUserNamed(String firstName) {
37+
Faker fake = new Faker();
38+
int year = fake.number().numberBetween(1970,2000);
39+
int month = fake.number().numberBetween(1,12);
40+
int day = fake.number().numberBetween(1,28);
41+
LocalDate date = LocalDate.of(year,month,day);
42+
String formattedDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
43+
44+
return new User(
45+
firstName,
46+
fake.name().lastName(),
47+
fake.address().streetAddress(),
48+
fake.address().city(),
49+
fake.address().state(),
50+
fake.address().country(),
51+
fake.address().zipCode(),
52+
fake.phoneNumber().phoneNumber(),
53+
formattedDate,
54+
"Az1234£!3",
55+
fake.internet().emailAddress()
56+
);
57+
}
58+
59+
public User withPassword(String password) {
60+
return new User(first_name, last_name, address, city, state, country, postcode, phone, dob, password, email);
61+
}
62+
}

0 commit comments

Comments
 (0)