Files
grecia/spec/system/comments/topics_spec.rb
Senén Rodero Rodríguez dcff7e8a33 Show parent comment responses when a new reply is added
When a user replies to a comment whose responses was hidden at the
moment of reply form submission and although the reply were correctly
added to the DOM it was hidden because was added to a collapsed list.

This solution is about showing all responses of parent comment after adding
the new comment to the DOM so the user can see new reply into the screen.
(This is not applicable to root comments which cannot be collapsed)
2020-05-26 13:20:26 +02:00

1180 lines
38 KiB
Ruby

require "rails_helper"
describe "Commenting topics from proposals" do
let(:user) { create :user }
let(:proposal) { create :proposal }
scenario "Index" do
community = proposal.community
topic = create(:topic, community: community)
create_list(:comment, 3, commentable: topic)
visit community_topic_path(community, topic)
expect(page).to have_css(".comment", count: 3)
comment = Comment.last
within first(".comment") do
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
scenario "Show" do
community = proposal.community
topic = create(:topic, community: community)
parent_comment = create(:comment, commentable: topic)
first_child = create(:comment, commentable: topic, parent: parent_comment)
second_child = create(:comment, commentable: topic, parent: parent_comment)
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).to have_link "Go back to #{topic.title}", href: community_topic_path(community, topic)
end
scenario "Link to comment show" do
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic, user: user)
visit community_topic_path(community, topic)
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 #{topic.title}"
expect(page).to have_current_path(comment_path(comment))
end
scenario "Collapsable comments", :js do
community = proposal.community
topic = create(:topic, community: community)
parent_comment = create(:comment, body: "Main comment", commentable: topic)
child_comment = create(:comment, body: "First subcomment", commentable: topic, parent: parent_comment)
grandchild_comment = create(:comment, body: "Last subcomment", commentable: topic, parent: child_comment)
visit community_topic_path(community, topic)
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content("1 response (collapse)", count: 2)
within ".comment .comment", text: "First subcomment" do
click_link text: "1 response (collapse)"
end
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
within ".comment .comment", text: "First subcomment" do
click_link text: "1 response (show)"
end
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
within ".comment", text: "Main comment" do
click_link text: "1 response (collapse)", match: :first
end
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
community = proposal.community
topic = create(:topic, community: community)
c1 = create(:comment, :with_confidence_score, commentable: topic, cached_votes_up: 100,
cached_votes_total: 120, created_at: Time.current - 2)
c2 = create(:comment, :with_confidence_score, commentable: topic, cached_votes_up: 10,
cached_votes_total: 12, created_at: Time.current - 1)
c3 = create(:comment, :with_confidence_score, commentable: topic, cached_votes_up: 1,
cached_votes_total: 2, created_at: Time.current)
visit community_topic_path(community, topic, order: :most_voted)
expect(c1.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c3.body)
visit community_topic_path(community, topic, order: :newest)
expect(c3.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c1.body)
visit community_topic_path(community, topic, 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
community = proposal.community
topic = create(:topic, community: community)
old_root = create(:comment, commentable: topic, created_at: Time.current - 10)
new_root = create(:comment, commentable: topic, created_at: Time.current)
old_child = create(:comment, commentable: topic, parent_id: new_root.id, created_at: Time.current - 10)
new_child = create(:comment, commentable: topic, parent_id: new_root.id, created_at: Time.current)
visit community_topic_path(community, topic, order: :most_voted)
expect(new_root.body).to appear_before(old_root.body)
expect(old_child.body).to appear_before(new_child.body)
visit community_topic_path(community, topic, order: :newest)
expect(new_root.body).to appear_before(old_root.body)
expect(new_child.body).to appear_before(old_child.body)
visit community_topic_path(community, topic, 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
community = proposal.community
topic = create(:topic, community: community)
create :comment, commentable: topic, body: "Built with http://rubyonrails.org/"
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
create :comment, commentable: topic,
body: "<script>alert('hola')</script> <a href=\"javascript:alert('sorpresa!')\">click me<a/> http://www.url.com"
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
per_page = 10
(per_page + 2).times { create(:comment, commentable: topic) }
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
create(:comment, commentable: topic)
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
login_as(user)
visit community_topic_path(community, topic)
fill_in "Leave your comment", with: "Have you thought about...?"
click_button "Publish comment"
within "#comments" do
expect(page).to have_content "Have you thought about...?"
end
within "#tab-comments-label" do
expect(page).to have_content "Comments (1)"
end
end
scenario "Errors on create", :js do
community = proposal.community
topic = create(:topic, community: community)
login_as(user)
visit community_topic_path(community, topic)
click_button "Publish comment"
expect(page).to have_content "Can't be blank"
end
scenario "Reply", :js do
community = proposal.community
topic = create(:topic, community: community)
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
comment = create(:comment, commentable: topic, user: citizen)
login_as(manuela)
visit community_topic_path(community, topic)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "Leave your comment", 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 "Reply update parent comment responses count", :js do
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
login_as(create(:user))
visit community_topic_path(community, topic)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Reply show parent comments responses when hidden", :js do
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
create(:comment, commentable: topic, parent: comment)
login_as(create(:user))
visit community_topic_path(community, topic)
within ".comment", text: comment.body do
click_link text: "1 response (collapse)"
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("It will be done next week.")
end
end
scenario "Errors on reply", :js do
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic, user: user)
login_as(user)
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
parent = create(:comment, commentable: topic)
7.times do
create(:comment, commentable: topic, parent: parent)
parent = parent.children.first
end
visit community_topic_path(community, topic)
expect(page).to have_css(".comment.comment.comment.comment.comment.comment.comment.comment")
end
scenario "Flagging as inappropriate", :js do
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
login_as(user)
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
Flag.flag(user, comment)
login_as(user)
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community, title: "Should we change the world?")
comment = create(:comment, commentable: topic)
login_as(user)
visit community_path(community)
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
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic, body: "this should be visible")
comment.user.erase
visit community_topic_path(community, topic)
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
community = proposal.community
topic = create(:topic, community: community)
moderator = create(:moderator)
login_as(moderator.user)
visit community_topic_path(community, topic)
fill_in "Leave your comment", with: "I am moderating!"
check "comment-as-moderator-topic_#{topic.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
community = proposal.community
topic = create(:topic, community: community)
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
moderator = create(:moderator, user: manuela)
comment = create(:comment, commentable: topic, user: citizen)
login_as(manuela)
visit community_topic_path(community, topic)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "Leave your comment", 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
community = proposal.community
topic = create(:topic, community: community)
moderator = create(:moderator)
login_as(moderator.user)
visit community_topic_path(community, topic)
expect(page).not_to have_content "Comment as administrator"
end
end
describe "Administrators" do
scenario "can create comment as an administrator", :js do
community = proposal.community
topic = create(:topic, community: community)
admin = create(:administrator)
login_as(admin.user)
visit community_topic_path(community, topic)
fill_in "Leave your comment", with: "I am your Admin!"
check "comment-as-administrator-topic_#{topic.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
community = proposal.community
topic = create(:topic, community: community)
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
admin = create(:administrator, user: manuela)
comment = create(:comment, commentable: topic, user: citizen)
login_as(manuela)
visit community_topic_path(community, topic)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "Leave your comment", 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 "div.is-admin"
expect(page).to have_css "img.admin-avatar"
end
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end
scenario "can not comment as a moderator" do
community = proposal.community
topic = create(:topic, community: community)
admin = create(:administrator)
login_as(admin.user)
visit community_topic_path(community, topic)
expect(page).not_to have_content "Comment as moderator"
end
end
describe "Voting comments" do
let(:verified) { create(:user, verified_at: Time.current) }
let(:unverified) { create(:user) }
let(:proposal) { create(:proposal) }
let(:topic) { create(:topic, community: proposal.community) }
let!(:comment) { create(:comment, commentable: topic) }
before do
login_as(verified)
end
scenario "Show" do
create(:vote, voter: verified, votable: comment, vote_flag: true)
create(:vote, voter: unverified, votable: comment, vote_flag: false)
visit community_topic_path(proposal.community, topic)
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 community_topic_path(proposal.community, topic)
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 community_topic_path(proposal.community, topic)
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 community_topic_path(proposal.community, topic)
within("#comment_#{comment.id}_votes") do
find(".in_favor a").click
within(".in_favor") do
expect(page).to have_content "1"
end
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
describe "Commenting topics from budget investments" do
let(:user) { create :user }
let(:investment) { create :budget_investment }
scenario "Index" do
community = investment.community
topic = create(:topic, community: community)
create_list(:comment, 3, commentable: topic)
visit community_topic_path(community, topic)
expect(page).to have_css(".comment", count: 3)
comment = Comment.last
within first(".comment") do
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
scenario "Show" do
community = investment.community
topic = create(:topic, community: community)
parent_comment = create(:comment, commentable: topic)
first_child = create(:comment, commentable: topic, parent: parent_comment)
second_child = create(:comment, commentable: topic, parent: parent_comment)
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).to have_link "Go back to #{topic.title}", href: community_topic_path(community, topic)
end
scenario "Collapsable comments", :js do
community = investment.community
topic = create(:topic, community: community)
parent_comment = create(:comment, body: "Main comment", commentable: topic)
child_comment = create(:comment, body: "First subcomment", commentable: topic, parent: parent_comment)
grandchild_comment = create(:comment, body: "Last subcomment", commentable: topic, parent: child_comment)
visit community_topic_path(community, topic)
expect(page).to have_css(".comment", count: 3)
within ".comment .comment", text: "First subcomment" do
click_link text: "1 response (collapse)"
end
expect(page).to have_css(".comment", count: 2)
expect(page).not_to have_content grandchild_comment.body
within ".comment .comment", text: "First subcomment" do
click_link text: "1 response (show)"
end
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content grandchild_comment.body
within ".comment", text: "Main comment" do
click_link text: "1 response (collapse)", match: :first
end
expect(page).to have_css(".comment", count: 1)
expect(page).not_to have_content child_comment.body
expect(page).not_to have_content grandchild_comment.body
end
scenario "Comment order" do
community = investment.community
topic = create(:topic, community: community)
c1 = create(:comment, :with_confidence_score, commentable: topic, cached_votes_up: 100,
cached_votes_total: 120, created_at: Time.current - 2)
c2 = create(:comment, :with_confidence_score, commentable: topic, cached_votes_up: 10,
cached_votes_total: 12, created_at: Time.current - 1)
c3 = create(:comment, :with_confidence_score, commentable: topic, cached_votes_up: 1,
cached_votes_total: 2, created_at: Time.current)
visit community_topic_path(community, topic, order: :most_voted)
expect(c1.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c3.body)
visit community_topic_path(community, topic, order: :newest)
expect(c3.body).to appear_before(c2.body)
expect(c2.body).to appear_before(c1.body)
visit community_topic_path(community, topic, 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
community = investment.community
topic = create(:topic, community: community)
old_root = create(:comment, commentable: topic, created_at: Time.current - 10)
new_root = create(:comment, commentable: topic, created_at: Time.current)
old_child = create(:comment, commentable: topic, parent_id: new_root.id, created_at: Time.current - 10)
new_child = create(:comment, commentable: topic, parent_id: new_root.id, created_at: Time.current)
visit community_topic_path(community, topic, order: :most_voted)
expect(new_root.body).to appear_before(old_root.body)
expect(old_child.body).to appear_before(new_child.body)
visit community_topic_path(community, topic, order: :newest)
expect(new_root.body).to appear_before(old_root.body)
expect(new_child.body).to appear_before(old_child.body)
visit community_topic_path(community, topic, 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
community = investment.community
topic = create(:topic, community: community)
create :comment, commentable: topic, body: "Built with http://rubyonrails.org/"
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
create :comment, commentable: topic,
body: "<script>alert('hola')</script> <a href=\"javascript:alert('sorpresa!')\">click me<a/> http://www.url.com"
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
per_page = 10
(per_page + 2).times { create(:comment, commentable: topic) }
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
create(:comment, commentable: topic)
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
login_as(user)
visit community_topic_path(community, topic)
fill_in "Leave your comment", with: "Have you thought about...?"
click_button "Publish comment"
within "#comments" do
expect(page).to have_content "Have you thought about...?"
end
within "#tab-comments-label" do
expect(page).to have_content "Comments (1)"
end
end
scenario "Errors on create", :js do
community = investment.community
topic = create(:topic, community: community)
login_as(user)
visit community_topic_path(community, topic)
click_button "Publish comment"
expect(page).to have_content "Can't be blank"
end
scenario "Reply", :js do
community = investment.community
topic = create(:topic, community: community)
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
comment = create(:comment, commentable: topic, user: citizen)
login_as(manuela)
visit community_topic_path(community, topic)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "Leave your comment", 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
community = investment.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic, user: user)
login_as(user)
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
parent = create(:comment, commentable: topic)
7.times do
create(:comment, commentable: topic, parent: parent)
parent = parent.children.first
end
visit community_topic_path(community, topic)
expect(page).to have_css(".comment.comment.comment.comment.comment.comment.comment.comment")
end
scenario "Flagging as inappropriate", :js do
community = investment.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
login_as(user)
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
Flag.flag(user, comment)
login_as(user)
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community, title: "Should we change the world?")
comment = create(:comment, commentable: topic)
login_as(user)
visit community_path(community)
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
community = investment.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic, body: "this should be visible")
comment.user.erase
visit community_topic_path(community, topic)
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
community = investment.community
topic = create(:topic, community: community)
moderator = create(:moderator)
login_as(moderator.user)
visit community_topic_path(community, topic)
fill_in "Leave your comment", with: "I am moderating!"
check "comment-as-moderator-topic_#{topic.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
community = investment.community
topic = create(:topic, community: community)
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
moderator = create(:moderator, user: manuela)
comment = create(:comment, commentable: topic, user: citizen)
login_as(manuela)
visit community_topic_path(community, topic)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "Leave your comment", 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
community = investment.community
topic = create(:topic, community: community)
moderator = create(:moderator)
login_as(moderator.user)
visit community_topic_path(community, topic)
expect(page).not_to have_content "Comment as administrator"
end
end
describe "Administrators" do
scenario "can create comment as an administrator", :js do
community = investment.community
topic = create(:topic, community: community)
admin = create(:administrator)
login_as(admin.user)
visit community_topic_path(community, topic)
fill_in "Leave your comment", with: "I am your Admin!"
check "comment-as-administrator-topic_#{topic.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
community = investment.community
topic = create(:topic, community: community)
citizen = create(:user, username: "Ana")
manuela = create(:user, username: "Manuela")
admin = create(:administrator, user: manuela)
comment = create(:comment, commentable: topic, user: citizen)
login_as(manuela)
visit community_topic_path(community, topic)
click_link "Reply"
within "#js-comment-form-comment_#{comment.id}" do
fill_in "Leave your comment", 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 "div.is-admin"
expect(page).to have_css "img.admin-avatar"
end
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end
scenario "can not comment as a moderator" do
community = investment.community
topic = create(:topic, community: community)
admin = create(:administrator)
login_as(admin.user)
visit community_topic_path(community, topic)
expect(page).not_to have_content "Comment as moderator"
end
end
describe "Voting comments" do
let(:verified) { create(:user, verified_at: Time.current) }
let(:unverified) { create(:user) }
let(:investment) { create(:budget_investment) }
let(:topic) { create(:topic, community: investment.community) }
let!(:comment) { create(:comment, commentable: topic) }
before do
login_as(verified)
end
scenario "Show" do
create(:vote, voter: verified, votable: comment, vote_flag: true)
create(:vote, voter: unverified, votable: comment, vote_flag: false)
visit community_topic_path(investment.community, topic)
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 community_topic_path(investment.community, topic)
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 community_topic_path(investment.community, topic)
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 community_topic_path(investment.community, topic)
within("#comment_#{comment.id}_votes") do
find(".in_favor a").click
within(".in_favor") do
expect(page).to have_content "1"
end
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