diff --git a/frontend/e2e/todo.spec.js b/frontend/e2e/todo.spec.js index 5056369..ec934e7 100644 --- a/frontend/e2e/todo.spec.js +++ b/frontend/e2e/todo.spec.js @@ -27,7 +27,13 @@ test.describe('Todo plugin workflow', () => { await todos.locator('[data-todo-input="description"]').fill('Collect factual review notes.'); await todos.locator('[data-todo-input="priority"]').selectOption('high'); await todos.locator('[data-todo-input="dueAt"]').fill('2000-01-01'); - await todos.locator('[data-todo-input="reminderAt"]').fill('2000-01-01T09:00'); + await todos.locator('[data-todo-input="reminderDate"]').fill('2000-01-01'); + const reminderHour = todos.locator('[data-todo-input="reminderHour"]'); + const reminderMinute = todos.locator('[data-todo-input="reminderMinute"]'); + await expect(reminderHour).toHaveCSS('appearance', 'none'); + await expect(reminderMinute).toHaveCSS('appearance', 'none'); + await reminderHour.selectOption('09'); + await reminderMinute.selectOption('30'); await todos.locator('[data-todo-action="save"]').click(); await expect(todos).toContainText('Overdue'); @@ -37,7 +43,7 @@ test.describe('Todo plugin workflow', () => { const settings = Array.isArray(result) ? result[0] : result; const todo = settings['todos:global'].find((item) => item.title === 'Prepare project review'); return todo && [todo.workspaceRootPath, todo.priority, todo.dueAt, todo.reminderAt].join('|'); - })).toBe('Project|high|2000-01-01|2000-01-01T09:00'); + })).toBe('Project|high|2000-01-01|2000-01-01T09:30'); await todos.locator('[data-todo-action="edit"]').click(); await todos.locator('[data-todo-input="title"]').fill('Prepare project review updated'); diff --git a/frontend/e2e/workspace-templates.spec.js b/frontend/e2e/workspace-templates.spec.js index 7b15469..c298f6b 100644 --- a/frontend/e2e/workspace-templates.spec.js +++ b/frontend/e2e/workspace-templates.spec.js @@ -24,7 +24,9 @@ test.describe('Workspace templates', () => { test('creation modal validates names, shows template tools, and persists the selected snapshot', async ({ page }) => { const modal = await openCreateModal(page); - await expect(modal.locator('[data-workspace-template]')).toHaveValue('default'); + const templateSelect = modal.locator('[data-workspace-template]'); + await expect(templateSelect).toHaveValue('default'); + await expect(templateSelect).toHaveCSS('appearance', 'none'); await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Notes'); await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Browser Inbox'); diff --git a/frontend/src/lib/test/wails-mock.js b/frontend/src/lib/test/wails-mock.js index 4c35022..a59cf5e 100644 --- a/frontend/src/lib/test/wails-mock.js +++ b/frontend/src/lib/test/wails-mock.js @@ -7,6 +7,7 @@ import defaultEditorSource from '../../../../../verstak-official-plugins/plugins/default-editor/frontend/src/index.js?raw'; import secretsSource from '../../../../../verstak-official-plugins/plugins/secrets/frontend/src/index.js?raw'; import activitySource from '../../../../../verstak-official-plugins/plugins/activity/frontend/src/index.js?raw'; +import todoSource from '../../../../../verstak-official-plugins/plugins/todo/frontend/src/index.js?raw'; (function () { if (window.__wailsMockReady) return; @@ -363,6 +364,7 @@ import activitySource from '../../../../../verstak-official-plugins/plugins/acti var pluginSettings = { 'verstak.platform-test': { savedText: 'initial value' } }; + var pluginNotifications = {}; var pluginData = {}; var secretRecords = makeDefaultSecretRecords(); var vaultFiles = makeDefaultVaultFiles(); @@ -571,7 +573,8 @@ import activitySource from '../../../../../verstak-official-plugins/plugins/acti source: 'official', icon: 'list-todo', provides: ['todo.list', 'todo.workspace'], - permissions: ['files.read', 'storage.namespace', 'ui.register'], + requires: ['verstak/core/notifications/v1'], + permissions: ['files.read', 'storage.namespace', 'ui.register', 'notifications.schedule'], frontend: { entry: 'frontend/dist/index.js' }, contributes: { views: [{ id: 'verstak.todo.view', title: 'Todos', icon: 'list-todo', component: 'TodoView' }], @@ -3405,8 +3408,22 @@ import activitySource from '../../../../../verstak-official-plugins/plugins/acti pluginSettings[pluginId] = Object.assign({}, settings || {}); return Promise.resolve(''); }, - ReadPluginSetting: function () { return Promise.resolve(null); }, - WritePluginSetting: function () { return Promise.resolve(null); }, + ReadPluginSetting: function (pluginId, key) { + return Promise.resolve([pluginSettings[pluginId] && pluginSettings[pluginId][key], '']); + }, + WritePluginSetting: function (pluginId, key, value) { + pluginSettings[pluginId] = pluginSettings[pluginId] || {}; + pluginSettings[pluginId][key] = value; + return Promise.resolve(''); + }, + ReplacePluginNotifications: function (pluginId, items) { + pluginNotifications[pluginId] = Array.isArray(items) ? items.slice() : []; + return Promise.resolve(''); + }, + ClearPluginNotifications: function (pluginId) { + delete pluginNotifications[pluginId]; + return Promise.resolve(''); + }, ReadPluginDataJSON: function (pluginId, name) { var data = (pluginData[pluginId] && pluginData[pluginId][name]) || {}; return Promise.resolve([Object.assign({}, data), '']); @@ -3547,7 +3564,7 @@ import activitySource from '../../../../../verstak-official-plugins/plugins/acti return Promise.resolve(browserInboxBundle()); } if (pluginId === 'verstak.todo' && assetPath === 'frontend/dist/index.js') { - return Promise.resolve(todoBundle()); + return Promise.resolve(todoSource); } if (pluginId === 'verstak.secrets') { return Promise.resolve(secretsSource); @@ -4234,6 +4251,7 @@ import activitySource from '../../../../../verstak-official-plugins/plugins/acti workbenchPreferences = {}; openedResources = []; pluginSettings = { 'verstak.platform-test': { savedText: 'initial value' } }; + pluginNotifications = {}; secretRecords = makeDefaultSecretRecords(); vaultFiles = makeDefaultVaultFiles(); externalOpens = [];