diaspora/spec/javascripts/app/views/contact_view_spec.js
2015-10-10 12:34:59 +02:00

160 lines
5.8 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.view.$el.append($("<div id='flash-container'/>"));
app.flashMessages = new app.views.FlashMessages({ el: this.view.$("#flash-container") });
this.button = this.view.$el.find(".contact_add-to-aspect");
this.contact = this.view.$el.find(".stream_element.contact");
this.aspectMembership = {id: 42, aspect: app.aspect.toJSON()};
this.response = JSON.stringify(this.aspectMembership);
});
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.aspectMemberships.length).toBe(1);
$(".contact_add-to-aspect",this.contact).trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, // success
responseText: this.response
});
expect(this.model.aspectMemberships.length).toBe(2);
});
it("triggers aspect_membership:create", function() {
spyOn(app.events, "trigger");
$(".contact_add-to-aspect", this.contact).trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, // success
responseText: this.response
});
expect(app.events.trigger).toHaveBeenCalledWith("aspect_membership:create", {
membership: {aspectId: app.aspect.get("id"), personId: this.model.get("person_id")},
startSharing: false
});
});
it("calls render", function() {
spyOn(this.view, "render");
$(".contact_add-to-aspect",this.contact).trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith({
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().respondWith({
status: 400 // fail
});
expect(this.view.$(".flash-message")).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.view.$el.append($("<div id='flash-container'/>"));
app.flashMessages = new app.views.FlashMessages({ el: this.view.$("#flash-container") });
this.button = this.view.$el.find(".contact_remove-from-aspect");
this.contact = this.view.$el.find(".stream_element.contact");
this.aspectMembership = this.model.aspectMemberships.first().toJSON();
this.response = JSON.stringify(this.aspectMembership);
});
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.aspectMembership.id
);
});
it("removes the aspect_membership from the contact", function() {
expect(this.model.aspectMemberships.length).toBe(1);
$(".contact_remove-from-aspect",this.contact).trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, // success
responseText: this.response
});
expect(this.model.aspectMemberships.length).toBe(0);
});
it("triggers aspect_membership:destroy", function() {
spyOn(app.events, "trigger");
$(".contact_remove-from-aspect", this.contact).trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, // success
responseText: this.response
});
expect(app.events.trigger).toHaveBeenCalledWith("aspect_membership:destroy", {
membership: {aspectId: app.aspect.get("id"), personId: this.model.get("person_id")},
stopSharing: true
});
});
it("calls render", function() {
spyOn(this.view, "render");
$(".contact_remove-from-aspect",this.contact).trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith({
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().respondWith({
status: 400 // fail
});
expect(this.view.$(".flash-message")).toBeErrorFlashMessage(
Diaspora.I18n.t( "contacts.error_remove", {name: this.model.get("person").name})
);
});
});
});