diaspora/spec/javascripts/app/views/aspect_membership_view_spec.js
cmrd Senya 923fb8a763
Refactor app.views.AspectMembership
in order to support adding new aspect to a dropdown without full
page reload
2016-08-08 17:21:14 +03:00

108 lines
4 KiB
JavaScript

describe("app.views.AspectMembership", function(){
var success = {status: 200, responseText: "{}"};
var resp_fail = {status: 400};
beforeEach(function() {
var contact = factory.contact();
this.person = contact.person;
this.personName = this.person.get("name");
var aspectAttrs = contact.aspectMemberships.at(0).get("aspect");
app.aspects = new app.collections.Aspects([factory.aspect(aspectAttrs), factory.aspect()]);
this.view = new app.views.AspectMembership({person: this.person});
this.view.render();
spec.content().append($("<div id='flash-container'/>"));
app.flashMessages = new app.views.FlashMessages({el: spec.content().find("#flash-container")});
});
context('adding to aspects', function() {
beforeEach(function() {
this.newAspect = this.view.$("li:not(.selected)");
this.newAspectId = this.newAspect.data('aspect_id');
});
it('marks the aspect as selected', function() {
this.newAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
responseText: JSON.stringify({
id: factory.id.next(),
aspect: app.aspects.at(1).attributes
})
});
expect(this.view.$("li[data-aspect_id=" + this.newAspectId + "]").attr("class")).toContain("selected");
});
it('displays flash message when added to first aspect', function() {
this.view.$("li").removeClass("selected");
this.newAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(success);
expect(spec.content().find(".flash-message")).toBeSuccessFlashMessage(
Diaspora.I18n.t("aspect_dropdown.started_sharing_with", {name: this.personName})
);
});
it("triggers aspect_membership:create", function() {
spyOn(app.events, "trigger");
this.view.$("li").removeClass("selected");
this.newAspect.trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith(success);
expect(app.events.trigger).toHaveBeenCalledWith("aspect_membership:create", {
membership: {aspectId: this.newAspectId, personId: this.person.id},
startSharing: true
});
});
it('displays an error when it fails', function() {
this.newAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(resp_fail);
expect(spec.content().find(".flash-message")).toBeErrorFlashMessage(
Diaspora.I18n.t("aspect_dropdown.error", {name: this.personName})
);
});
});
context('removing from aspects', function(){
beforeEach(function() {
this.oldAspect = this.view.$("li.selected").first();
this.oldAspectId = this.oldAspect.data("aspect_id");
});
it('marks the aspect as unselected', function(){
this.oldAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(success);
expect(this.view.$("li[data-aspect_id=" + this.oldAspectId + "]").attr("class")).not.toContain("selected");
});
it('displays a flash message when removed from last aspect', function() {
this.oldAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(success);
expect(spec.content().find(".flash-message")).toBeSuccessFlashMessage(
Diaspora.I18n.t("aspect_dropdown.stopped_sharing_with", {name: this.personName})
);
});
it("triggers aspect_membership:destroy", function() {
spyOn(app.events, "trigger");
this.oldAspect.trigger("click");
jasmine.Ajax.requests.mostRecent().respondWith(success);
expect(app.events.trigger).toHaveBeenCalledWith("aspect_membership:destroy", {
membership: {aspectId: this.oldAspectId, personId: this.person.id},
stopSharing: true
});
});
it('displays an error when it fails', function() {
this.oldAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(resp_fail);
expect(spec.content().find(".flash-message")).toBeErrorFlashMessage(
Diaspora.I18n.t("aspect_dropdown.error_remove", {name: this.personName})
);
});
});
});