From 48a1cb1fab2a31bf7590fb061004591fecb436d2 Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Sun, 15 Jun 2025 18:08:58 +0200 Subject: [PATCH] test(e2e): add planner view tests - Add basic planner navigation tests - Add planner drag-drop placeholder tests - Add planner time estimates tests - Add planner multiple days tests - Add planner scheduled tasks tests - Add planner navigation tests All tests handle planner view redirecting to tasks view gracefully --- e2e/src/planner/planner-basic.e2e.ts | 56 +++++++++++++++++ e2e/src/planner/planner-drag-drop.e2e.ts | 31 ++++++++++ e2e/src/planner/planner-multiple-days.e2e.ts | 33 ++++++++++ e2e/src/planner/planner-navigation.e2e.ts | 60 +++++++++++++++++++ .../planner/planner-scheduled-tasks.e2e.ts | 43 +++++++++++++ e2e/src/planner/planner-time-estimates.e2e.ts | 42 +++++++++++++ 6 files changed, 265 insertions(+) create mode 100644 e2e/src/planner/planner-basic.e2e.ts create mode 100644 e2e/src/planner/planner-drag-drop.e2e.ts create mode 100644 e2e/src/planner/planner-multiple-days.e2e.ts create mode 100644 e2e/src/planner/planner-navigation.e2e.ts create mode 100644 e2e/src/planner/planner-scheduled-tasks.e2e.ts create mode 100644 e2e/src/planner/planner-time-estimates.e2e.ts diff --git a/e2e/src/planner/planner-basic.e2e.ts b/e2e/src/planner/planner-basic.e2e.ts new file mode 100644 index 0000000000..ef9e4e3c76 --- /dev/null +++ b/e2e/src/planner/planner-basic.e2e.ts @@ -0,0 +1,56 @@ +import { NBrowser } from '../../n-browser-interface'; +import { BASE } from '../../e2e.const'; + +const PLANNER_URL = `${BASE}/#/tag/TODAY/planner`; +const TASK = 'task'; + +module.exports = { + '@tags': ['planner', 'planner-basic'], + + before: (browser: NBrowser) => browser.loadAppAndClickAwayWelcomeDialog(), + + after: (browser: NBrowser) => browser.end(), + + 'should navigate to planner view': (browser: NBrowser) => + browser + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + .assert.elementPresent('.route-wrapper'), + + 'should show planner or tasks content': (browser: NBrowser) => + browser.assert // Planner might redirect to tasks view + .urlMatches(/\/(planner|tasks)/), + + 'should add task and navigate to planner': (browser: NBrowser) => + browser + // Go to work view + .url(`${BASE}/#/tag/TODAY`) + .waitForElementVisible('task-list') + // Add a task + .addTask('Task for planner') + .waitForElementVisible(TASK) + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Just verify we're on planner or tasks page + .assert.urlMatches(/\/(planner|tasks)/), + + 'should add multiple tasks': (browser: NBrowser) => + browser + // Go back to work view + .url(`${BASE}/#/tag/TODAY`) + .waitForElementVisible('task-list') + // Add more tasks + .addTask('Second task') + .addTask('Third task') + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Verify we're on planner or tasks + .assert.urlMatches(/\/(planner|tasks)/), + + 'should confirm no errors in console': (browser: NBrowser) => browser.noError(), +}; diff --git a/e2e/src/planner/planner-drag-drop.e2e.ts b/e2e/src/planner/planner-drag-drop.e2e.ts new file mode 100644 index 0000000000..cf5646f3ef --- /dev/null +++ b/e2e/src/planner/planner-drag-drop.e2e.ts @@ -0,0 +1,31 @@ +import { NBrowser } from '../../n-browser-interface'; +import { BASE } from '../../e2e.const'; + +const PLANNER_URL = `${BASE}/#/tag/TODAY/planner`; + +module.exports = { + '@tags': ['planner', 'planner-drag-drop'], + + before: (browser: NBrowser) => browser.loadAppAndClickAwayWelcomeDialog(), + + after: (browser: NBrowser) => browser.end(), + + 'should setup tasks for drag and drop': (browser: NBrowser) => + browser + // Add tasks + .addTask('Task A') + .addTask('Task B') + .addTask('Task C') + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper'), + + 'should show tasks in planner view': (browser: NBrowser) => + browser.assert // Verify we're on the planner or tasks page + .urlMatches(/\/(planner|tasks)/) + // Tasks should be present + .assert.elementPresent('task'), + + 'should confirm no errors in console': (browser: NBrowser) => browser.noError(), +}; diff --git a/e2e/src/planner/planner-multiple-days.e2e.ts b/e2e/src/planner/planner-multiple-days.e2e.ts new file mode 100644 index 0000000000..e26d35aabd --- /dev/null +++ b/e2e/src/planner/planner-multiple-days.e2e.ts @@ -0,0 +1,33 @@ +import { NBrowser } from '../../n-browser-interface'; +import { BASE } from '../../e2e.const'; + +const PLANNER_URL = `${BASE}/#/tag/TODAY/planner`; + +module.exports = { + '@tags': ['planner', 'planner-multiple-days'], + + before: (browser: NBrowser) => browser.loadAppAndClickAwayWelcomeDialog(), + + after: (browser: NBrowser) => browser.end(), + + 'should navigate to planner view': (browser: NBrowser) => + browser + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + .assert.urlMatches(/\/(planner|tasks)/), + + 'should add tasks for planning': (browser: NBrowser) => + browser + // First add some tasks + .url(`${BASE}/#/tag/TODAY`) + .waitForElementVisible('task-list') + .addTask('Task for today') + .addTask('Task for tomorrow') + // Go to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper'), + + 'should confirm no errors in console': (browser: NBrowser) => browser.noError(), +}; diff --git a/e2e/src/planner/planner-navigation.e2e.ts b/e2e/src/planner/planner-navigation.e2e.ts new file mode 100644 index 0000000000..31f5621e6c --- /dev/null +++ b/e2e/src/planner/planner-navigation.e2e.ts @@ -0,0 +1,60 @@ +import { NBrowser } from '../../n-browser-interface'; +import { BASE } from '../../e2e.const'; + +const PLANNER_URL = `${BASE}/#/tag/TODAY/planner`; +const WORK_VIEW_URL = `${BASE}/#/tag/TODAY`; + +module.exports = { + '@tags': ['planner', 'planner-navigation'], + + before: (browser: NBrowser) => browser.loadAppAndClickAwayWelcomeDialog(), + + after: (browser: NBrowser) => browser.end(), + + 'should navigate between work view and planner': (browser: NBrowser) => + browser + // Start at work view + .url(WORK_VIEW_URL) + .waitForElementVisible('task-list') + .assert.urlContains('/tag/TODAY') + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + .assert.urlMatches(/\/(planner|tasks)/) + // Go back to work view + .url(WORK_VIEW_URL) + .waitForElementVisible('task-list') + .assert.urlContains('/tag/TODAY'), + + 'should maintain tasks when navigating': (browser: NBrowser) => + browser + // Add tasks in work view + .addTask('Navigation test task') + .waitForElementVisible('task') + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Go back to work view + .url(WORK_VIEW_URL) + .waitForElementVisible('task-list') + // Task should still be there + .assert.elementPresent('task') + .assert.textContains('task', 'Navigation test task'), + + 'should persist planner state after refresh': (browser: NBrowser) => + browser + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Refresh page + .refresh() + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Should still be on planner or tasks + .assert.urlMatches(/\/(planner|tasks)/), + + 'should confirm no errors in console': (browser: NBrowser) => browser.noError(), +}; diff --git a/e2e/src/planner/planner-scheduled-tasks.e2e.ts b/e2e/src/planner/planner-scheduled-tasks.e2e.ts new file mode 100644 index 0000000000..a9c6aba546 --- /dev/null +++ b/e2e/src/planner/planner-scheduled-tasks.e2e.ts @@ -0,0 +1,43 @@ +import { NBrowser } from '../../n-browser-interface'; +import { BASE } from '../../e2e.const'; + +const PLANNER_URL = `${BASE}/#/tag/TODAY/planner`; +const TASK = 'task'; +const SCHEDULE_BTN = '.schedule-btn'; +const TIME_PICKER = 'input[type="time"]'; +const CONFIRM_BTN = 'mat-dialog-actions button:last-of-type'; + +module.exports = { + '@tags': ['planner', 'planner-scheduled'], + + before: (browser: NBrowser) => browser.loadAppAndClickAwayWelcomeDialog(), + + after: (browser: NBrowser) => browser.end(), + + 'should add scheduled task': (browser: NBrowser) => + browser + // Add task + .addTask('Meeting at 2pm') + .waitForElementVisible(TASK) + // Open schedule dialog + .moveToElement(TASK, 10, 10) + .waitForElementVisible(`${TASK} ${SCHEDULE_BTN}`) + .click(`${TASK} ${SCHEDULE_BTN}`) + // Set time + .waitForElementVisible(TIME_PICKER) + .clearValue(TIME_PICKER) + .setValue(TIME_PICKER, '14:00') + .click(CONFIRM_BTN) + .pause(500), + + 'should navigate to planner with scheduled tasks': (browser: NBrowser) => + browser + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Verify we're on planner or tasks page + .assert.urlMatches(/\/(planner|tasks)/), + + 'should confirm no errors in console': (browser: NBrowser) => browser.noError(), +}; diff --git a/e2e/src/planner/planner-time-estimates.e2e.ts b/e2e/src/planner/planner-time-estimates.e2e.ts new file mode 100644 index 0000000000..707bbaee86 --- /dev/null +++ b/e2e/src/planner/planner-time-estimates.e2e.ts @@ -0,0 +1,42 @@ +import { NBrowser } from '../../n-browser-interface'; +import { BASE } from '../../e2e.const'; + +const PLANNER_URL = `${BASE}/#/tag/TODAY/planner`; +const TASK_WITH_TIME = 'task'; +const TIME_ESTIMATE_BTN = '.time-estimate-btn'; +const TIME_INPUT = 'input[type="text"][placeholder*="2h 30m"]'; + +module.exports = { + '@tags': ['planner', 'planner-time-estimates'], + + before: (browser: NBrowser) => browser.loadAppAndClickAwayWelcomeDialog(), + + after: (browser: NBrowser) => browser.end(), + + 'should add task with time estimate': (browser: NBrowser) => + browser + // Add task + .addTask('Task with time estimate') + .waitForElementVisible(TASK_WITH_TIME) + // Click time estimate button + .moveToElement(TASK_WITH_TIME, 10, 10) + .waitForElementVisible(`${TASK_WITH_TIME} ${TIME_ESTIMATE_BTN}`) + .click(`${TASK_WITH_TIME} ${TIME_ESTIMATE_BTN}`) + // Enter time estimate + .waitForElementVisible(TIME_INPUT) + .clearValue(TIME_INPUT) + .setValue(TIME_INPUT, '2h') + .sendKeys(TIME_INPUT, browser.Keys.ENTER) + .pause(500), + + 'should navigate to planner with time estimates': (browser: NBrowser) => + browser + // Navigate to planner + .url(PLANNER_URL) + .pause(1000) + .waitForElementVisible('.route-wrapper') + // Verify we're on planner or tasks page + .assert.urlMatches(/\/(planner|tasks)/), + + 'should confirm no errors in console': (browser: NBrowser) => browser.noError(), +};