require "cgi" DEFAULT_TITLE = "My Work Title" DEFAULT_FANDOM = "Stargate SG-1" DEFAULT_RATING = "Not Rated" DEFAULT_WARNING = "No Archive Warnings Apply" DEFAULT_FREEFORM = "Scary tag" DEFAULT_CONTENT = "That could be an amusing crossover." DEFAULT_CATEGORY = "Other" ### Setting up a work # These steps get used a lot by many other steps and tests to create works in the archive to test with When /^I fill in the basic work information for "([^"]*)"$/ do |title| step %{I fill in basic work tags} check(DEFAULT_WARNING) fill_in("Work Title", with: title) select("English", from: "work_language_id") fill_in("content", with: DEFAULT_CONTENT) end # Here we set up a draft and can then post it as a draft, preview and post, post, # or fill in additional information on the work form. # Example: I set up the draft "Foo" # Example: I set up the draft "Foo" with fandom "Captain America" in the collection "MCU Stories" as a gift to "Bob" # # This is a complex regexp because it attempts to be flexible and match a lot of options (including using a/the, in/to etc) # the (?: ) construct means: do not use the stuff in () as a capture/match # the ()? construct means: the stuff in () is optional # This can handle any number of the options being omitted, but you DO have to match in order # if you are using more than one of the options. That is, if you are specifying fandom AND freeform AND collection, # it has to be: # with fandom "X" with freeform "Y" in collection "Z" # and NOT: # with freeform "Y" in collection "Z" with fandom "X" # # If you add to this regexp, you probably want to update all the # similar regexps in the I post/Given the draft/the work steps below. When /^I set up (?:a|the) draft "([^"]*)"(?: with fandom "([^"]*)")?(?: with character "([^"]*)")?(?: with second character "([^"]*)")?(?: with freeform "([^"]*)")?(?: with second freeform "([^"]*)")?(?: with category "([^"]*)")?(?: with rating "([^\"]*)")?(?: (?:in|to) (?:the )?collection "([^"]*)")?(?: as a gift (?:for|to) "([^"]*)")?(?: as part of a series "([^"]*)")?(?: with relationship "([^"]*)")?(?: using the pseud "([^"]*)")?$/ do |title, fandom, character, character2, freeform, freeform2, category, rating, collection, recipient, series, relationship, pseud| step %{basic tags} visit new_work_path step %{I fill in the basic work information for "#{title}"} select(rating.blank? ? DEFAULT_RATING : rating, from: "Rating") check(category.blank? ? DEFAULT_CATEGORY : category) fill_in("Fandoms", with: (fandom.blank? ? DEFAULT_FANDOM : fandom)) fill_in("Additional Tags", with: (freeform.blank? ? DEFAULT_FREEFORM : freeform)+(freeform2.blank? ? '' : ','+freeform2)) unless character.blank? fill_in("work[character_string]", with: character + ( character2.blank? ? '' : ','+character2 ) ) end unless collection.blank? c = Collection.find_by(title: collection) fill_in("Collections", with: c.name) end unless series.blank? if page.has_select?("work[series_attributes][id]", with_options: [series]) select(series, from: "work[series_attributes][id]") else fill_in("work[series_attributes][title]", with: series) end end unless relationship.blank? fill_in("work[relationship_string]", with: relationship) end select(pseud, from: "work[author_attributes][ids][]") unless pseud.blank? fill_in("work_recipients", with: "#{recipient}") unless recipient.blank? end # This is the same regexp as above When /^I post (?:a|the) (?:(\d+) chapter )?work "([^"]*)"(?: with fandom "([^"]*)")?(?: with character "([^"]*)")?(?: with second character "([^"]*)")?(?: with freeform "([^"]*)")?(?: with second freeform "([^"]*)")?(?: with category "([^"]*)")?(?: with rating "([^\"]*)")?(?: (?:in|to) (?:the )?collection "([^"]*)")?(?: as a gift (?:for|to) "([^"]*)")?(?: as part of a series "([^"]*)")?(?: with relationship "([^"]*)")?(?: using the pseud "([^"]*)")?$/ do |number_of_chapters, title, fandom, character, character2, freeform, freeform2, category, rating, collection, recipient, series, relationship, pseud| # If the work is already a draft then visit the preview page and post it work = Work.find_by(title: title) if work visit preview_work_path(work) click_button("Post") else # Note: this will match the above regexp and work just fine even if all the options are blank! step %{I set up the draft "#{title}" with fandom "#{fandom}" with character "#{character}" with second character "#{character2}" with freeform "#{freeform}" with second freeform "#{freeform2}" with category "#{category}" with rating "#{rating}" in collection "#{collection}" as a gift to "#{recipient}" as part of a series "#{series}" with relationship "#{relationship}" using the pseud "#{pseud}"} click_button("Post") end # Now add the chapters if number_of_chapters.present? && number_of_chapters.to_i > 1 work = Work.find_by_title(title) visit work_path(work) (number_of_chapters.to_i - 1).times do step %{I follow "Add Chapter"} fill_in("content", with: "Yet another chapter.") click_button("Post") end end step %{all indexing jobs have been run} step "the periodic tag count task is run" step %(the periodic filter count task is run) end # Again, same regexp, it just creates a draft and not a posted # To test posting after preview, use: Given the draft "Foo" # Then use: When I post the work "Foo" # and the above step Given /^the draft "([^"]*)"(?: with fandom "([^"]*)")?(?: with character "([^"]*)")?(?: with second character "([^"]*)")?(?: with freeform "([^"]*)")?(?: with second freeform "([^"]*)")?(?: with category "([^"]*)")?(?: (?:in|to) (?:the )?collection "([^"]*)")?(?: as a gift (?:for|to) "([^"]*)")?(?: as part of a series "([^"]*)")?(?: with relationship "([^"]*)")?(?: using the pseud "([^"]*)")?$/ do |title, fandom, character, character2, freeform, freeform2, category, collection, recipient, series, relationship, pseud| step %{I set up the draft "#{title}" with fandom "#{fandom}" with character "#{character}" with second character "#{character2}" with freeform "#{freeform}" with second freeform "#{freeform2}" with category "#{category}" in collection "#{collection}" as a gift to "#{recipient}" as part of a series "#{series}" with relationship "#{relationship}" using the pseud "#{pseud}"} click_button("Preview") end When /^I post the works "([^"]*)"$/ do |worklist| worklist.split(/, ?/).each do |work_title| step %{I post the work "#{work_title}"} # Ensure all works are created with different timestamps to avoid flakiness step %{it is currently 1 second from now} end end ### GIVEN Given /^I have no works or comments$/ do Work.delete_all Comment.delete_all end Given /^the chaptered work(?: with ([\d]+) chapters)?(?: with ([\d]+) comments?)? "([^"]*)"$/ do |n_chapters, n_comments, title| step %{basic tags} title ||= "Blabla" n_chapters ||= 2 work = FactoryBot.create(:work, title: title, expected_number_of_chapters: n_chapters.to_i) # In order to make sure that the chapter positions are valid, we have to set # them manually. So we can't use create_list, and have to loop instead: (n_chapters.to_i - 1).times do |index| FactoryBot.create(:chapter, work: work, position: index + 2) end # Make sure that the word count is set properly: work.save n_comments ||= 0 FactoryBot.create_list(:comment, n_comments.to_i, :by_guest, commentable: work.first_chapter, comment_content: "Bla bla") end Given /^I have a work "([^"]*)"$/ do |work| step %{the work "#{work}"} end Given /^I have a multi-chapter draft$/ do step %{I am logged in as a random user} step %{I post the chaptered draft "Multi-chapter Draft"} end Given /^the work(?: "([^"]*)")? with(?: (\d+))? comments setup$/ do |title, n_comments| step %{basic tags} title ||= "Blabla" work = FactoryBot.create(:work, title: title) n_comments = 3 if n_comments.blank? || n_comments.zero? FactoryBot.create_list(:comment, n_comments.to_i, :by_guest, commentable: work.last_posted_chapter) end Given /^the work(?: "([^"]*)")? with(?: (\d+))? bookmarks? setup$/ do |title, n_bookmarks| step %{basic tags} title ||= "Blabla" work = FactoryBot.create(:work, title: title) n_bookmarks = 3 if n_bookmarks.blank? || n_bookmarks.zero? FactoryBot.create_list(:bookmark, n_bookmarks.to_i, bookmarkable: work) end Given /^the chaptered work setup$/ do step %{the chaptered work with 3 chapters "BigBang"} end Given /^the chaptered work with comments setup$/ do step %{the chaptered work with 3 chapters "BigBang"} step "I am logged in as a random user" step %{I view the work "BigBang"} step %{I post a comment "Woohoo"} (2..3).each do |i| step %{I view the work "BigBang"} step %{I view the #{i.to_s}th chapter} step %{I post a comment "Woohoo"} end step "I log out" end Given "the work {string}" do |title| FactoryBot.create(:work, title: title) end Given "the work {string} by {string}" do |title, login| user = ensure_user(login) FactoryBot.create(:work, title: title, authors: [user.default_pseud]) end Given "the work {string} by {string} with fandom {string}" do |title, login, fandom| user = ensure_user(login) FactoryBot.create(:work, title: title, authors: [user.default_pseud], fandom_string: fandom) end Given "the work {string} by {string} with guest comments enabled" do |title, login| user = ensure_user(login) FactoryBot.create(:work, :guest_comments_on, title: title, authors: [user.default_pseud]) end Given "the work {string} by {string} and {string}" do |title, login1, login2| user1 = ensure_user(login1) user2 = ensure_user(login2) FactoryBot.create(:work, title: title, authors: [user1.default_pseud, user2.default_pseud]) end Given "the work {string} by {string}, {string} and {string}" do |title, login1, login2, login3| user1 = ensure_user(login1) user2 = ensure_user(login2) user3 = ensure_user(login3) FactoryBot.create(:work, title: title, authors: [user1.default_pseud, user2.default_pseud, user3.default_pseud]) end Given "the work {string} by {string} and {string} with guest comments enabled" do |title, login1, login2| user1 = ensure_user(login1) user2 = ensure_user(login2) FactoryBot.create(:work, :guest_comments_on, title: title, authors: [user1.default_pseud, user2.default_pseud]) end Given /^the work "([^\"]*)" by "([^\"]*)" with chapter two co-authored with "([^\"]*)"$/ do |work, author, coauthor| step %{I am logged in as "#{author}"} step %{I post the work "#{work}"} step %{a chapter with the co-author "#{coauthor}" is added to "#{work}"} end Given /^there is a work "([^"]*)" in an unrevealed collection "([^"]*)"$/ do |work, collection| step %{I have the hidden collection "#{collection}"} step %{I am logged in as a random user} step %{I post the work "#{work}" to the collection "#{collection}"} step %{I log out} end Given /^there is a work "([^"]*)" in an anonymous collection "([^"]*)"$/ do |work, collection| step %{I have the anonymous collection "#{collection}"} step %{I am logged in as a random user} step %{I post the work "#{work}" to the collection "#{collection}"} step %{I log out} end Given /^I am logged in as the author of "([^"]*)"$/ do |work| work = Work.find_by_title(work) step %{I am logged in as "#{work.users.first.login}"} end Given "the spam work {string}" do |work| FactoryBot.create(:work, title: work).update_attribute(:spam, true) end Given "the hidden work {string}" do |work| FactoryBot.create(:work, title: work).update_attribute(:hidden_by_admin, true) end Given "the work {string} is marked as spam" do |work| w = Work.find_by(title: work) w.update_attribute(:spam, true) end Given "the user-defined tag limit is {int}" do |count| allow(ArchiveConfig).to receive(:USER_DEFINED_TAGS_MAX).and_return(count) end Given "the work {string} has {int} {word} tag(s)" do |title, count, type| work = Work.find_by(title: title) work.send("#{type.pluralize}=", FactoryBot.create_list(type.to_sym, count)) end ### WHEN When /^I view the ([\d]+)(?:st|nd|rd|th) chapter$/ do |chapter_no| (chapter_no.to_i - 1).times do |i| step %{I follow "Next Chapter"} end end When /^I view the work "([^"]*)"(?: in (full|chapter-by-chapter) mode)?$/ do |work, mode| work = Work.find_by_title(work) visit work_path(work) step %{I follow "Entire Work"} if mode == "full" step %{I follow "Chapter by Chapter"} if mode == "chapter-by-chapter" end When /^I view a deleted work$/ do visit "/works/12345/chapters/12345" end When /^I view a deleted chapter$/ do step "the draft \"DeletedChapterWork\"" work = Work.find_by(title: "DeletedChapterWork") visit "/works/#{work.id}/chapters/12345" end When /^I edit the work "([^"]*)"$/ do |work| work = Work.find_by(title: work) visit edit_work_path(work) end When /^I edit the draft "([^"]*)"$/ do |draft| step %{I edit the work "#{draft}"} end When /^I post the chaptered work "([^"]*)"(?: in the collection "([^"]*)")?$/ do |title, collection| step %{I post the work "#{title}" in the collection "#{collection}"} step %{I follow "Add Chapter"} fill_in("content", with: "Another Chapter.") click_button("Preview") step %{I press "Post"} step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I post the chaptered draft "([^"]*)"$/ do |title| step %{the draft "#{title}"} step %{a draft chapter is added to "#{title}"} end When /^I post the work "([^"]*)" without preview$/ do |title| # we now post as our default test case step %{I post the work "#{title}"} end When "I post the work {string} with guest comments enabled" do |title| step %{I set up the draft "#{title}"} choose("Registered users and guests can comment") step "I post the work without preview" end When /^a chapter is added to "([^"]*)"$/ do |work_title| step %{a draft chapter is added to "#{work_title}"} click_button("Post") step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^a chapter with the co-author "([^\"]*)" is added to "([^\"]*)"$/ do |coauthor, work_title| step %{a chapter is set up for "#{work_title}"} step %{I invite the co-author "#{coauthor}"} click_button("Post") step %{the user "#{coauthor}" accepts all co-creator requests} step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^a draft chapter is added to "([^"]*)"$/ do |work_title| step %{a chapter is set up for "#{work_title}"} step %{I press "Preview"} step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I delete chapter ([\d]+) of "([^"]*)"$/ do |chapter, title| step %{I edit the work "#{title}"} step %{I follow "#{chapter}"} step %{I follow "Delete Chapter"} step %{I press "Yes, Delete Chapter"} step %{all indexing jobs have been run} end # Posts a chapter for the current user When /^I post a chapter for the work "([^"]*)"(?: as "(.*?)")?$/ do |work_title, pseud| work = Work.find_by(title: work_title) visit work_url(work) step %{I follow "Add Chapter"} step %{I fill in "content" with "la la la la la la la la la la la"} select(pseud, from: "chapter_author_attributes_ids") if pseud.present? step %{I post the chapter} end When /^a chapter is set up for "([^"]*)"$/ do |work_title| work = Work.find_by(title: work_title) user = work.users.first step %{I am logged in as "#{user.login}"} visit work_url(work) step %{I follow "Add Chapter"} step %{I fill in "content" with "la la la la la la la la la la la"} end # meant to be used in conjunction with above step When /^I post the(?: draft)? chapter$/ do click_button("Post") step %{all indexing jobs have been run} step "the periodic tag count task is run" end Then /^I should see the default work content$/ do page.should have_content(DEFAULT_CONTENT) end Then /^I should not see the default work content$/ do page.should_not have_content(DEFAULT_CONTENT) end When /^I fill in basic work tags$/ do select(DEFAULT_RATING, from: "Rating") fill_in("Fandoms", with: DEFAULT_FANDOM) fill_in("Additional Tags", with: DEFAULT_FREEFORM) end When /^I fill in basic external work tags$/ do select(DEFAULT_RATING, from: "Rating") fill_in("Fandoms", with: DEFAULT_FANDOM) fill_in("Your tags", with: DEFAULT_FREEFORM) end When /^I set the fandom to "([^"]*)"$/ do |fandom| fill_in("Fandoms", with: fandom) end # on the edit multiple works page When /^I select "([^"]*)" for editing$/ do |title| id = Work.find_by(title: title).id check("work_ids_#{id}") end When /^I edit the multiple works "([^"]*)" and "([^"]*)"/ do |title1, title2| # check if the works have been posted yet unless Work.where(title: title1).exists? step %{I post the work "#{title1}"} end unless Work.where(title: title2).exists? step %{I post the work "#{title2}"} end step %{I follow "My Dashboard"} step %{I follow "Works ("} step %{I follow "Edit Works"} step %{I select "#{title1}" for editing} step %{I select "#{title2}" for editing} step %{I press "Edit"} end When /^I edit multiple works with different comment moderation settings$/ do step %{I set up the draft "Work with Comment Moderation Enabled"} check("work_moderated_commenting_enabled") choose("Registered users and guests can comment") step %{I post the work without preview} step %{I post the work "Work with Comment Moderation Disabled"} step %{I follow "My Dashboard"} step %{I follow "Works ("} step %{I follow "Edit Works"} step %{I select "Work with Comment Moderation Enabled" for editing} step %{I select "Work with Comment Moderation Disabled" for editing} step %{I press "Edit"} end When /^I edit multiple works with different commenting settings$/ do step %{I set up the draft "Work with All Commenting Enabled"} choose("Registered users and guests can comment") step %{I post the work without preview} step %{I set up the draft "Work with Anonymous Commenting Disabled"} choose("Only registered users can comment") step %{I post the work without preview} step %{I set up the draft "Work with All Commenting Disabled"} choose("No one can comment") step %{I post the work without preview} step %{I follow "My Dashboard"} step %{I follow "Works ("} step %{I follow "Edit Works"} step %{I select "Work with All Commenting Enabled" for editing} step %{I select "Work with Anonymous Commenting Disabled" for editing} step %{I select "Work with All Commenting Disabled" for editing} step %{I press "Edit"} end When /^I edit multiple works coauthored as "(.*)" with "(.*)"$/ do |author, coauthor| step %{I coauthored the work "Shared Work 1" as "#{author}" with "#{coauthor}"} step %{I coauthored the work "Shared Work 2" as "#{author}" with "#{coauthor}"} step %{I follow "My Dashboard"} step %{I follow "Works ("} step %{I follow "Edit Works"} step %{I select "Shared Work 1" for editing} step %{I select "Shared Work 2" for editing} step %{I press "Edit"} end When /^the purge_old_drafts rake task is run$/ do step %{I run the rake task "work:purge_old_drafts"} end When /^the work "([^"]*)" was created (\d+) days ago$/ do |title, number| step "the draft \"#{title}\"" work = Work.find_by(title: title) work.update_attribute(:created_at, number.to_i.days.ago) step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I post the locked work "([^"]*)"$/ do |title| work = Work.find_by(title: work) if work.blank? step "the locked draft \"#{title}\"" work = Work.find_by(title: title) end visit preview_work_url(work) click_button("Post") step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^the locked draft "([^"]*)"$/ do |title| step "basic tags" visit new_work_url step %{I fill in the basic work information for "#{title}"} check("work_restricted") click_button("Preview") end When /^I lock the work$/ do check("work_restricted") end When /^I lock the work "([^"]*)"$/ do |work| step %{I edit the work "#{work}"} step %{I lock the work} step %{I post the work} end When /^I unlock the work$/ do uncheck("work_restricted") end When /^I unlock the work "([^"]*)"$/ do |work| step %{I edit the work "#{work}"} step %{I unlock the work} step %{I post the work} end When /^I list the work "([^"]*)" as inspiration$/ do |title| work = Work.find_by(title: title) check("parent-options-show") url_of_work = work_url(work).sub("www.example.com", ArchiveConfig.APP_HOST) with_scope("#parent-options") do fill_in("URL", with: url_of_work) end end When /^I list an external work as inspiration$/ do check("parent-options-show") with_scope("#parent-options") do fill_in("URL", with: "https://example.com") fill_in("Title", with: "Example External") fill_in("Author", with: "External Author") select("English", from: "Language") end end When /^I set the publication date to (\d+) (.*) (\d+)$/ do |day, month, year| if page.has_selector?("#backdate-options-show") check("backdate-options-show") if page.find("#backdate-options-show") select(day.to_s, from: "work[chapter_attributes][published_at(3i)]") select(month, from: "work[chapter_attributes][published_at(2i)]") select(year.to_s, from: "work[chapter_attributes][published_at(1i)]") else select(day.to_s, from: "chapter[published_at(3i)]") select(month, from: "chapter[published_at(2i)]") select(year.to_s, from: "chapter[published_at(1i)]") end end When /^I set the publication date to today$/ do today = Date.current month = today.strftime("%B") step %{I set the publication date to #{today.day} #{month} #{today.year}} end When /^I browse the "(.*?)" works$/ do |tagname| tag = Tag.find_by_name(tagname) visit tag_works_path(tag) step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I browse the "(.*?)" works with page parameter "(.*?)"$/ do |tagname, page| tag = Tag.find_by_name(tagname) visit tag_works_path(tag, page: page) step %{all indexing jobs have been run} step "the periodic tag count task is run" end When "I browse works in language {string}" do |language_name| step %{all indexing jobs have been run} step "the periodic tag count task is run" language = Language.find_by(name: language_name) visit language_works_path(language) end When /^I delete the work "([^"]*)"$/ do |work| work = Work.find_by(title: CGI.escapeHTML(work)) visit edit_work_path(work) step %{I follow "Delete Work"} # If JavaScript is enabled, window.confirm will be used and we'll have to accept if @javascript expect(page.accept_alert).to eq("Are you sure you want to delete this work? This will destroy all comments and kudos on this work as well and CANNOT BE UNDONE!") else click_button("Yes, Delete Work") end step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I preview the work$/ do click_button("Preview") step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I update the work$/ do click_button("Update") step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I post the work without preview$/ do click_button "Post" step %{all indexing jobs have been run} step "the periodic tag count task is run" end When /^I post the work$/ do click_button "Post" step %{all indexing jobs have been run} end When /^the statistics for all works are updated$/ do RedisJobSpawner.perform_now("StatCounterJob") step %{the hit counts for all works are updated} end When /^I add the co-author "([^"]*)" to the work "([^"]*)"$/ do |coauthor, work| step %{I edit the work "#{work}"} step %{I invite the co-author "#{coauthor}"} step %{I post the work without preview} step %{the user "#{coauthor}" accepts the creator invite for the work "#{work}"} end When /^the user "([^"]*)" accepts the creator invite for the work "([^"]*)"/ do |user, work| # Make sure that we don't have caching issues with the byline: step %{I wait 1 second} u = User.find_by(login: user) w = Work.find_by(title: work) w.creatorships.unapproved.for_user(u).each(&:accept!) end When(/^I try to invite the co-authors? "([^"]*)"$/) do |coauthor| check("co-authors-options-show") fill_in("pseud_byline", with: "#{coauthor}") end When /^I invite the co-authors? "([^"]*)"$/ do |coauthor| coauthor.split(",").map(&:strip).reject(&:blank?).each do |user| step %{the user "#{user}" allows co-creators} end step %{I try to invite the co-authors "#{coauthor}"} end When "I give the work to {string}" do |recipient| fill_in("Gift this work to", with: recipient) end When /^I give the work "([^"]*)" to the user "([^"]*)"$/ do |work_title, recipient| step %{the user "#{recipient}" exists and is activated} visit edit_work_path(Work.find_by(title: work_title)) fill_in("work_recipients", with: "#{recipient}") click_button("Post") end When /^I add the beginning notes "([^"]*)"$/ do |notes| check("at the beginning") fill_in("work_notes", with: "#{notes}") end When /^I add the end notes "([^"]*)"$/ do |notes| check("at the end") fill_in("work_endnotes", with: "#{notes}") end When "I add the beginning notes {string} to the work {string}" do |notes, work| step %{I am logged in as the author of "#{work}"} step %{I edit the work "#{work}"} step %{I add the beginning notes "#{notes}"} step %{I post the work} end When "I add the end notes {string} to the work {string}" do |notes, work| step %{I am logged in as the author of "#{work}"} step %{I edit the work "#{work}"} step %{I add the end notes "#{notes}"} step %{I post the work} end When /^I mark the work "([^"]*)" for later$/ do |work| work = Work.find_by(title: work) visit work_url(work) step %{I follow "Mark for Later"} step "the readings are saved to the database" end When /^I follow the recent chapter link for the work "([^\"]*)"$/ do |work| work = Work.find_by_title(work) work_id = work.id.to_s find("#work_#{work_id} dd.chapters a").click end When "I follow the kudos link for the work {string}" do |work| work = Work.find_by(title: work) find("#work_#{work.id} dd.kudos a").click end When "I follow the comments link for the work {string}" do |work| work = Work.find_by(title: work) find("#work_#{work.id} dd.comments a").click end When "the cache for the work {string} is cleared" do |title| work = Work.find_by(title: title) # Delay to force the updated_at that gets set by .touch to be new step "it is currently 1 second from now" # Touch the work to actually expire the cache work.touch end When "the statistics for the work {string} are updated" do |title| step %{the statistics for all works are updated} step %{all indexing jobs have been run} step %{the cache for the work "#{title}" is cleared} end When /^the hit counts for all works are updated$/ do step "all AJAX requests are complete" RedisJobSpawner.perform_now("HitCountUpdateJob") end When /^all hit count information is reset$/ do redis = RedisHitCounter.redis redis.keys.each do |key| redis.del(key) end end ### THEN Then /^I should see Updated today$/ do today = Date.current.to_s step "I should see \"Updated:#{today}\"" end Then /^I should not see Updated today$/ do today = Date.current.to_s step "I should not see \"Updated:#{today}\"" end Then /^I should see Completed today$/ do today = Date.current.to_s step "I should see \"Completed:#{today}\"" end Then /^I should not see Completed today$/ do today = Date.current.to_s step "I should not see \"Completed:#{today}\"" end Then /^I should find a list for associations$/ do page.should have_xpath("//ul[@class=\"associations\"]") end Then /^I should not find a list for associations$/ do page.should_not have_xpath("//ul[@class=\"associations\"]") end Then /^the work "([^"]*)" should be deleted$/ do |work| assert !Work.where(title: work).exists? end Then /^the Remove Me As Chapter Co-Creator option should be on the ([\d]+)(?:st|nd|rd|th) chapter$/ do |chapter_number| step %{I should see "Remove Me As Chapter Co-Creator" within "ul#sortable_chapter_list > li:nth-of-type(#{chapter_number})"} end Then /^the Remove Me As Chapter Co-Creator option should not be on the ([\d]+)(?:st|nd|rd|th) chapter$/ do |chapter_number| step %{I should not see "Remove Me As Chapter Co-Creator" within "ul#sortable_chapter_list > li:nth-of-type(#{chapter_number})"} end Then "I should see {string} within the work blurb of {string}" do |content, work| work = Work.find_by(title: work) step %{I should see "#{content}" within "li#work_#{work.id}"} end Then "I should not see {string} within the work blurb of {string}" do |content, work| work = Work.find_by(title: work) step %{I should not see "#{content}" within "li#work_#{work.id}"} end Then "I should see an HTML comment containing the number {int} within {string}" do |expected_number, selector| html = page.find(selector).native.inner_html comment_match = html.match(/.*.*/) expect(comment_match).not_to be_nil number = comment_match[1].to_i expect(number).to eq(expected_number) end