From 59cc94cf2d5d5465005623c4b5b2fc72404295ae Mon Sep 17 00:00:00 2001 From: Denys Kuchma Date: Mon, 2 Nov 2026 20:17:17 +0100 Subject: [PATCH 1/2] Add delete todos test suite --- todomvc-tests/README.md | 3 +- todomvc-tests/delete-todos_test.js | 56 +++++++++++++++++++ .../step-definitions/delete-todos.steps.js | 16 ++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 todomvc-tests/delete-todos_test.js create mode 100644 todomvc-tests/step-definitions/delete-todos.steps.js diff --git a/todomvc-tests/README.md b/todomvc-tests/README.md index 6a2c6de..ddbf225 100644 --- a/todomvc-tests/README.md +++ b/todomvc-tests/README.md @@ -1,4 +1,5 @@ # Testing "Create TODOs" using page objects - Create single todo -- Create multiple todos \ No newline at end of file +- Create multiple todos +- Delete a todo and keep the order of the rest diff --git a/todomvc-tests/delete-todos_test.js b/todomvc-tests/delete-todos_test.js new file mode 100644 index 0000000..3ba4034 --- /dev/null +++ b/todomvc-tests/delete-todos_test.js @@ -0,0 +1,56 @@ +const { I, TodosPage } = inject(); + +Feature('@first Delete Todos @step:11 @smoke') + +Before(async () => { + TodosPage.goto() +}); + +/** + * Happy Path tests + */ +Scenario('Delete a single todo item', async () => { + I.say('Given I have one todo "foo"') + TodosPage.enterTodo('foo') + + I.say('When I delete the first todo') + TodosPage.deleteNthTodo(1) + + I.say('Then I have no todos left on my list') + TodosPage.seeNumberOfTodos(0) + I.saveScreenshot('delete-single-todo.png') +}); + +Scenario('Delete one of multiple todos keeps the others in order', async () => { + I.say('Given I have todos "foo", "bar" and "baz"') + TodosPage.enterTodo('foo') + TodosPage.enterTodo('bar') + TodosPage.enterTodo('baz') + + I.say('When I delete the second todo') + TodosPage.deleteNthTodo(2) + + I.say('Then "bar" is gone and the order of the rest is kept') + TodosPage.seeNumberOfTodos(2) + TodosPage.seeNthTodoEquals(1, 'foo') + TodosPage.seeNthTodoEquals(2, 'baz') + I.saveScreenshot('delete-middle-todo.png') +}); + +/** + * Edge cases + */ +Scenario('Delete todos one by one until the list is empty', async () => { + I.say('Given I have todos "foo" and "bar"') + TodosPage.enterTodo('foo') + TodosPage.enterTodo('bar') + + I.say('When I delete the first todo twice') + TodosPage.deleteNthTodo(1) + TodosPage.deleteNthTodo(1) + + I.say('Then the todo list is empty and the footer count is gone') + TodosPage.seeNumberOfTodos(0) + I.dontSee('items left') + I.saveScreenshot('delete-all-todos.png') +}); diff --git a/todomvc-tests/step-definitions/delete-todos.steps.js b/todomvc-tests/step-definitions/delete-todos.steps.js new file mode 100644 index 0000000..e57e688 --- /dev/null +++ b/todomvc-tests/step-definitions/delete-todos.steps.js @@ -0,0 +1,16 @@ +const { I, TodosPage } = inject(); + +Given(/I have todos "([^"]*)" and "([^"]*)"/, (first, second) => { + TodosPage.goto() + TodosPage.enterTodo(first) + TodosPage.enterTodo(second) +}) + +When(/I delete the (\w+) todo/, (position) => { + const nth = { first: 1, second: 2, third: 3 }[position] + TodosPage.deleteNthTodo(nth) +}) + +Then('I have no todos left on my list', () => { + TodosPage.seeNumberOfTodos(0) +}) From 3ee2d47dca6bb658a6007e299cca504dfec28f58 Mon Sep 17 00:00:00 2001 From: Denys Kuchma Date: Mon, 2 Nov 2026 20:29:29 +0100 Subject: [PATCH 2/2] Fix unclosed selector in markAllAsCompleted --- todomvc-tests/pages/todos.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/todomvc-tests/pages/todos.page.js b/todomvc-tests/pages/todos.page.js index ce81f8e..fe22219 100644 --- a/todomvc-tests/pages/todos.page.js +++ b/todomvc-tests/pages/todos.page.js @@ -46,7 +46,7 @@ module.exports = { }, markAllAsCompleted() { - I.click('label[for="toggle-all"') + I.click('label[for="toggle-all"]') }, clearCompleted() {