201 lines
6.8 KiB
JavaScript
201 lines
6.8 KiB
JavaScript
describe("app.views.StreamPost", function(){
|
|
beforeEach(function(){
|
|
this.PostViewClass = app.views.StreamPost;
|
|
|
|
var posts = $.parseJSON(spec.readFixture("stream_json"));
|
|
this.collection = new app.collections.Posts(posts);
|
|
this.statusMessage = this.collection.models[0];
|
|
this.reshare = this.collection.models[1];
|
|
});
|
|
|
|
describe("events", function(){
|
|
var _PostViewClass,
|
|
authorId;
|
|
|
|
beforeEach(function(){
|
|
_PostViewClass = this.PostViewClass;
|
|
authorId = this.statusMessage.get('author').id;
|
|
});
|
|
|
|
describe("remove posts for blocked person", function(){
|
|
it("setup remove:author:posts:#{id} to #remove", function(){
|
|
spyOn(_PostViewClass.prototype, 'remove');
|
|
new _PostViewClass({model : this.statusMessage});
|
|
app.events.trigger('person:block:'+authorId);
|
|
expect(_PostViewClass.prototype.remove).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("#render", function(){
|
|
var o_embed_cache = {
|
|
"data" : {
|
|
"html" : "some html"
|
|
}
|
|
};
|
|
|
|
var open_graph_cache = {
|
|
"url": "http://example.com/articles/123",
|
|
"title": "Example title",
|
|
"description": "Test description",
|
|
"image": "http://example.com/thumb.jpg",
|
|
"ob_type": "article"
|
|
};
|
|
|
|
var open_graph_cache_extralong = {
|
|
"url": "http://example.com/articles/123",
|
|
"title": "Example title",
|
|
"description": Array(62).join("Test description"), // 992 chars
|
|
"image": "http://example.com/thumb.jpg",
|
|
"ob_type": "article"
|
|
};
|
|
|
|
beforeEach(function(){
|
|
loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
|
|
|
|
Diaspora.I18n.load({stream : {
|
|
reshares : {
|
|
one : "<%= count %> reshare",
|
|
other : "<%= count %> reshares"
|
|
},
|
|
likes : {
|
|
zero : "<%= count %> Likes",
|
|
one : "<%= count %> Like",
|
|
other : "<%= count %> Likes"
|
|
}
|
|
}});
|
|
});
|
|
|
|
context("reshare", function(){
|
|
it("displays a reshare count", function(){
|
|
this.statusMessage.set({ interactions: {reshares_count : 2 }});
|
|
var view = new this.PostViewClass({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.interactions.set({ interactions: { reshares_count : 0}} );
|
|
var view = new this.PostViewClass({model : this.statusMessage}).render();
|
|
|
|
expect($(view.el).html()).not.toContain("0 Reshares");
|
|
});
|
|
});
|
|
|
|
context("likes", function(){
|
|
it("displays a like count", function(){
|
|
this.statusMessage.interactions.set({likes_count : 1});
|
|
var view = new this.PostViewClass({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.interactions.set({likes_count : 0});
|
|
var view = new this.PostViewClass({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" : o_embed_cache});
|
|
|
|
var view = new app.views.StreamPost({model : this.statusMessage}).render();
|
|
expect(view.$el.html()).toContain(o_embed_cache.data.html);
|
|
});
|
|
});
|
|
|
|
context("og_html", function(){
|
|
it("provides opengraph preview based on the model reponse", function(){
|
|
this.statusMessage.set({"open_graph_cache" : open_graph_cache});
|
|
|
|
var view = new app.views.StreamPost({model : this.statusMessage}).render();
|
|
expect(view.$el.html()).toContain(open_graph_cache.title);
|
|
});
|
|
it("does not provide opengraph preview, when oembed is available", function(){
|
|
this.statusMessage.set({
|
|
"o_embed_cache" : o_embed_cache,
|
|
"open_graph_cache" : open_graph_cache
|
|
});
|
|
|
|
var view = new app.views.StreamPost({model : this.statusMessage}).render();
|
|
expect(view.$el.html()).not.toContain(open_graph_cache.title);
|
|
});
|
|
it("truncates long opengraph descriptions in stream view to be 250 chars or less", function() {
|
|
this.statusMessage.set({"open_graph_cache" : open_graph_cache_extralong});
|
|
|
|
var view = new app.views.StreamPost({model : this.statusMessage}).render();
|
|
expect(view.$el.find('.og-description').html().length).toBeLessThan(251);
|
|
});
|
|
});
|
|
|
|
context("user not signed in", function(){
|
|
it("does not provide a Feedback view", function(){
|
|
logout();
|
|
var view = new this.PostViewClass({model : this.statusMessage}).render();
|
|
expect(view.feedbackView()).toBeFalsy();
|
|
});
|
|
});
|
|
|
|
context("NSFW", function(){
|
|
beforeEach(function(){
|
|
this.statusMessage.set({nsfw: true});
|
|
this.view = new this.PostViewClass({model : this.statusMessage}).render();
|
|
|
|
this.hiddenPosts = function(){
|
|
return this.view.$(".media.shield-active .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 this.PostViewClass({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").and.returnValue(true);
|
|
|
|
this.view.$(".remove_post").click();
|
|
|
|
expect(window.confirm).toHaveBeenCalled();
|
|
expect(this.view.el).not.toBeInDOM();
|
|
});
|
|
});
|
|
|
|
});
|
|
});
|