From e899fc8447fb77830a41f61fa90dd53d0792846e Mon Sep 17 00:00:00 2001 From: Dominik Broj Date: Mon, 15 Jan 2024 14:49:15 +0100 Subject: [PATCH] add e2e test for schedules (#3683) # What this PR does - add e2e test for schedules page ## Which issue(s) this PR fixes https://github.com/grafana/oncall-private/issues/2455 ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required) --- .../e2e-tests/schedules/schedulesList.test.ts | 34 ++++++++++++++++ grafana-plugin/e2e-tests/utils/navigation.ts | 1 + .../src/pages/insights/Insights.tsx | 4 +- .../src/pages/schedules/Schedules.tsx | 39 ++++++++++--------- 4 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 grafana-plugin/e2e-tests/schedules/schedulesList.test.ts diff --git a/grafana-plugin/e2e-tests/schedules/schedulesList.test.ts b/grafana-plugin/e2e-tests/schedules/schedulesList.test.ts new file mode 100644 index 00000000..31c50c1f --- /dev/null +++ b/grafana-plugin/e2e-tests/schedules/schedulesList.test.ts @@ -0,0 +1,34 @@ +import { expect, test } from '../fixtures'; +import { generateRandomValue } from '../utils/forms'; +import { goToOnCallPage } from '../utils/navigation'; +import { createOnCallSchedule } from '../utils/schedule'; + +test('schedule calendar and list of schedules is correctly displayed', async ({ adminRolePage }) => { + const { page, userName } = adminRolePage; + + const onCallScheduleName = generateRandomValue(); + await createOnCallSchedule(page, onCallScheduleName, userName); + + await goToOnCallPage(page, 'schedules'); + + // schedule slots are present in calendar + const nbOfSlotsInCalendar = await page.getByTestId('schedule-slot').count(); + await expect(nbOfSlotsInCalendar).toBeGreaterThan(0); + + // filter table to show only created schedule + await page + .locator('div') + .filter({ hasText: /^Search or filter results\.\.\.$/ }) + .nth(1) + .click(); + await page.keyboard.insertText(onCallScheduleName); + await page.keyboard.press('Enter'); + await page.waitForTimeout(2000); + + // schedules table displays details created schedule + const schedulesTable = page.getByTestId('schedules-table'); + await expect(schedulesTable.getByRole('cell', { name: onCallScheduleName })).toBeVisible(); + await expect(schedulesTable.getByRole('cell', { name: 'Web' })).toBeVisible(); + await expect(schedulesTable.getByRole('cell', { name: userName })).toBeVisible(); + await expect(schedulesTable.getByRole('cell', { name: 'No team' })).toBeVisible(); +}); diff --git a/grafana-plugin/e2e-tests/utils/navigation.ts b/grafana-plugin/e2e-tests/utils/navigation.ts index 2404eb65..008951c1 100644 --- a/grafana-plugin/e2e-tests/utils/navigation.ts +++ b/grafana-plugin/e2e-tests/utils/navigation.ts @@ -10,5 +10,6 @@ export const goToGrafanaPage = async (page: Page, url = '') => _goToPage(page, u export const goToOnCallPage = async (page: Page, onCallPage: OnCallPage) => { await _goToPage(page, `/a/grafana-oncall-app/${onCallPage}`); + await page.waitForLoadState('networkidle'); await page.waitForTimeout(1000); }; diff --git a/grafana-plugin/src/pages/insights/Insights.tsx b/grafana-plugin/src/pages/insights/Insights.tsx index a9b56b7b..655031e0 100644 --- a/grafana-plugin/src/pages/insights/Insights.tsx +++ b/grafana-plugin/src/pages/insights/Insights.tsx @@ -73,8 +73,8 @@ const Insights = observer(() => { setDatasource(`${text}`); }); return () => { - stackListener?.unsubscribe(); - dataSourceListener?.unsubscribe(); + stackListener?.unsubscribe?.(); + dataSourceListener?.unsubscribe?.(); }; }, []); diff --git a/grafana-plugin/src/pages/schedules/Schedules.tsx b/grafana-plugin/src/pages/schedules/Schedules.tsx index 28330e81..efd8b35c 100644 --- a/grafana-plugin/src/pages/schedules/Schedules.tsx +++ b/grafana-plugin/src/pages/schedules/Schedules.tsx @@ -100,25 +100,26 @@ class SchedulesPage extends React.Component - - +
+
+ {showNewScheduleSelector && (