diff --git a/app/services/project-user.js b/app/services/project-user.js index f92509b47..d4dbd94b9 100644 --- a/app/services/project-user.js +++ b/app/services/project-user.js @@ -6,6 +6,8 @@ export default Service.extend({ flashMessages: service(), store: service(), + flashOptions: { fixed: true, sticky: false, timeout: 5000 }, + joinProject(project) { let user = get(this, 'currentUser.user'); let store = get(this, 'store'); @@ -14,11 +16,15 @@ export default Service.extend({ return store.createRecord('project-user', projectUser) .save() - .then(() => this._flashSuccess('Your request has been sent.')); + .then(() => this._flashSuccess('Your request has been sent.')) + .catch(() => this._flashError('Your request has not been sent.')); }, _flashSuccess(message) { - let options = { fixed: true, sticky: false, timeout: 5000 }; - get(this, 'flashMessages').clearMessages().success(message, options); + get(this, 'flashMessages').clearMessages().success(message, get(this, 'flashOptions')); + }, + + _flashError(message) { + get(this, 'flashMessages').clearMessages().danger(message, get(this, 'flashOptions')); } }); diff --git a/tests/unit/services/project-user-test.js b/tests/unit/services/project-user-test.js index 97e986abe..382781d1b 100644 --- a/tests/unit/services/project-user-test.js +++ b/tests/unit/services/project-user-test.js @@ -1,15 +1,91 @@ +import RSVP from 'rsvp'; +import { set } from '@ember/object'; import { moduleFor, test } from 'ember-qunit'; moduleFor('service:project-user', 'Unit | Service | project user', { - // Specify the other units that are required for this test. needs: [ 'service:current-user', - 'service:flash-messages' + 'service:flash-messages', + 'service:session', + 'service:metrics' ] }); -// Replace this with your real tests. -test('it exists', function(assert) { +test('it creates a new projectUser with properties', function(assert) { + assert.expect(3); + let done = assert.async(); let service = this.subject(); - assert.ok(service); + let user = { id: 1 }; + let project = { title: 'Code Corps' }; + let projectUser = { project, user, role: 'pending' }; + + let mockCurrentUser = { user }; + + let mockStore = { + createRecord(modelName, inputProperties) { + return { + save() { + assert.equal(modelName, 'project-user'); + assert.deepEqual(inputProperties, projectUser); + return RSVP.resolve(projectUser); + } + }; + } + }; + + // test doesn't care what the message is, just that it was called + // need to support function chaining because actual flash-messages + // service does function chaining and our component calls to clear all messages first + // so the fake needs to support that. + + let mockFlashMessage = { + success() { + assert.ok(true); + return this; + }, + clearMessages() { + return this; + } + }; + + set(service, 'currentUser', mockCurrentUser); + set(service, 'flashMessages', mockFlashMessage); + set(service, 'store', mockStore); + + service.joinProject(project).then(() => { + done(); + }); +}); + +test('it sends an error flash message if joinProject fails', function(assert) { + assert.expect(1); + let service = this.subject(); + let done = assert.async(); + + let mockStore = { + createRecord() { + return { + save() { + return RSVP.reject(); + } + }; + } + }; + + let mockFlashMessage = { + danger() { + assert.ok(true); + return this; + }, + clearMessages() { + return this; + } + }; + + set(service, 'flashMessages', mockFlashMessage); + set(service, 'store', mockStore); + + service.joinProject().then(() => { + done(); + }); });