diaspora/spec/javascripts/app/views/post_view_spec.js
2012-03-24 02:57:32 +01:00

188 lines
6.7 KiB
JavaScript

describe("app.views.Post", function(){
describe("#render", function(){
beforeEach(function(){
loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
Diaspora.I18n.loadLocale({stream : {
reshares : {
one : "<%= count %> reshare",
other : "<%= count %> reshares"
},
likes : {
zero : "<%= count %> Likes",
one : "<%= count %> Like",
other : "<%= count %> Likes"
}
}})
var posts = $.parseJSON(spec.readFixture("stream_json"))["posts"];
this.collection = new app.collections.Posts(posts);
this.statusMessage = this.collection.models[0];
this.reshare = this.collection.models[1];
})
context("reshare", function(){
it("displays a reshare count", function(){
this.statusMessage.set({reshares_count : 2})
var view = new app.views.Post({model : this.statusMessage}).render();
expect($(view.el).html()).toContain(Diaspora.I18n.t('stream.reshares', {count: 2}))
})
it("does not display a reshare count for 'zero'", function(){
this.statusMessage.set({reshares_count : 0})
var view = new app.views.Post({model : this.statusMessage}).render();
expect($(view.el).html()).not.toContain("0 Reshares")
})
})
context("likes", function(){
it("displays a like count", function(){
this.statusMessage.set({likes_count : 1})
var view = new app.views.Post({model : this.statusMessage}).render();
expect($(view.el).html()).toContain(Diaspora.I18n.t('stream.likes', {count: 1}))
})
it("does not display a like count for 'zero'", function(){
this.statusMessage.set({likes_count : 0})
var view = new app.views.Post({model : this.statusMessage}).render();
expect($(view.el).html()).not.toContain("0 Likes")
})
})
context("embed_html", function(){
it("provides oembed html from the model response", function(){
this.statusMessage.set({"o_embed_cache" : {
"data" : {
"html" : "some html"
}
}})
var view = new app.views.Content({model : this.statusMessage});
expect(view.presenter().o_embed_html).toContain("some html")
})
it("does not provide oembed html from the model response if none is present", function(){
this.statusMessage.set({"o_embed_cache" : null})
var view = new app.views.Content({model : this.statusMessage});
expect(view.presenter().o_embed_html).toBe("");
})
})
context("user not signed in", function(){
it("does not provide a Feedback view", function(){
logout()
var view = new app.views.Post({model : this.statusMessage}).render();
expect(view.feedbackView()).toBeFalsy();
})
})
context("NSFW", function(){
beforeEach(function(){
this.statusMessage.set({nsfw: true});
this.view = new app.views.Post({model : this.statusMessage}).render();
this.hiddenPosts = function(){
return this.view.$(".nsfw-shield")
}
});
it("contains a shield element", function(){
expect(this.hiddenPosts().length).toBe(1)
});
it("does not contain a shield element when nsfw is false", function(){
this.statusMessage.set({nsfw: false});
this.view.render();
expect(this.hiddenPosts()).not.toExist();
})
context("showing a single post", function(){
it("removes the shields when the post is clicked", function(){
expect(this.hiddenPosts()).toExist();
this.view.$(".nsfw-shield .show_nsfw_post").click();
expect(this.hiddenPosts()).not.toExist();
});
});
context("clicking the toggle nsfw link toggles it on the user", function(){
it("calls toggleNsfw on the user", function(){
spyOn(app.user(), "toggleNsfwState")
this.view.$(".toggle_nsfw_state").first().click();
expect(app.user().toggleNsfwState).toHaveBeenCalled();
});
})
})
context("user views their own post", function(){
beforeEach(function(){
this.statusMessage.set({ author: {
id : app.user().id
}});
this.view = new app.views.Post({model : this.statusMessage}).render();
})
it("contains remove post", function(){
expect(this.view.$(".remove_post")).toExist();
})
it("destroys the view when they delete a their post from the show page", function(){
spyOn(window, "confirm").andReturn(true);
this.view.$(".remove_post").click();
expect(window.confirm).toHaveBeenCalled();
expect(this.view).not.toExist();
})
})
context("markdown rendering", function() {
beforeEach(function() {
// example from issue #2665
this.evilUrl = "http://www.bürgerentscheid-krankenhäuser.de";
this.asciiUrl = "http://www.xn--brgerentscheid-krankenhuser-xkc78d.de";
});
it("correctly handles non-ascii characters in urls", function() {
this.statusMessage.set({text: "<"+this.evilUrl+">"});
var view = new app.views.Post({model : this.statusMessage}).render();
expect($(view.el).html()).toContain(this.asciiUrl);
expect($(view.el).html()).toContain(this.evilUrl);
});
it("doesn't break link texts for non-ascii urls", function() {
var linkText = "check out this awesome link!";
this.statusMessage.set({text: "["+linkText+"]("+this.evilUrl+")"});
var view = new app.views.Post({model: this.statusMessage}).render();
expect($(view.el).html()).toContain(this.asciiUrl);
expect($(view.el).html()).toContain(linkText);
});
it("doesn't break reference style links for non-ascii urls", function() {
var postContent = "blabla blab [my special link][1] bla blabla\n\n[1]: "+this.evilUrl+" and an optional title)";
this.statusMessage.set({text: postContent});
var view = new app.views.Post({model: this.statusMessage}).render();
expect($(view.el).html()).not.toContain(this.evilUrl);
expect($(view.el).html()).toContain(this.asciiUrl);
});
it("correctly handles images with non-ascii urls", function() {
var postContent = "![logo](http://bündnis-für-krankenhäuser.de/wp-content/uploads/2011/11/cropped-logohp.jpg)";
var niceImg = '"http://xn--bndnis-fr-krankenhuser-i5b27cha.de/wp-content/uploads/2011/11/cropped-logohp.jpg"';
this.statusMessage.set({text: postContent});
var view = new app.views.Post({model: this.statusMessage}).render();
expect($(view.el).html()).toContain(niceImg);
});
});
})
});