otwarchive-symphonyarchive/features/step_definitions/comment_steps.rb
2026-03-11 22:22:11 +00:00

406 lines
13 KiB
Ruby

# GIVEN
Given /^I have the default comment notifications setup$/ do
end
Given /^I have the receive all comment notifications setup$/ do
step %{I set my preferences to turn on copies of my own comments}
end
ParameterType(
name: "commentable",
regexp: /the (work|admin post|tag) "([^"]*)"/,
type: ActsAsCommentable::Commentable,
transformer: lambda { |type, title|
case type
when "work"
Work.find_by(title: title)
when "admin post"
AdminPost.find_by(title: title)
when "tag"
Tag.find_by(name: title)
end
}
)
Given "{commentable} with guest comments enabled" do |commentable|
assert !commentable.is_a?(Tag)
commentable.update_attribute(:comment_permissions, :enable_all)
end
Given "a guest comment on {commentable}" do |commentable|
commentable = Comment.commentable_object(commentable)
FactoryBot.create(:comment, :by_guest, commentable: commentable)
end
Given "a comment {string} by {string} on {commentable}" do |text, user, commentable|
user = ensure_user(user)
commentable = Comment.commentable_object(commentable)
FactoryBot.create(:comment,
pseud: user.default_pseud,
commentable: commentable,
comment_content: text)
end
Given "a reply {string} by {string} on {commentable}" do |text, user, commentable|
user = ensure_user(user)
comment = commentable.comments.first
FactoryBot.create(:comment,
pseud: user.default_pseud,
commentable: comment,
comment_content: text)
end
Given "image safety mode is enabled for comments on a {string}" do |parent_type|
allow(ArchiveConfig).to receive(:PARENTS_WITH_IMAGE_SAFETY_MODE).and_return(parent_type)
end
Given "image safety mode is disabled for comments" do
allow(ArchiveConfig).to receive(:PARENTS_WITH_IMAGE_SAFETY_MODE).and_return([])
end
Given "the setup for testing image safety mode on the admin post {string}" do |title|
step %{the admin post "#{title}"}
step %{a comment "plain text" by "commentrecip" on the admin post "#{title}"}
step %{I am logged in as "commenter"}
visit comment_path(Comment.last)
step %{I follow "Reply"}
with_scope(".odd") do
# Use HTML that will get cleaned up by the sanitizer so we're sure it runs.
fill_in("comment[comment_content]", with: 'OMG! <img src= "https://example.com/image.jpg">')
click_button("Comment")
end
step %{I am logged in as "commentrecip"}
end
Given "the setup for testing image safety mode on the tag {string}" do |name|
step %{the tag wrangler "commentrecip" with password "password" is wrangler of "#{name}"}
step %{the tag wrangler "commenter" with password "password" is wrangler of "Some Fandom"}
step %{I am logged in as "commenter"}
visit tag_comments_path(Tag.find_by_name(name))
# Use HTML that will get cleaned up by the sanitizer so we're sure it runs.
fill_in("comment[comment_content]", with: 'OMG! <img src= "https://example.com/image.jpg">')
click_button("Comment")
step %{I am logged in as "commentrecip"}
end
Given "the setup for testing image safety mode on the work {string}" do |title|
step %{the work "#{title}" by "commentrecip"}
step %{I am logged in as "commenter"}
visit work_path(Work.find_by(title: title))
# Use HTML that will get cleaned up by the sanitizer so we're sure it runs.
fill_in("comment[comment_content]", with: 'OMG! <img src= "https://example.com/image.jpg">')
click_button("Comment")
step %{I am logged in as "commentrecip"}
end
# THEN
Then /^the comment's posted date should be nowish$/ do
nowish = Time.zone.now.strftime('%a %d %b %Y %I:%M%p')
step %{I should see "#{nowish}" within ".posted.datetime"}
end
Then /^I should see Last Edited nowish$/ do
nowish = Time.zone.now.strftime('%a %d %b %Y %I:%M%p')
step "I should see \"Last Edited #{nowish}\""
end
Then /^I should see the comment form$/ do
step %{I should see "New comment on"}
end
Then /^I should see the reply to comment form$/ do
step %{I should see "Comment as" within ".odd"}
end
Then /^I should see Last Edited in the right timezone$/ do
zone = Time.current.in_time_zone(Time.zone).zone
step %{I should see "#{zone}" within ".comment .posted"}
step %{I should see "Last Edited"}
end
# WHEN
When /^I set up the comment "([^"]*)" on the work "([^"]*)"$/ do |comment_text, work|
work = Work.find_by(title: work)
visit work_path(work)
fill_in("comment[comment_content]", with: comment_text)
end
When "I set up the comment {string} on the admin post {string}" do |comment_text, admin_post|
admin_post = AdminPost.find_by(title: admin_post)
visit admin_post_path(admin_post)
fill_in("comment[comment_content]", with: comment_text)
end
When "I set up the comment {string} on the work {string} with guest comments enabled" do |comment_text, work|
work = Work.find_by(title: work)
work.update_attribute(:comment_permissions, :enable_all)
visit work_path(work)
fill_in("comment[comment_content]", with: comment_text)
end
When /^I attempt to comment on "([^"]*)" with a pseud that is not mine$/ do |work|
step %{I am logged in as "commenter"}
step %{I set up the comment "This is a test" on the work "#{work}"}
work_id = Work.find_by(title: work).id
pseud_id = User.first.pseuds.first.id
find("#comment_pseud_id_for_#{work_id}", visible: false).set(pseud_id)
click_button "Comment"
end
When /^I attempt to update a comment on "([^"]*)" with a pseud that is not mine$/ do |work|
step %{I am logged in as "commenter"}
step %{I post the comment "blah blah blah" on the work "#{work}"}
step %{I follow "Edit"}
pseud_id = User.first.pseuds.first.id
find(:xpath, "//input[@name='comment[pseud_id]']", visible: false).set(pseud_id)
click_button "Update"
end
When /^I post the comment "([^"]*)" on the work "([^"]*)"$/ do |comment_text, work|
step "I set up the comment \"#{comment_text}\" on the work \"#{work}\""
click_button("Comment")
end
When "I post the comment {string} on the admin post {string}" do |comment_text, work|
step "I set up the comment \"#{comment_text}\" on the admin post \"#{work}\""
click_button("Comment")
end
When /^I post the comment "([^"]*)" on the work "([^"]*)" as a guest(?: with email "([^"]*)")?$/ do |comment_text, work, email|
step "I start a new session"
step %{I set up the comment "#{comment_text}" on the work "#{work}" with guest comments enabled}
fill_in("Guest name", with: "guest")
fill_in("Guest email", with: (email || "guest@foo.com"))
click_button "Comment"
end
When /^I edit a comment$/ do
step %{I follow "Edit"}
fill_in("comment[comment_content]", with: "Edited comment")
click_button "Update"
end
# this step assumes we are on a page with a comment form
When /^I post a comment "([^"]*)"$/ do |comment_text|
fill_in("comment[comment_content]", with: comment_text)
click_button("Comment")
end
# this step assumes that the reply-to-comment form can be opened
When /^I reply to a comment with "([^"]*)"$/ do |comment_text|
step %{I follow "Reply"}
step %{I should see the reply to comment form}
with_scope(".odd") do
fill_in("comment[comment_content]", with: comment_text)
click_button("Comment")
end
end
When /^I visit the new comment page for the work "([^"]+)"$/ do |work|
work = Work.find_by(title: work)
visit new_work_comment_path(work, only_path: false)
end
When /^I comment on an admin post$/ do
step "I go to the admin-posts page"
step %{I follow "Default Admin Post"}
step %{I fill in "comment[comment_content]" with "Excellent, my dear!"}
step %{I press "Comment"}
end
When "I try to post a spam comment" do
fill_in("comment[name]", with: "spammer")
fill_in("comment[email]", with: "spammer@example.org")
fill_in("comment[comment_content]", with: "Buy my product! http://spam.org")
click_button("Comment")
end
When "I post a spam comment" do
step "I try to post a spam comment"
step %{I should see "Comment created!"}
end
When "Akismet will flag any comment by {string}" do |username|
allow_any_instance_of(Comment).to receive(:spam?) do |comment|
comment.name == username || comment.user.login == username
end
end
When "Akismet will flag any comment containing {string}" do |spam_text|
allow_any_instance_of(Comment).to receive(:spam?) do |comment|
comment.comment_content.include?(spam_text)
end
end
When "I post a guest comment {string}" do |comment_content|
fill_in("comment[name]", with: "guest")
fill_in("comment[email]", with: "guest@example.org")
fill_in("comment[comment_content]", with: comment_content)
click_button("Comment")
step %{I should see "Comment created!"}
end
When "I post a guest comment" do
step "I post a guest comment \"This was really lovely!\""
end
When /^all comments by "([^"]*)" are marked as spam$/ do |name|
Comment.where(name: name).find_each(&:mark_as_spam!)
end
When /^I compose an invalid comment(?: within "([^"]*)")?$/ do |selector|
with_scope(selector) do
fill_in("Comment", with: "Now, we can devour the gods, together! " * 270)
end
end
When /^I delete the comment$/ do
step %{I follow "Delete" within ".odd"}
step %{I follow "Yes, delete!"}
end
When /^I delete the reply comment$/ do
step %{I follow "Delete" within ".even"}
step %{I follow "Yes, delete!"}
end
When /^I view the latest comment$/ do
visit comment_path(Comment.last)
end
Given "the moderated work {string} by {string}" do |title, login|
user = ensure_user(login)
w = FactoryBot.create(:work, title: title, authors: [user.default_pseud])
w.update_attribute(:moderated_commenting_enabled, true)
end
Then /^comment moderation should be enabled on "([^\"]*?)"/ do |work|
w = Work.find_by(title: work)
assert w.moderated_commenting_enabled?
end
Then /^comment moderation should not be enabled on "([^\"]*?)"/ do |work|
w = Work.find_by(title: work)
assert !w.moderated_commenting_enabled?
end
Then /^the comment on "([^\"]*?)" should be marked as unreviewed/ do |work|
w = Work.find_by(title: work)
assert w.comments.first.unreviewed?
end
Then /^the comment on "([^\"]*?)" should not be marked as unreviewed/ do |work|
w = Work.find_by(title: work)
assert !w.comments.first.unreviewed?
end
When "I view {commentable} with comments" do |commentable|
if commentable.is_a?(Tag)
visit tag_comments_path(commentable)
else
visit polymorphic_path(commentable, show_comments: true)
end
end
When /^I view the unreviewed comments page for "([^\"]*?)"/ do |work|
w = Work.find_by(title: work)
visit unreviewed_work_comments_path(w)
end
When /^I visit the thread for the comment on "([^\"]*?)"/ do |work|
w = Work.find_by(title: work)
visit comment_path(w.comments.first)
end
Then /^there should be (\d+) comments on "([^\"]*?)"/ do |num, work|
w = Work.find_by(title: work)
assert w.find_all_comments.count == num.to_i
end
Given /^the moderated work "([^\"]*)" by "([^\"]*)" with the approved comment "([^\"]*)" by "([^\"]*)"/ do |work, author, comment, commenter|
step %{the moderated work "#{work}" by "#{author}"}
step %{I am logged in as "#{commenter}"}
step %{I post the comment "#{comment}" on the work "#{work}"}
step %{I am logged in as "#{author}"}
step %{I view the unreviewed comments page for "#{work}"}
step %{I press "Approve"}
end
When /^I reload the comments on "([^\"]*?)"/ do |work|
w = Work.find_by(title: work)
w.find_all_comments.each { |c| c.reload }
end
When "{string} posts a deeply nested comment thread on {string}" do |username, work|
work = Work.find_by(title: work)
chapter = work.chapters[0]
user = User.find_by(login: username)
commentable = chapter
count = ArchiveConfig.COMMENT_THREAD_MAX_DEPTH + 1
count.times do |i|
commentable = Comment.create(
commentable: commentable,
parent: chapter,
comment_content: "This is a comment at depth #{i}.",
pseud: user.default_pseud
)
end
# As long as there's only one child comment, it'll keep displaying the child.
# So we need two comments at the final depth:
2.times do |i|
ordinal = i.zero? ? "first" : "second"
Comment.create(
commentable: commentable,
parent: chapter,
comment_content: "This is the #{ordinal} hidden comment.",
pseud: user.default_pseud
)
end
end
Then /^I (should|should not) see the deeply nested comments$/ do |should_or_should_not|
step %{I #{should_or_should_not} see "This is the first hidden comment."}
step %{I #{should_or_should_not} see "This is the second hidden comment."}
end
When /^I delete all visible comments on "([^\"]*?)"$/ do |work|
work = Work.find_by(title: work)
loop do
visit work_url(work, show_comments: true)
break unless page.has_content? "Delete"
click_link("Delete")
click_link("Yes, delete!") # TODO: Fix along with comment deletion.
end
end
When "I mark the comment as spam" do
click_link("Spam")
end
When "I confirm I want to mark the comment as spam" do
expect(page.accept_alert).to eq("Are you sure you want to mark this as spam?") if @javascript
end
When "I display comments" do
click_link("Comments")
end
When "I open the reply box" do
click_link("Reply")
end
When "I cancel the reply box" do
click_link("Cancel")
end
When "I reply on a new page" do
visit find(:link, "Reply")["href"]
end