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
This commit is contained in:
Johannes Millan 2025-06-15 18:08:58 +02:00
parent cde93f2667
commit 48a1cb1fab
6 changed files with 265 additions and 0 deletions

View file

@ -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(),
};

View file

@ -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(),
};

View file

@ -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(),
};

View file

@ -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(),
};

View file

@ -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(),
};

View file

@ -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(),
};