Skip to content

Commit

Permalink
Wrote out unit testing and also added expanded component/project-user…
Browse files Browse the repository at this point in the history
… to include error message when projectJoin fails

added flashOptions object to clear up code
  • Loading branch information
Dave Connis authored and joshsmith committed Nov 9, 2017
1 parent 3364a56 commit 3244660
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 8 deletions.
12 changes: 9 additions & 3 deletions app/services/project-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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'));
}
});
86 changes: 81 additions & 5 deletions tests/unit/services/project-user-test.js
Original file line number Diff line number Diff line change
@@ -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();
});
});

0 comments on commit 3244660

Please sign in to comment.