Skip to content

Commit 1ef20ee

Browse files
committed
feat: add checkly checks
1 parent 9325414 commit 1ef20ee

12 files changed

Lines changed: 6281 additions & 799 deletions

File tree

‎__checks__/api.check.ts‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ApiCheck, AssertionBuilder } from 'checkly/constructs'
2+
3+
new ApiCheck('get-books-api-check', {
4+
name: 'GET /books',
5+
alertChannels: [],
6+
degradedResponseTime: 10000,
7+
maxResponseTime: 20000,
8+
request: {
9+
url: 'https://danube-web.shop/api/books',
10+
method: 'GET',
11+
headers: [
12+
{
13+
key: 'Accept',
14+
value: 'application/json'
15+
}
16+
],
17+
followRedirects: true,
18+
skipSSL: false,
19+
assertions: [
20+
AssertionBuilder.statusCode().equals(200),
21+
],
22+
}
23+
})
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { test, expect } from '@playwright/test';
2+
import { DanubeShopPage } from './pages/shop';
3+
import { DanubeItemDetailsPage } from './pages/itemDetails';
4+
import { DanubeCartPage } from './pages/cart';
5+
import { DanubeCheckoutPage } from './pages/checkout';
6+
import { registeredUser } from './data/users';
7+
8+
test('checkout', async ({ page }) => {
9+
10+
await page.goto('https://danube-web.shop');
11+
12+
const shopPage = new DanubeShopPage(page);
13+
const itemDetailsPage = new DanubeItemDetailsPage(page);
14+
const cartPage = new DanubeCartPage(page);
15+
const checkoutPage = new DanubeCheckoutPage(page);
16+
17+
await shopPage.selectShopItem();
18+
await itemDetailsPage.addToCart();
19+
await cartPage.proceedToCheckout();
20+
await checkoutPage.completeOrderForm(registeredUser);
21+
await checkoutPage.finalizeOrder();
22+
23+
expect(await checkoutPage.successMessageIsShown());
24+
25+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export const registeredUser = {
2+
email: 'user@email.com',
3+
password: 'supersecure1',
4+
name: 'Max',
5+
surname: 'Mustermann',
6+
address: {
7+
streetAndNumber: 'Charlottenstr. 57',
8+
zipcode: '10117',
9+
city: 'Berlin',
10+
company: 'Firma GmbH'
11+
}
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { test, expect } from '@playwright/test';
2+
import { DanubeShopPage } from './pages/shop';
3+
import { DanubeItemDetailsPage } from './pages/itemDetails';
4+
import { registeredUser } from './data/users';
5+
6+
test('login', async ({ page }) => {
7+
await page.goto('https://danube-web.shop');
8+
9+
const shopPage = new DanubeShopPage(page);
10+
11+
await shopPage.performLogin(registeredUser);
12+
expect(await shopPage.isPastLogin());
13+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { expect, Locator, Page } from '@playwright/test';
2+
3+
export class DanubeCartPage {
4+
readonly page: Page
5+
readonly checkoutButton: Locator;
6+
7+
constructor(page: Page) {
8+
this.page = page;
9+
this.checkoutButton = page.locator('.call-to-action').last();
10+
}
11+
12+
async proceedToCheckout() {
13+
await this.checkoutButton.click()
14+
}
15+
16+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { expect, Locator, Page } from '@playwright/test';
2+
3+
export class DanubeCheckoutPage {
4+
readonly page: Page;
5+
readonly buyButton: Locator;
6+
7+
constructor(page: Page) {
8+
this.page = page;
9+
this.buyButton = page.locator('.call-to-action').last();
10+
}
11+
12+
async completeOrderForm(user) {
13+
await this.page.locator('#s-name').type(user.name);
14+
await this.page.locator('#s-surname').type(user.surname);
15+
await this.page.locator('#s-address').type(user.address.streetAndNumber);
16+
await this.page.locator('#s-zipcode').type(user.address.zipcode);
17+
await this.page.locator('#s-city').type(user.address.city);
18+
await this.page.locator('#s-company').type(user.address.company);
19+
await this.page.locator('.checkout > form').click();
20+
await this.page.locator('#asap').click();
21+
}
22+
23+
async finalizeOrder() {
24+
await this.buyButton.click();
25+
}
26+
27+
async successMessageIsShown() {
28+
return this.page.getByText('order is on the way').isVisible();
29+
}
30+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { expect, Locator, Page } from '@playwright/test';
2+
3+
export class DanubeItemDetailsPage {
4+
readonly page: Page;
5+
readonly addToCartButton: Locator;
6+
readonly detailsContainer: Locator;
7+
8+
constructor(page: Page) {
9+
this.page = page;
10+
this.addToCartButton = page.locator('text=add to cart');
11+
this.detailsContainer = page.locator('.detail')
12+
}
13+
14+
async addToCart() {
15+
await this.addToCartButton.click();
16+
}
17+
18+
async isActive() {
19+
return this.detailsContainer.isVisible();
20+
}
21+
22+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { expect, Locator, Page } from '@playwright/test';
2+
3+
export class DanubeShopPage {
4+
readonly page: Page;
5+
readonly shopItems: Locator;
6+
readonly shopSearchBar: Locator;
7+
readonly shopSearchButton: Locator;
8+
readonly buttonLogin: Locator;
9+
readonly fieldLoginEmail: Locator;
10+
readonly fieldLoginPassword: Locator;
11+
readonly buttonLoginProceed: Locator;
12+
readonly loginMessage: Locator;
13+
readonly logo: Locator;
14+
15+
constructor(page: Page) {
16+
this.page = page;
17+
this.shopItems = page.locator('.preview > .preview-author');
18+
this.shopSearchBar = page.locator('input');
19+
this.shopSearchButton = page.locator('#button-search');
20+
this.buttonLogin = page.locator('#login');
21+
this.fieldLoginEmail = page.locator('#n-email');
22+
this.fieldLoginPassword = page.locator('#n-password2');
23+
this.buttonLoginProceed = page.locator('#goto-signin-btn');
24+
this.loginMessage = page.locator('#login-message');
25+
this.logo = page.locator('#logo');
26+
}
27+
28+
async selectShopItem() {
29+
await this.shopItems.first().click();
30+
}
31+
32+
async performSearch(searchString: string) {
33+
await this.shopSearchBar.fill(searchString);
34+
await this.shopSearchButton.click();
35+
}
36+
37+
async performLogin(user) {
38+
await this.buttonLogin.click();
39+
await this.fieldLoginEmail.fill(user.email);
40+
await this.fieldLoginPassword.fill(user.password);
41+
await this.buttonLoginProceed.click();
42+
}
43+
44+
async isPastLogin() {
45+
return this.loginMessage.isVisible();
46+
}
47+
48+
async goto() {
49+
await this.logo.click();
50+
}
51+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { test, expect } from '@playwright/test';
2+
import { DanubeShopPage } from './pages/shop';
3+
import { DanubeItemDetailsPage } from './pages/itemDetails';
4+
5+
test('search', async ({page}) => {
6+
7+
await page.goto('https://danube-web.shop');
8+
9+
const shopPage = new DanubeShopPage(page);
10+
const itemDetailsPage = new DanubeItemDetailsPage(page);
11+
12+
await shopPage.performSearch('For')
13+
await shopPage.selectShopItem()
14+
expect(await itemDetailsPage.isActive())
15+
16+
})

‎checkly.config.ts‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { defineConfig } from 'checkly'
2+
import { Frequency } from 'checkly/constructs'
3+
4+
export default defineConfig({
5+
projectName: 'Website Monitoring',
6+
logicalId: 'website-monitoring-1',
7+
repoUrl: 'https://github.com/acme/website',
8+
checks: {
9+
activated: true,
10+
muted: false,
11+
runtimeId: '2022.10',
12+
frequency: Frequency.EVERY_5M,
13+
locations: ['us-east-1', 'eu-west-1'],
14+
tags: ['website', 'api'],
15+
checkMatch: '**/__checks__/**/*.check.ts',
16+
ignoreDirectoriesMatch: [],
17+
browserChecks: {
18+
frequency: Frequency.EVERY_10M,
19+
testMatch: '**/__checks__/**/*.spec.ts',
20+
},
21+
},
22+
cli: {
23+
runLocation: 'eu-west-1',
24+
}
25+
})

0 commit comments

Comments
 (0)