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