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/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() { 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) +})