Files
nairobi/spec/models/comment_spec.rb
Javi Martín 65c9786db7 Apply Layout/RedundantLineBreak rule to short lines
We're not adding the rule because it would apply the current line length
rule of 110 characters per line. We still haven't decided whether we'll
keep that rule or make lines shorter so they're easier to read,
particularly when vertically splitting the editor window.

So, for now, I'm applying the rule to lines which are about 90
characters long.
2021-09-03 11:49:53 +02:00

190 lines
5.8 KiB
Ruby

require "rails_helper"
describe Comment do
let(:comment) { build(:comment) }
it_behaves_like "has_public_author"
it_behaves_like "globalizable", :comment
it_behaves_like "acts as paranoid", :comment
it "is valid" do
expect(comment).to be_valid
end
it "updates cache_counter in debate after hide and restore" do
debate = create(:debate)
comment = create(:comment, commentable: debate)
expect(debate.reload.comments_count).to eq(1)
comment.hide
expect(debate.reload.comments_count).to eq(0)
comment.restore
expect(debate.reload.comments_count).to eq(1)
end
describe "#as_administrator?" do
it "is true if comment has administrator_id, false otherway" do
expect(comment).not_to be_as_administrator
comment.administrator_id = 33
expect(comment).to be_as_administrator
end
end
describe "#as_moderator?" do
it "is true if comment has moderator_id, false otherway" do
expect(comment).not_to be_as_moderator
comment.moderator_id = 21
expect(comment).to be_as_moderator
end
end
describe "#confidence_score" do
it "takes into account percentage of total votes and total_positive and total negative votes" do
comment = create(:comment, :with_confidence_score, cached_votes_up: 100, cached_votes_total: 100)
expect(comment.confidence_score).to eq(10000)
comment = create(:comment, :with_confidence_score, cached_votes_up: 0, cached_votes_total: 100)
expect(comment.confidence_score).to eq(0)
comment = create(:comment, :with_confidence_score, cached_votes_up: 75, cached_votes_total: 100)
expect(comment.confidence_score).to eq(3750)
comment = create(:comment, :with_confidence_score, cached_votes_up: 750, cached_votes_total: 1000)
expect(comment.confidence_score).to eq(37500)
comment = create(:comment, :with_confidence_score, cached_votes_up: 10, cached_votes_total: 100)
expect(comment.confidence_score).to eq(-800)
comment = create(:comment, :with_confidence_score, cached_votes_up: 0, cached_votes_total: 0)
expect(comment.confidence_score).to eq(1)
end
describe "actions which affect it" do
let(:comment) { create(:comment, :with_confidence_score) }
it "increases with like" do
previous = comment.confidence_score
5.times { comment.vote_by(voter: create(:user), vote: true) }
expect(previous).to be < comment.confidence_score
end
it "decreases with dislikes" do
comment.vote_by(voter: create(:user), vote: true)
previous = comment.confidence_score
3.times { comment.vote_by(voter: create(:user), vote: false) }
expect(previous).to be > comment.confidence_score
end
end
end
describe "cache" do
let(:comment) { create(:comment) }
it "expires cache when it has a new vote" do
expect { create(:vote, votable: comment) }.to change { comment.cache_version }
end
it "expires cache when hidden" do
expect { comment.hide }.to change { comment.cache_version }
end
it "expires cache when the author is hidden" do
expect { comment.user.hide }
.to change { [comment.reload.cache_version, comment.author.cache_version] }
end
it "expires cache when the author is erased" do
expect { comment.user.erase }
.to change { [comment.reload.cache_version, comment.author.cache_version] }
end
it "expires cache when the author changes" do
expect { comment.user.update(username: "Isabel") }
.to change { [comment.reload.cache_version, comment.author.cache_version] }
end
it "expires cache when the author's organization get verified" do
create(:organization, user: comment.user)
expect { comment.user.organization.verify }
.to change { [comment.reload.cache_version, comment.author.cache_version] }
end
end
describe "#author_id?" do
it "returns the user's id" do
expect(comment.author_id).to eq(comment.user.id)
end
end
describe "not_as_admin_or_moderator" do
it "returns only comments posted as regular user" do
comment1 = create(:comment)
create(:comment, administrator_id: create(:administrator).id)
create(:comment, moderator_id: create(:moderator).id)
expect(Comment.not_as_admin_or_moderator).to eq [comment1]
end
end
describe "public_for_api scope" do
it "returns comments" do
comment = create(:comment)
expect(Comment.public_for_api).to eq [comment]
end
it "does not return hidden comments" do
create(:comment, :hidden)
expect(Comment.public_for_api).to be_empty
end
it "returns comments on debates" do
comment = create(:comment, commentable: create(:debate))
expect(Comment.public_for_api).to eq [comment]
end
it "does not return comments on hidden debates" do
create(:comment, commentable: create(:debate, :hidden))
expect(Comment.public_for_api).to be_empty
end
it "returns comments on proposals" do
proposal = create(:proposal)
comment = create(:comment, commentable: proposal)
expect(Comment.public_for_api).to eq [comment]
end
it "does not return comments on hidden proposals" do
create(:comment, commentable: create(:proposal, :hidden))
expect(Comment.public_for_api).to be_empty
end
it "does not return comments on elements which are not debates or proposals" do
create(:comment, commentable: create(:budget_investment))
expect(Comment.public_for_api).to be_empty
end
it "does not return comments with no commentable" do
build(:comment, commentable: nil).save!(validate: false)
expect(Comment.public_for_api).to be_empty
end
it "does not return internal valuation comments" do
create(:comment, :valuation)
expect(Comment.public_for_api).to be_empty
end
end
end