Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/PULL_REQUEST_TEMPLATE.MD
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.

36 changes: 19 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,41 +37,43 @@ Prerequisites: Node.js 20+ (with npm)
### Basic Test Execution

```bash
npm run test # Run tests in Chromium
npm run test # Run tests in Chromium
npm run test-head # Run tests in headed mode
```

### Upload testing results to QA Sphere
### Upload testing results to QA Sphere

1. Add your QA Sphere credentials to the .env file:

```bash
QAS_TOKEN=<QA Sphere API Token>
# Get your token in QA Sphere -> Settings -> API Keys

QAS_URL=<QA Sphere Company URL>
# Example: https://qasdemo.eu2.qasphere.com
```
```bash
QAS_TOKEN=<QA Sphere API Token>
# Get your token in QA Sphere -> Settings -> API Keys

QAS_URL=<QA Sphere Company URL>
# Example: https://qasdemo.eu2.qasphere.com
```

2. Upload results:

```bash
npx qas-cli junit-upload --attachments junit-results/results.xml
```
```bash
npx qas-cli junit-upload --attachments junit-results/results.xml # For JUnit XML
npx qas-cli playwright-json-upload --attachments playwright-report/results.json # For Playwright JSON
```

# Additional Commands

# Additional Commands
Different browsers:

Different browsers:
```bash
npm run chromium # Run tests in Chromium
npm run firefox # Run tests in Firefox
npm run webkit # Run tests in WebKit
npm run webkit # Run tests in WebKit
```

Playwright report:
Playwright report:

```bash
npm run play-report # Open Playwright HTML report
npm run play-report # Open Playwright HTML report
```

## License
Expand Down
8 changes: 3 additions & 5 deletions docs/manual-testing/requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@ The system shall provide a consistent, user-friendly, and accessible navigation
- Today's Menu link
- About Us link
- Cart icon with counter
![Navigation requirement1](https://github.com/user-attachments/assets/5f7d158b-4b0d-48b9-8293-f2f79487ae6d)
![Navigation requirement2](https://github.com/user-attachments/assets/2aa8097c-3cb4-4972-9301-6a8018a52871)

![Navigation requirement1](https://github.com/user-attachments/assets/5f7d158b-4b0d-48b9-8293-f2f79487ae6d)
![Navigation requirement2](https://github.com/user-attachments/assets/2aa8097c-3cb4-4972-9301-6a8018a52871)

#### Navigation Behavior

Expand Down Expand Up @@ -81,7 +80,7 @@ Display:
- Theme-compliant styling
- Accessibility compliance
- Responsive design implementation

![UI Requirements1](https://github.com/user-attachments/assets/4514d7b1-1bdb-43d2-b270-1309d5323b40)

## Menu Display Requirements {#req-3-menu}
Expand All @@ -105,7 +104,6 @@ Tabs:

![Menu Display Requirements1](https://github.com/user-attachments/assets/135a6b9c-d664-4e29-affb-907e17e7d604)


#### Product Display

Elements:
Expand Down
1 change: 1 addition & 0 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const config: PlaywrightTestConfig = {
['line'],
['html', { open: 'never' }],
['junit', { outputFile: './junit-results/results.xml' }],
['json', { outputFile: './playwright-report/results.json' }],
],

/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
Expand Down
252 changes: 133 additions & 119 deletions tests/ui.cart.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,127 +3,141 @@ import { Menu } from './pageobjects/menu'
import { Cart } from './pageobjects/cart'
import { Checkout, paymentMethods } from './pageobjects/checkout'

test('BD-023: User should see product list according the cart on the Checkout page', async ({
page,
}) => {
const menu = new Menu(page)
await menu.goto()

await addToCart(menu)

const pizzaMenu = await menu.getPizzaMenu()
const drinksMenu = await menu.getOtherMenu('drinks')
const dessertsMenu = await menu.getOtherMenu('desserts')

let expectedCartResponse = {
items: [
{ name: pizzaMenu[0].name, amount: pizzaMenu[0].price },
{ name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 },
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
],
total:
pizzaMenu[0].price +
pizzaMenu[1].price * 2 +
drinksMenu[0].price +
drinksMenu[1].price +
dessertsMenu[0].price,
test(
'BD-023: User should see product list according the cart on the Checkout page',
{
annotation: {
type: 'test case',
description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/23',
},
},
async ({ page }) => {
const menu = new Menu(page)
await menu.goto()

await addToCart(menu)

const pizzaMenu = await menu.getPizzaMenu()
const drinksMenu = await menu.getOtherMenu('drinks')
const dessertsMenu = await menu.getOtherMenu('desserts')

let expectedCartResponse = {
items: [
{ name: pizzaMenu[0].name, amount: pizzaMenu[0].price },
{ name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 },
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
],
total:
pizzaMenu[0].price +
pizzaMenu[1].price * 2 +
drinksMenu[0].price +
drinksMenu[1].price +
dessertsMenu[0].price,
}

const cart = new Cart(page)
await cart.openCart()
let cartResponse = await cart.getCartItems()
expect(cartResponse).toEqual(expectedCartResponse)

// remove items from cart and check response

await cart.removeCartItem(1)
await cart.removeCartItem(0)

expectedCartResponse = {
items: [
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
],
total: drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price,
}

cartResponse = await cart.getCartItems()
expect(cartResponse).toEqual(expectedCartResponse)

// add back items to cart again
await cart.closeCart()
await menu.switchTab('pizza')
await menu.addMenuItemToCart(1)
await menu.addMenuItemToCart(1)

await cart.openCart()
expectedCartResponse = {
items: [
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
{ name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 },
],
total:
drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price + pizzaMenu[1].price * 2,
}

cartResponse = await cart.getCartItems()
expect(cartResponse).toEqual(expectedCartResponse)
}

const cart = new Cart(page)
await cart.openCart()
let cartResponse = await cart.getCartItems()
expect(cartResponse).toEqual(expectedCartResponse)

// remove items from cart and check response

await cart.removeCartItem(1)
await cart.removeCartItem(0)

expectedCartResponse = {
items: [
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
],
total: drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price,
}

cartResponse = await cart.getCartItems()
expect(cartResponse).toEqual(expectedCartResponse)

// add back items to cart again
await cart.closeCart()
await menu.switchTab('pizza')
await menu.addMenuItemToCart(1)
await menu.addMenuItemToCart(1)

await cart.openCart()
expectedCartResponse = {
items: [
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
{ name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 },
],
total:
drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price + pizzaMenu[1].price * 2,
}

cartResponse = await cart.getCartItems()
expect(cartResponse).toEqual(expectedCartResponse)
})

test('BD-022: User should place the order successfully after entering valid data in all required fields and selecting the "Cash" payment', async ({
page,
}) => {
const menu = new Menu(page)
await menu.goto()

await addToCart(menu)

const pizzaMenu = await menu.getPizzaMenu()
const drinksMenu = await menu.getOtherMenu('drinks')
const dessertsMenu = await menu.getOtherMenu('desserts')

const expectedItemsResponse = {
items: [
{ name: pizzaMenu[0].name, amount: pizzaMenu[0].price },
{ name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 },
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
],
total:
pizzaMenu[0].price +
pizzaMenu[1].price * 2 +
drinksMenu[0].price +
drinksMenu[1].price +
dessertsMenu[0].price,
)

test(
'BD-022: User should place the order successfully after entering valid data in all required fields and selecting the "Cash" payment',
{
annotation: {
type: 'test case',
description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/22',
},
},
async ({ page }) => {
const menu = new Menu(page)
await menu.goto()

await addToCart(menu)

const pizzaMenu = await menu.getPizzaMenu()
const drinksMenu = await menu.getOtherMenu('drinks')
const dessertsMenu = await menu.getOtherMenu('desserts')

const expectedItemsResponse = {
items: [
{ name: pizzaMenu[0].name, amount: pizzaMenu[0].price },
{ name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 },
{ name: drinksMenu[0].name, amount: drinksMenu[0].price },
{ name: drinksMenu[1].name, amount: drinksMenu[1].price },
{ name: dessertsMenu[0].name, amount: dessertsMenu[0].price },
],
total:
pizzaMenu[0].price +
pizzaMenu[1].price * 2 +
drinksMenu[0].price +
drinksMenu[1].price +
dessertsMenu[0].price,
}

const cart = new Cart(page)
await cart.openCart()
await page.waitForTimeout(1000)
await cart.checkout()

const checkout = new Checkout(page)
const orderRes = await checkout.getOrderItems()
expect(orderRes).toEqual(expectedItemsResponse)

const nameInput = await checkout.getNameInput()
await nameInput.fill('John Doe')

const emailInput = await checkout.getEmailInput()
await emailInput.fill('johndoe@example.com')

const paymentMethodSelect = await checkout.getPaymentMethodSelect()
expect(await paymentMethodSelect.locator('option').allInnerTexts()).toEqual(paymentMethods)
await paymentMethodSelect.selectOption({ label: 'Cash on Delivery' })

await checkout.placeOrderButton.click()
}

const cart = new Cart(page)
await cart.openCart()
await page.waitForTimeout(1000)
await cart.checkout()

const checkout = new Checkout(page)
const orderRes = await checkout.getOrderItems()
expect(orderRes).toEqual(expectedItemsResponse)

const nameInput = await checkout.getNameInput()
await nameInput.fill('John Doe')

const emailInput = await checkout.getEmailInput()
await emailInput.fill('johndoe@example.com')

const paymentMethodSelect = await checkout.getPaymentMethodSelect()
expect(await paymentMethodSelect.locator('option').allInnerTexts()).toEqual(paymentMethods)
await paymentMethodSelect.selectOption({ label: 'Cash on Delivery' })

await checkout.placeOrderButton.click()
})
)

const addToCart = async (menu: Menu) => {
await menu.addMenuItemToCart(0)
Expand Down
Loading