151 lines
4.3 KiB
TypeScript
151 lines
4.3 KiB
TypeScript
|
import { expect, Page, test } from '@playwright/test';
|
||
|
import ROUTES from 'constants/routes';
|
||
|
|
||
|
import servicesSuccessResponse from '../fixtures/api/services/200.json';
|
||
|
import { loginApi } from '../fixtures/common';
|
||
|
import { SERVICE_TABLE_HEADERS } from './utils';
|
||
|
|
||
|
let page: Page;
|
||
|
|
||
|
test.describe('Service flow', () => {
|
||
|
test.beforeEach(async ({ baseURL, browser }) => {
|
||
|
const context = await browser.newContext({ storageState: 'tests/auth.json' });
|
||
|
const newPage = await context.newPage();
|
||
|
|
||
|
await loginApi(newPage);
|
||
|
|
||
|
await newPage.goto(`${baseURL}${ROUTES.APPLICATION}`);
|
||
|
|
||
|
page = newPage;
|
||
|
});
|
||
|
|
||
|
test('Services empty page', async ({ baseURL }) => {
|
||
|
// visit services page
|
||
|
await page.goto(`${baseURL}${ROUTES.APPLICATION}`);
|
||
|
|
||
|
await page.route(`**/services`, (route) =>
|
||
|
route.fulfill({
|
||
|
status: 200,
|
||
|
json: [],
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
// expect noData to be present
|
||
|
await expect(page.getByText('No data')).toBeVisible();
|
||
|
});
|
||
|
|
||
|
test('Services table and service details page rendered with correct data', async ({
|
||
|
baseURL,
|
||
|
}) => {
|
||
|
// visit services page
|
||
|
await page.goto(`${baseURL}${ROUTES.APPLICATION}`);
|
||
|
|
||
|
// assert the URL of the services page
|
||
|
await expect(page).toHaveURL(`${baseURL}${ROUTES.APPLICATION}`);
|
||
|
|
||
|
// mock the services list call to return non-empty data
|
||
|
await page.route(`**/services`, (route) =>
|
||
|
route.fulfill({
|
||
|
status: 200,
|
||
|
json: servicesSuccessResponse,
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
// assert the presence of services breadcrumbs
|
||
|
const breadcrumbServicesText = await page
|
||
|
.locator('.ant-breadcrumb-link a[href="/services"]')
|
||
|
.nth(1)
|
||
|
.textContent();
|
||
|
await expect(breadcrumbServicesText).toEqual('Services');
|
||
|
|
||
|
// expect the services headers to be loaded correctly
|
||
|
const p99Latency = page.locator(
|
||
|
`th:has-text("${SERVICE_TABLE_HEADERS.P99LATENCY}")`,
|
||
|
);
|
||
|
|
||
|
await expect(p99Latency).toBeVisible();
|
||
|
const errorRate = await page.locator(
|
||
|
`th:has-text("${SERVICE_TABLE_HEADERS.ERROR_RATE}")`,
|
||
|
);
|
||
|
|
||
|
await expect(errorRate).toBeVisible();
|
||
|
const operationsPerSecond = await page.locator(
|
||
|
`th:has-text("${SERVICE_TABLE_HEADERS.OPS_PER_SECOND}")`,
|
||
|
);
|
||
|
|
||
|
await expect(operationsPerSecond).toBeVisible();
|
||
|
|
||
|
// expect services to be listed in the table
|
||
|
const redisService = await page
|
||
|
.locator('a[href="/services/redis"]')
|
||
|
.isVisible();
|
||
|
|
||
|
expect(redisService).toBeTruthy();
|
||
|
|
||
|
// route to a service details page
|
||
|
await page.locator('a[href="/services/redis"]').click();
|
||
|
|
||
|
// wait for the network calls to be settled
|
||
|
await page.waitForLoadState('networkidle');
|
||
|
|
||
|
// render the overview tab
|
||
|
await page.getByRole('tab', { name: 'Overview' }).click();
|
||
|
|
||
|
// check the presence of different graphs on the overview tab
|
||
|
const latencyGraph = await page
|
||
|
.locator('[data-testid="service_latency"]')
|
||
|
.isVisible();
|
||
|
|
||
|
expect(latencyGraph).toBeTruthy();
|
||
|
|
||
|
const rateOps = await page
|
||
|
.locator('[data-testid="operations_per_sec"]')
|
||
|
.isVisible();
|
||
|
|
||
|
expect(rateOps).toBeTruthy();
|
||
|
|
||
|
const errorPercentage = await page
|
||
|
.locator('[data-testid="error_percentage_%"]')
|
||
|
.isVisible();
|
||
|
|
||
|
expect(errorPercentage).toBeTruthy();
|
||
|
|
||
|
// navigate to the DB call metrics and validate the tables
|
||
|
await page.getByRole('tab', { name: 'DB Call Metrics' }).click();
|
||
|
|
||
|
const databaseCallRps = await page
|
||
|
.locator('[data-testid="database_call_rps"]')
|
||
|
.isVisible();
|
||
|
expect(databaseCallRps).toBeTruthy();
|
||
|
|
||
|
const databaseCallsAvgDuration = await page
|
||
|
.locator('[data-testid="database_call_avg_duration"]')
|
||
|
.isVisible();
|
||
|
expect(databaseCallsAvgDuration).toBeTruthy();
|
||
|
|
||
|
// navigate to external metrics and validate the tables
|
||
|
|
||
|
await page.getByRole('tab', { name: 'External Metrics' }).click();
|
||
|
|
||
|
const externalCallErrorPerc = await page
|
||
|
.locator('[data-testid="external_call_error_percentage"]')
|
||
|
.isVisible();
|
||
|
expect(externalCallErrorPerc).toBeTruthy();
|
||
|
|
||
|
const externalCallDuration = await page
|
||
|
.locator('[data-testid="external_call_duration"]')
|
||
|
.isVisible();
|
||
|
expect(externalCallDuration).toBeTruthy();
|
||
|
|
||
|
const externalCallRps = await page
|
||
|
.locator('[data-testid="external_call_rps_by_address"]')
|
||
|
.isVisible();
|
||
|
expect(externalCallRps).toBeTruthy();
|
||
|
|
||
|
const externalCallDurationByAddress = await page
|
||
|
.locator('[data-testid="external_call_duration_by_address"]')
|
||
|
.isVisible();
|
||
|
expect(externalCallDurationByAddress).toBeTruthy();
|
||
|
});
|
||
|
});
|