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 && (