Files
grecia/spec/features/comments/budget_investments_spec.rb
Javi Martín 0cca8c2cc1 Check the comment is present after commenting
We've got a bug which causes the admin description not to appear
immediately after commenting, due to the `admin_layout` variable being
false when we add a comment using an AJAX request.

So the test reloaded the page to check the admin description was there.
However, sometimes reloading the page is faster than the AJAX request,
and so the comment is not there yet.

By checking the results of the AJAX request before reloading the page,
the test passes.

A proper solution would be to display the admin description or name
right after the comment is added.
2019-06-06 14:18:32 +02:00

598 lines
20 KiB
Ruby

require "rails_helper"
include ActionView::Helpers::DateHelper
describe "Commenting Budget::Investments" do
let(:user) { create :user }
let(:investment) { create :budget_investment }
scenario "Index" do
3.times { create(:comment, commentable: investment) }
valuation_comment = create(:comment, :valuation, commentable: investment, subject: "Not viable")
visit budget_investment_path(investment.budget, investment)
expect(page).to have_css(".comment", count: 3)
expect(page).not_to have_content("Not viable")
within("#comments") do
Comment.not_valuations.last(3).each do |comment|
expect(page).to have_content comment.user.name
expect(page).to have_content I18n.l(comment.created_at, format: :datetime)
expect(page).to have_content comment.body
end
end
end
scenario "Show" do
parent_comment = create(:comment, commentable: investment)
first_child = create(:comment, commentable: investment, parent: parent_comment)
second_child = create(:comment, commentable: investment, parent: parent_comment)
valuation_comment = create(:comment, :valuation, commentable: investment, subject: "Not viable")
visit comment_path(parent_comment)
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content parent_comment.body
expect(page).to have_content first_child.body
expect(page).to have_content second_child.body
expect(page).not_to have_content("Not viable")
expect(page).to have_link "Go back to #{investment.title}", href: budget_investment_path(investment.budget, investment)
expect(page).to have_selector("ul#comment_#{parent_comment.id}>li", count: 2)
expect(page).to have_selector("ul#comment_#{first_child.id}>li", count: 1)
expect(page).to have_selector("ul#comment_#{second_child.id}>li", count: 1)
end
scenario "Link to comment show" do
comment = create(:comment, commentable: investment, user: user)
visit budget_investment_path(investment.budget, investment)
within "#comment_#{comment.id}" do
expect(page).to have_link comment.created_at.strftime("%Y-%m-%d %T")
end
click_link comment.created_at.strftime("%Y-%m-%d %T")
expect(page).to have_link "Go back to #{investment.title}"
expect(page).to have_current_path(comment_path(comment))
end
scenario "Collapsable comments", :js do
parent_comment = create(:comment, body: "Main comment", commentable: investment)
child_comment = create(:comment, body: "First subcomment", commentable: investment, parent: parent_comment)
grandchild_comment = create(:comment, body: "Last subcomment", commentable: investment, parent: child_comment)
visit budget_investment_path(investment.budget, investment)
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content("1 response (collapse)", count: 2)
find("#comment_#{child_comment.id}_children_arrow").click
expect(page).to have_css(".comment", count: 2)
expect(page).to have_content("1 response (collapse)")
expect(page).to have_content("1 response (show)")
expect(page).not_to have_content grandchild_comment.body
find("#comment_#{child_comment.id}_children_arrow").click
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content("1 response (collapse)", count: 2)
expect(page).to have_content grandchild_comment.body
find("#comment_#{parent_comment.id}_children_arrow").click
expect(page).to have_css(".comment", count: 1)
expect(page).to have_content("1 response (show)")
expect(page).not_to have_content child_comment.body
expect(page).not_to have_content grandchild_comment.body
end
scenario "Comment order" do
c1 = create(:comment, :with_confidence_score, commentable: investment, cached_votes_up: 100,
cached_votes_total: 120, created_at: Time.current - 2)
c2 = create(:comment, :with_confidence_score, commentable: investment, cached_votes_up: 10,
cached_votes_total: 12, created_at: Time.current - 1)
c3 = create(:comment, :with_confidence_score, commentable: investment, cached_votes_up: 1,
cached_votes_total: 2, created_at: Time.current)
visit budget_investment_path(investment.budget, investment, order: :most_voted)
expect(c1.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c3.body)
visit budget_investment_path(investment.budget, investment, order: :newest)
expect(c3.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c1.body)
visit budget_investment_path(investment.budget, investment, order: :oldest)
expect(c1.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c3.body)
end
scenario "Creation date works differently in roots and in child comments, when sorting by confidence_score" do
old_root = create(:comment, commentable: investment, created_at: Time.current - 10)
new_root = create(:comment, commentable: investment, created_at: Time.current)
old_child = create(:comment, commentable: investment, parent_id: new_root.id, created_at: Time.current - 10)
new_child = create(:comment, commentable: investment, parent_id: new_root.id, created_at: Time.current)
visit budget_investment_path(investment.budget, investment, order: :most_voted)
expect(new_root.body).to appear_before(old_root.body)
expect(old_child.body).to appear_before(new_child.body)
visit budget_investment_path(investment.budget, investment, order: :newest)
expect(new_root.body).to appear_before(old_root.body)
expect(new_child.body).to appear_before(old_child.body)
visit budget_investment_path(investment.budget, investment, order: :oldest)
expect(old_root.body).to appear_before(new_root.body)
expect(old_child.body).to appear_before(new_child.body)
end
scenario "Turns links into html links" do
create :comment, commentable: investment, body: "Built with http://rubyonrails.org/"
visit budget_investment_path(investment.budget, investment)
within first(".comment") do
expect(page).to have_content "Built with http://rubyonrails.org/"
expect(page).to have_link("http://rubyonrails.org/", href: "http://rubyonrails.org/")
expect(find_link("http://rubyonrails.org/")[:rel]).to eq("nofollow")
expect(find_link("http://rubyonrails.org/")[:target]).to eq("_blank")
end
end
scenario "Sanitizes comment body for security" do
create :comment, commentable: investment,
body: "<script>alert('hola')</script> <a href=\"javascript:alert('sorpresa!')\">click me<a/> http://www.url.com"
visit budget_investment_path(investment.budget, investment)
within first(".comment") do
expect(page).to have_content "click me http://www.url.com"
expect(page).to have_link("http://www.url.com", href: "http://www.url.com")
expect(page).not_to have_link("click me")
end
end
scenario "Paginated comments" do
per_page = 10
(per_page + 2).times { create(:comment, commentable: investment)}
visit budget_investment_path(investment.budget, investment)
expect(page).to have_css(".comment", count: per_page)
within("ul.pagination") do
expect(page).to have_content("1")
expect(page).to have_content("2")
expect(page).not_to have_content("3")
click_link "Next", exact: false
end
expect(page).to have_css(".comment", count: 2)
end
describe "Not logged user" do
scenario "can not see comments forms" do
create(:comment, commentable: investment)
visit budget_investment_path(investment.budget, investment)
expect(page).to have_content "You must Sign in or Sign up to leave a comment"
within("#comments") do
expect(page).not_to have_content "Write a comment"
expect(page).not_to have_content "Reply"
end
end
end
scenario "Create", :js do
login_as(user)
visit budget_investment_path(investment.budget, investment)
fill_in "comment-body-budget_investment_#{investment.id}", with: "Have you thought about...?"
click_button "Publish comment"
within "#tab-comments-label" do
expect(page).to have_content "Comments (1)"
end
within "#comments" do
expect(page).to have_content "Have you thought about...?"
end
end
scenario "Errors on create", :js do
login_as(user)
visit budget_investment_path(investment.budget, investment)
click_button "Publish comment"
expect(page).to have_content "Can't be blank"
end
scenario "Reply", :js do
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
comment = create(:comment, commentable: investment, user: citizen)
login_as(manuela)
visit budget_investment_path(investment.budget, investment)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "comment-body-comment_#{comment.id}", with: "It will be done next week."
click_button "Publish reply"
end
within "#comment_#{comment.id}" do
expect(page).to have_content "It will be done next week."
end
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end
scenario "Errors on reply", :js do
comment = create(:comment, commentable: investment, user: user)
login_as(user)
visit budget_investment_path(investment.budget, investment)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
click_button "Publish reply"
expect(page).to have_content "Can't be blank"
end
end
scenario "N replies", :js do
parent = create(:comment, commentable: investment)
7.times do
create(:comment, commentable: investment, parent: parent)
parent = parent.children.first
end
visit budget_investment_path(investment.budget, investment)
expect(page).to have_css(".comment.comment.comment.comment.comment.comment.comment.comment")
end
scenario "Flagging as inappropriate", :js do
comment = create(:comment, commentable: investment)
login_as(user)
visit budget_investment_path(investment.budget, investment)
within "#comment_#{comment.id}" do
page.find("#flag-expand-comment-#{comment.id}").click
page.find("#flag-comment-#{comment.id}").click
expect(page).to have_css("#unflag-expand-comment-#{comment.id}")
end
expect(Flag.flagged?(user, comment)).to be
end
scenario "Undoing flagging as inappropriate", :js do
comment = create(:comment, commentable: investment)
Flag.flag(user, comment)
login_as(user)
visit budget_investment_path(investment.budget, investment)
within "#comment_#{comment.id}" do
page.find("#unflag-expand-comment-#{comment.id}").click
page.find("#unflag-comment-#{comment.id}").click
expect(page).to have_css("#flag-expand-comment-#{comment.id}")
end
expect(Flag.flagged?(user, comment)).not_to be
end
scenario "Flagging turbolinks sanity check", :js do
investment = create(:budget_investment, title: "Should we change the world?")
comment = create(:comment, commentable: investment)
login_as(user)
visit budget_investments_path(investment.budget)
click_link "Should we change the world?"
within "#comment_#{comment.id}" do
page.find("#flag-expand-comment-#{comment.id}").click
expect(page).to have_selector("#flag-comment-#{comment.id}")
end
end
scenario "Erasing a comment's author" do
investment = create(:budget_investment)
comment = create(:comment, commentable: investment, body: "this should be visible")
comment.user.erase
visit budget_investment_path(investment.budget, investment)
within "#comment_#{comment.id}" do
expect(page).to have_content("User deleted")
expect(page).to have_content("this should be visible")
end
end
describe "Moderators" do
scenario "can create comment as a moderator", :js do
moderator = create(:moderator)
login_as(moderator.user)
visit budget_investment_path(investment.budget, investment)
fill_in "comment-body-budget_investment_#{investment.id}", with: "I am moderating!"
check "comment-as-moderator-budget_investment_#{investment.id}"
click_button "Publish comment"
within "#comments" do
expect(page).to have_content "I am moderating!"
expect(page).to have_content "Moderator ##{moderator.id}"
expect(page).to have_css "div.is-moderator"
expect(page).to have_css "img.moderator-avatar"
end
end
scenario "can create reply as a moderator", :js do
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
moderator = create(:moderator, user: manuela)
comment = create(:comment, commentable: investment, user: citizen)
login_as(manuela)
visit budget_investment_path(investment.budget, investment)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "comment-body-comment_#{comment.id}", with: "I am moderating!"
check "comment-as-moderator-comment_#{comment.id}"
click_button "Publish reply"
end
within "#comment_#{comment.id}" do
expect(page).to have_content "I am moderating!"
expect(page).to have_content "Moderator ##{moderator.id}"
expect(page).to have_css "div.is-moderator"
expect(page).to have_css "img.moderator-avatar"
end
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end
scenario "can not comment as an administrator" do
moderator = create(:moderator)
login_as(moderator.user)
visit budget_investment_path(investment.budget, investment)
expect(page).not_to have_content "Comment as administrator"
end
end
describe "Administrators" do
context "comment as administrator" do
scenario "can create comment", :js do
admin = create(:administrator)
login_as(admin.user)
visit budget_investment_path(investment.budget, investment)
fill_in "comment-body-budget_investment_#{investment.id}", with: "I am your Admin!"
check "comment-as-administrator-budget_investment_#{investment.id}"
click_button "Publish comment"
within "#comments" do
expect(page).to have_content "I am your Admin!"
expect(page).to have_content "Administrator ##{admin.id}"
expect(page).to have_css "div.is-admin"
expect(page).to have_css "img.admin-avatar"
end
end
scenario "display administrator description on admin views", :js do
admin = create(:administrator, description: "user description")
login_as(admin.user)
visit admin_budget_budget_investment_path(investment.budget, investment)
fill_in "comment-body-budget_investment_#{investment.id}", with: "I am your Admin!"
check "comment-as-administrator-budget_investment_#{investment.id}"
click_button "Publish comment"
within "#comments" do
expect(page).to have_content "I am your Admin!"
end
visit admin_budget_budget_investment_path(investment.budget, investment)
within "#comments" do
expect(page).to have_content "I am your Admin!"
expect(page).to have_content "Administrator user description"
expect(page).to have_css "div.is-admin"
expect(page).to have_css "img.admin-avatar"
end
end
scenario "display administrator id on public views", :js do
admin = create(:administrator, description: "user description")
login_as(admin.user)
visit admin_budget_budget_investment_path(investment.budget, investment)
fill_in "comment-body-budget_investment_#{investment.id}", with: "I am your Admin!"
check "comment-as-administrator-budget_investment_#{investment.id}"
click_button "Publish comment"
within "#comments" do
expect(page).to have_content "I am your Admin!"
expect(page).to have_content "Administrator ##{admin.id}"
expect(page).to have_css "div.is-admin"
expect(page).to have_css "img.admin-avatar"
end
end
scenario "can create reply as an administrator", :js do
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
admin = create(:administrator, user: manuela)
comment = create(:comment, commentable: investment, user: citizen)
login_as(manuela)
visit budget_investment_path(investment.budget, investment)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "comment-body-comment_#{comment.id}", with: "Top of the world!"
check "comment-as-administrator-comment_#{comment.id}"
click_button "Publish reply"
end
within "#comment_#{comment.id}" do
expect(page).to have_content "Top of the world!"
expect(page).to have_content "Administrator ##{admin.id}"
expect(page).to have_css "img.admin-avatar"
end
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
expect(page).to have_css "div.is-admin"
end
scenario "public users not see admin description", :js do
manuela = create(:user, username: "Manuela")
admin = create(:administrator, user: manuela)
comment = create(:comment,
commentable: investment,
user: manuela,
administrator_id: admin.id)
visit budget_investment_path(investment.budget, investment)
within "#comment_#{comment.id}" do
expect(page).to have_content comment.body
expect(page).to have_content "Administrator ##{admin.id}"
expect(page).to have_css "img.admin-avatar"
expect(page).to have_css "div.is-admin"
end
end
end
scenario "can not comment as a moderator" do
admin = create(:administrator)
login_as(admin.user)
visit budget_investment_path(investment.budget, investment)
expect(page).not_to have_content "Comment as moderator"
end
end
describe "Voting comments" do
before do
@manuela = create(:user, verified_at: Time.current)
@pablo = create(:user)
@investment = create(:budget_investment)
@comment = create(:comment, commentable: @investment)
@budget = @investment.budget
login_as(@manuela)
end
scenario "Show" do
create(:vote, voter: @manuela, votable: @comment, vote_flag: true)
create(:vote, voter: @pablo, votable: @comment, vote_flag: false)
visit budget_investment_path(@budget, @budget, @investment)
within("#comment_#{@comment.id}_votes") do
within(".in_favor") do
expect(page).to have_content "1"
end
within(".against") do
expect(page).to have_content "1"
end
expect(page).to have_content "2 votes"
end
end
scenario "Create", :js do
visit budget_investment_path(@budget, @investment)
within("#comment_#{@comment.id}_votes") do
find(".in_favor a").click
within(".in_favor") do
expect(page).to have_content "1"
end
within(".against") do
expect(page).to have_content "0"
end
expect(page).to have_content "1 vote"
end
end
scenario "Update", :js do
visit budget_investment_path(@budget, @investment)
within("#comment_#{@comment.id}_votes") do
find(".in_favor a").click
within(".in_favor") do
expect(page).to have_content "1"
end
find(".against a").click
within(".in_favor") do
expect(page).to have_content "0"
end
within(".against") do
expect(page).to have_content "1"
end
expect(page).to have_content "1 vote"
end
end
scenario "Trying to vote multiple times", :js do
visit budget_investment_path(@budget, @investment)
within("#comment_#{@comment.id}_votes") do
find(".in_favor a").click
find(".in_favor a").click
within(".in_favor") do
expect(page).to have_content "1"
end
within(".against") do
expect(page).to have_content "0"
end
expect(page).to have_content "1 vote"
end
end
end
end