diaspora/spec/javascripts/app/views/contact_view_spec.js
2015-01-04 17:13:18 +01:00

136 lines
4.6 KiB
JavaScript

describe("app.views.Contact", function(){
beforeEach(function() {
this.aspect1 = factory.aspect({id: 1});
this.aspect2 = factory.aspect({id: 2});
this.model = new app.models.Contact({
person_id: 42,
person: { id: 42, name: 'alice' },
aspect_memberships: [{id: 23, aspect: this.aspect1}]
});
this.view = new app.views.Contact({ model: this.model });
Diaspora.I18n.load({
contacts: {
add_contact: "Add contact",
remove_contact: "Remove contact",
error_add: "Couldn't add <%= name %> to the aspect :(",
error_remove: "Couldn't remove <%= name %> from the aspect :("
}
});
});
context("#presenter", function() {
it("contains necessary elements", function() {
app.aspect = this.aspect1;
expect(this.view.presenter()).toEqual(jasmine.objectContaining({
person_id: 42,
person: jasmine.objectContaining({id: 42, name: 'alice'}),
in_aspect: 'in_aspect'
}));
});
});
context('add contact to aspect', function() {
beforeEach(function() {
app.aspect = this.aspect2;
this.view.render();
this.button = this.view.$el.find('.contact_add-to-aspect');
this.contact = this.view.$el.find('.stream_element.contact');
this.aspect_membership = {id: 42, aspect: app.aspect.toJSON()};
this.response = JSON.stringify(this.aspect_membership);
});
it('sends a correct ajax request', function() {
this.button.trigger('click');
var obj = $.parseJSON(jasmine.Ajax.requests.mostRecent().params);
expect(obj.person_id).toBe(this.model.get('person_id'));
expect(obj.aspect_id).toBe(app.aspect.get('id'));
});
it('adds a aspect_membership to the contact', function() {
expect(this.model.aspect_memberships.length).toBe(1);
$('.contact_add-to-aspect',this.contact).trigger('click');
jasmine.Ajax.requests.mostRecent().response({
status: 200, // success
responseText: this.response
});
expect(this.model.aspect_memberships.length).toBe(2);
});
it('calls render', function() {
spyOn(this.view, 'render');
$('.contact_add-to-aspect',this.contact).trigger('click');
jasmine.Ajax.requests.mostRecent().response({
status: 200, // success
responseText: this.response
});
expect(this.view.render).toHaveBeenCalled();
});
it('displays a flash message on errors', function(){
$('.contact_add-to-aspect',this.contact).trigger('click');
jasmine.Ajax.requests.mostRecent().response({
status: 400, // fail
});
expect($('[id^="flash"]')).toBeErrorFlashMessage(
Diaspora.I18n.t(
'contacts.error_add',
{name: this.model.get('person').name}
)
);
});
});
context('remove contact from aspect', function() {
beforeEach(function() {
app.aspect = this.aspect1;
this.view.render();
this.button = this.view.$el.find('.contact_remove-from-aspect');
this.contact = this.view.$el.find('.stream_element.contact');
this.aspect_membership = this.model.aspect_memberships.first().toJSON();
this.response = JSON.stringify(this.aspect_membership);
});
it('sends a correct ajax request', function() {
$('.contact_remove-from-aspect',this.contact).trigger('click');
expect(jasmine.Ajax.requests.mostRecent().url).toBe(
"/aspect_memberships/"+this.aspect_membership.id
);
});
it('removes the aspect_membership from the contact', function() {
expect(this.model.aspect_memberships.length).toBe(1);
$('.contact_remove-from-aspect',this.contact).trigger('click');
jasmine.Ajax.requests.mostRecent().response({
status: 200, // success
responseText: this.response
});
expect(this.model.aspect_memberships.length).toBe(0);
});
it('calls render', function() {
spyOn(this.view, 'render');
$('.contact_remove-from-aspect',this.contact).trigger('click');
jasmine.Ajax.requests.mostRecent().response({
status: 200, // success
responseText: this.response,
});
expect(this.view.render).toHaveBeenCalled();
});
it('displays a flash message on errors', function(){
$('.contact_remove-from-aspect',this.contact).trigger('click');
jasmine.Ajax.requests.mostRecent().response({
status: 400, // fail
});
expect($('[id^="flash"]')).toBeErrorFlashMessage(
Diaspora.I18n.t(
'contacts.error_remove',
{name: this.model.get('person').name}
)
);
});
});
});