From 7ff25fc9b3cb608b77acc3097a8ab028a4d6de0b Mon Sep 17 00:00:00 2001 From: Nikola Begedin Date: Mon, 30 Jan 2017 18:47:04 +0100 Subject: [PATCH] Added prompt on navigating away from task creation - destroys new record if confirmed - aborts transition if not confirmed --- app/routes/project/tasks/new.js | 14 ++++++ tests/acceptance/task-creation-test.js | 68 ++++++++++++++++++++++++++ tests/pages/components/task-board.js | 8 ++- tests/pages/project/tasks/index.js | 9 ++-- tests/pages/project/tasks/new.js | 15 +++--- 5 files changed, 104 insertions(+), 10 deletions(-) diff --git a/app/routes/project/tasks/new.js b/app/routes/project/tasks/new.js index dfef7b7ec..3800b6451 100644 --- a/app/routes/project/tasks/new.js +++ b/app/routes/project/tasks/new.js @@ -52,6 +52,20 @@ export default Route.extend(AuthenticatedRouteMixin, { this.controllerFor('project.tasks.new').set('error', error); } }); + }, + + willTransition(transition) { + let task = get(this, 'controller.task'); + + // prompt to confirm if the user did not save + if (get(task, ('isNew'))) { + let confirmed = window.confirm('You will lose any unsaved information if you leave this page. Are you sure?'); + if (confirmed) { + task.destroyRecord(); + } else { + transition.abort(); + } + } } } }); diff --git a/tests/acceptance/task-creation-test.js b/tests/acceptance/task-creation-test.js index 6317b5c95..4bf1e734c 100644 --- a/tests/acceptance/task-creation-test.js +++ b/tests/acceptance/task-creation-test.js @@ -6,6 +6,7 @@ import Mirage from 'ember-cli-mirage'; import loginPage from '../pages/login'; import projectTasksIndexPage from '../pages/project/tasks/index'; import projectTasksNewPage from '../pages/project/tasks/new'; +import sinon from 'sinon'; moduleForAcceptance('Acceptance | Task Creation'); @@ -228,3 +229,70 @@ test('When task creation fails due to non-validation issues, the error is displa assert.equal(projectTasksNewPage.errors().contains('An unknown error: Something happened', 'The error is messaged'), true); }); }); + +test('Navigating away from task route destroys task with prompt', function(assert) { + assert.expect(3); + + let user = server.schema.users.create({ username: 'test_user' }); + + let project = createProjectWithSluggedRoute(); + let { organization } = project; + project.createTaskList({ inbox: true }); + + authenticateSession(this.application, { user_id: user.id }); + projectTasksIndexPage.visit({ organization: organization.slug, project: project.slug }); + + andThen(() => { + projectTasksIndexPage.clickNewTask(); + }); + + let stub = sinon.stub(window, 'confirm', () => { + assert.ok(true, 'Confirmation prompt was called.'); + return true; + }); + + andThen(() => { + projectTasksNewPage.projectMenu.tasksLink.click(); + }); + + andThen(() => { + assert.equal( + projectTasksIndexPage.taskBoard.taskLists(0).taskCards().count, + 0, + 'The task was removed from the list.' + ); + assert.equal(currentRouteName(), 'project.tasks.index', 'Navigation was successful.'); + stub.restore(); + }); +}); + +test('Navigation is aborted if user answers negatively to prompt', function(assert) { + assert.expect(2); + + let user = server.schema.users.create({ username: 'test_user' }); + + let project = createProjectWithSluggedRoute(); + let { organization } = project; + project.createTaskList({ inbox: true }); + + authenticateSession(this.application, { user_id: user.id }); + projectTasksIndexPage.visit({ organization: organization.slug, project: project.slug }); + + andThen(() => { + projectTasksIndexPage.clickNewTask(); + }); + + let stub = sinon.stub(window, 'confirm', () => { + assert.ok(true, 'Confirmation prompt was called.'); + return false; + }); + + andThen(() => { + projectTasksNewPage.projectMenu.tasksLink.click(); + }); + + andThen(() => { + assert.equal(currentRouteName(), 'project.tasks.new', 'Navigation was aborted.'); + stub.restore(); + }); +}); diff --git a/tests/pages/components/task-board.js b/tests/pages/components/task-board.js index 49566490e..1983b51ec 100644 --- a/tests/pages/components/task-board.js +++ b/tests/pages/components/task-board.js @@ -1,3 +1,9 @@ +import { collection } from 'ember-cli-page-object'; +import taskListCards from 'code-corps-ember/tests/pages/components/task-list-cards'; + export default { - scope: '.task-board' + scope: '.task-board', + taskLists: collection({ + item: taskListCards + }) }; diff --git a/tests/pages/project/tasks/index.js b/tests/pages/project/tasks/index.js index 295f74ce6..ea6c96162 100644 --- a/tests/pages/project/tasks/index.js +++ b/tests/pages/project/tasks/index.js @@ -3,8 +3,9 @@ import { create, visitable } from 'ember-cli-page-object'; -import projectDetails from '../../components/project-details'; -import projectMenu from '../../components/project-menu'; +import projectDetails from 'code-corps-ember/tests/pages/components/project-details'; +import projectMenu from 'code-corps-ember/tests/pages/components/project-menu'; +import taskBoard from 'code-corps-ember/tests/pages/components/task-board'; export default create({ visit: visitable(':organization/:project/tasks'), @@ -22,7 +23,9 @@ export default create({ }, clickNewTask: clickable('.new-task'), + clickCancel: clickable('.cancel'), projectDetails, - projectMenu + projectMenu, + taskBoard }); diff --git a/tests/pages/project/tasks/new.js b/tests/pages/project/tasks/new.js index fe7bd71df..1c9141c09 100644 --- a/tests/pages/project/tasks/new.js +++ b/tests/pages/project/tasks/new.js @@ -6,22 +6,25 @@ import { visitable } from 'ember-cli-page-object'; -export default create({ - visit: visitable(':organization/:project/tasks/new'), +import projectMenu from 'code-corps-ember/tests/pages/components/project-menu'; +export default create({ clickPreviewTask: clickable('.preview'), + clickSubmit: clickable('[name=submit]'), + + errors: collection({ + scope: '.error' + }), taskTitle: fillable('[name=title]'), taskMarkdown: fillable('[name=markdown]'), taskType: fillable('[name=task-type]'), - clickSubmit: clickable('[name=submit]'), + projectMenu, previewBody: { scope: '.body-preview' }, - errors: collection({ - scope: '.error' - }) + visit: visitable(':organization/:project/tasks/new') });