describe("app.views.AspectMembership", function(){
beforeEach(function() {
// mock a dummy aspect dropdown
this.person = factory.author({name: "My Name"});
spec.content().html(
'
'+
'
The Button
'+
'
'+
' - Aspect 10
'+
' - Aspect 11
'+
' - Aspect 12
'+
'
'+
'
'
);
this.view = new app.views.AspectMembership();
});
it('attaches to the aspect selector', function(){
spyOn($.fn, 'on');
view = new app.views.AspectMembership();
expect($.fn.on).toHaveBeenCalled();
});
context('adding to aspects', function() {
beforeEach(function() {
this.newAspect = spec.content().find('li:eq(0)');
this.newAspectId = 10;
});
it('calls "addMembership"', function() {
spyOn(this.view, "addMembership");
this.newAspect.trigger('click');
expect(this.view.addMembership).toHaveBeenCalledWith(this.person.id, this.newAspectId);
});
it('tries to create a new AspectMembership', function() {
spyOn(app.models.AspectMembership.prototype, "save");
this.view.addMembership(1, 2);
expect(app.models.AspectMembership.prototype.save).toHaveBeenCalled();
});
it('displays an error when it fails', function() {
spyOn(this.view, "_displayError");
spyOn(app.models.AspectMembership.prototype, "save").andCallFake(function() {
this.trigger('error');
});
this.view.addMembership(1, 2);
expect(this.view._displayError).toHaveBeenCalledWith('aspect_dropdown.error');
});
});
context('removing from aspects', function(){
beforeEach(function() {
this.oldAspect = spec.content().find('li:eq(1)');
this.oldMembershipId = 99;
});
it('calls "removeMembership"', function(){
spyOn(this.view, "removeMembership");
this.oldAspect.trigger('click');
expect(this.view.removeMembership).toHaveBeenCalledWith(this.oldMembershipId);
});
it('tries to destroy an AspectMembership', function() {
spyOn(app.models.AspectMembership.prototype, "destroy");
this.view.removeMembership(1);
expect(app.models.AspectMembership.prototype.destroy).toHaveBeenCalled();
});
it('displays an error when it fails', function() {
spyOn(this.view, "_displayError");
spyOn(app.models.AspectMembership.prototype, "destroy").andCallFake(function() {
this.trigger('error');
});
this.view.removeMembership(1);
expect(this.view._displayError).toHaveBeenCalledWith('aspect_dropdown.error_remove');
});
});
context('summary text in the button', function() {
beforeEach(function() {
this.btn = spec.content().find('div.button.toggle');
this.btn.text(""); // reset
this.view.dropdown = spec.content().find('ul.dropdown_list');
});
it('shows "no aspects" when nothing is selected', function() {
spec.content().find('li[data-aspect_id]').removeClass('selected');
this.view.updateSummary();
expect(this.btn.text()).toContain(Diaspora.I18n.t('aspect_dropdown.toggle.zero'));
});
it('shows "all aspects" when everything is selected', function() {
spec.content().find('li[data-aspect_id]').addClass('selected');
this.view.updateSummary();
expect(this.btn.text()).toContain(Diaspora.I18n.t('aspect_dropdown.all_aspects'));
});
it('shows the name of the selected aspect ( == 1 )', function() {
var list = spec.content().find('li[data-aspect_id]');
list.removeClass('selected'); // reset
list.eq(1).addClass('selected');
this.view.updateSummary();
expect(this.btn.text()).toContain(list.eq(1).text());
});
it('shows the number of selected aspects ( > 1)', function() {
var list = spec.content().find('li[data-aspect_id]');
list.removeClass('selected'); // reset
$([list.eq(1), list.eq(2)]).addClass('selected');
this.view.updateSummary();
expect(this.btn.text()).toContain(Diaspora.I18n.t('aspect_dropdown.toggle', { 'count':2 }));
});
});
});