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
  • Loading branch information
Dave Connis committed Nov 8, 2017
1 parent 3364a56 commit 6116285
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 6 deletions.
8 changes: 7 additions & 1 deletion app/services/project-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,17 @@ 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);
},

_flashError(message) {
let options = { fixed: true, sticky: false, timeout: 5000 };
get(this, 'flashMessages').clearMessages().danger(message, options);
}
});
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 6116285

Please sign in to comment.