otwarchive-symphonyarchive/features/step_definitions/bookmark_steps.rb

458 lines
18 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
Given /^mock websites with no content$/ do
WebMock.disable_net_connect!
WebMock.stub_request(:head, "http://example.org/200")
WebMock.stub_request(:head, "http://example.org/301").to_return(status: 301)
WebMock.stub_request(:head, "http://example.org/404").to_return(status: 404)
end
Given "all pages on the host {string} return status 200" do |url|
WebMock.disable_net_connect!
parsed_url = Addressable::URI.parse(url)
WebMock.stub_request(:any, %r[https?://#{parsed_url.host}.*]).to_return(status: 200)
end
Given /^I have a bookmark for "([^\"]*)"$/ do |title|
step %{I start a new bookmark for "#{title}"}
fill_in("Your tags", with: DEFAULT_BOOKMARK_TAGS)
step %{I press "Create"}
step %{all indexing jobs have been run}
end
Given /^I have a bookmark of a deleted work$/ do
title = "Deleted Work For Bookmarking"
step %{I start a new bookmark for "#{title}"}
fill_in("bookmark_tag_string", with: DEFAULT_BOOKMARK_TAGS)
step %{I press "Create"}
work = Work.find_by(title: title)
work.destroy
step %{all indexing jobs have been run}
end
Given /^I have bookmarks to search$/ do
# set up a user
user1 = FactoryBot.create(:user, login: "testuser")
# set up the pseuds
pseud1 = FactoryBot.create(:pseud, name: "testy", user_id: user1.id)
pseud2 = FactoryBot.create(:pseud, name: "tester_pseud", user_id: user1.id)
# set up a tag
freeform1 = FactoryBot.create(:freeform, name: "classic")
freeform2 = FactoryBot.create(:freeform, name: "rare")
# set up some works
work1 = FactoryBot.create(:work, title: "First work", freeform_string: freeform2.name)
work2 = FactoryBot.create(:work, title: "second work")
work3 = FactoryBot.create(:work, title: "third work")
work4 = FactoryBot.create(:work, title: "fourth")
work5 = FactoryBot.create(:work, title: "fifth")
# set up an external work
external1 = FactoryBot.create(:external_work, title: "Skies Grown Darker")
# set up some series
series1 = FactoryBot.create(:series, title: "First Series")
series2 = FactoryBot.create(:series_with_a_work, title: "Second Series")
# add work1 to series1 to ensure the series has tags
FactoryBot.create(:serial_work, work_id: work1.id, series_id: series1.id)
# set up the bookmarks
FactoryBot.create(:bookmark,
bookmarkable_id: work1.id,
pseud_id: user1.default_pseud.id,
rec: true)
FactoryBot.create(:bookmark,
bookmarkable_id: work2.id,
pseud_id: user1.default_pseud.id,
tag_string: freeform2.name)
FactoryBot.create(:bookmark,
bookmarkable_id: work3.id,
pseud_id: user1.default_pseud.id,
tag_string: freeform1.name)
FactoryBot.create(:bookmark, bookmarkable_id: work4.id, pseud_id: pseud1.id)
FactoryBot.create(:bookmark,
bookmarkable_id: work5.id,
pseud_id: pseud2.id,
bookmarker_notes: "Left me with a broken heart")
FactoryBot.create(:bookmark,
bookmarkable_id: external1.id,
bookmarkable_type: "ExternalWork",
pseud_id: pseud2.id,
bookmarker_notes: "I enjoyed this")
FactoryBot.create(:bookmark,
bookmarkable_id: series1.id,
bookmarkable_type: "Series",
pseud_id: user1.default_pseud.id,
tag_string: freeform1.name)
FactoryBot.create(:bookmark,
bookmarkable_id: series2.id,
bookmarkable_type: "Series",
pseud_id: pseud2.id,
rec: true,
bookmarker_notes: "A new classic")
step %{all indexing jobs have been run}
end
Given /^I have bookmarks to search by any field$/ do
work1 = FactoryBot.create(:work,
title: "Comfort",
freeform_string: "hurt a little comfort but only so much")
work2 = FactoryBot.create(:work, title: "Hurt and that's it")
work3 = FactoryBot.create(:work, title: "Fluff")
external1 = FactoryBot.create(:external_work,
title: "External Whump",
author: "im hurt")
external2 = FactoryBot.create(:external_work, title: "External Fix-It")
series1 = FactoryBot.create(:series_with_a_work,
title: "H/C Series",
summary: "Hurt & comfort ficlets")
series2 = FactoryBot.create(:series_with_a_work, title: "Ouchless Series")
FactoryBot.create(:bookmark, bookmarkable_id: work1.id, bookmarker_notes: "whatever")
FactoryBot.create(:bookmark, bookmarkable_id: work2.id, tag_string: "more please")
FactoryBot.create(:bookmark, bookmarkable_id: work3.id, bookmarker_notes: "more please")
FactoryBot.create(:bookmark,
bookmarkable_id: external1.id,
bookmarkable_type: "ExternalWork",
bookmarker_notes: "please rec me more like this")
FactoryBot.create(:bookmark,
bookmarkable_id: external2.id,
bookmarkable_type: "ExternalWork",
tag_string: "please no more pain")
FactoryBot.create(:bookmark,
bookmarkable_id: series1.id,
bookmarkable_type: "Series",
bookmarker_notes: "needs more comfort please")
FactoryBot.create(:bookmark,
bookmarkable_id: series2.id,
bookmarkable_type: "Series",
pseud_id: FactoryBot.create(:pseud, name: "more please").id)
step %{all indexing jobs have been run}
end
Given /^I have bookmarks to search by dates$/ do
work1 = nil
series1 = nil
external1 = nil
Timecop.freeze(901.days.ago) do
work1 = FactoryBot.create(:work, title: "Old work")
FactoryBot.create(:bookmark,
bookmarkable_id: work1.id,
bookmarker_notes: "Old bookmark of old work")
series1 = FactoryBot.create(:series_with_a_work, title: "Old series")
FactoryBot.create(:bookmark,
bookmarkable_id: series1.id,
bookmarkable_type: "Series",
bookmarker_notes: "Old bookmark of old series")
external1 = FactoryBot.create(:external_work, title: "Old external")
FactoryBot.create(:bookmark,
bookmarkable_id: external1.id,
bookmarkable_type: "ExternalWork",
bookmarker_notes: "Old bookmark of old external work")
end
FactoryBot.create(:bookmark,
bookmarkable_id: work1.id,
bookmarker_notes: "New bookmark of old work")
FactoryBot.create(:bookmark,
bookmarkable_id: series1.id,
bookmarkable_type: "Series",
bookmarker_notes: "New bookmark of old series")
FactoryBot.create(:bookmark,
bookmarkable_id: external1.id,
bookmarkable_type: "ExternalWork",
bookmarker_notes: "New bookmark of old external work")
work2 = FactoryBot.create(:work, title: "New work")
FactoryBot.create(:bookmark,
bookmarkable_id: work2.id,
bookmarker_notes: "New bookmark of new work")
series2 = FactoryBot.create(:series_with_a_work, title: "New series")
FactoryBot.create(:bookmark,
bookmarkable_id: series2.id,
bookmarkable_type: "Series",
bookmarker_notes: "New bookmark of new series")
external2 = FactoryBot.create(:external_work, title: "New external")
FactoryBot.create(:bookmark,
bookmarkable_id: external2.id,
bookmarkable_type: "ExternalWork",
bookmarker_notes: "New bookmark of new external work")
step %{all indexing jobs have been run}
end
Given /^I have bookmarks of various completion statuses to search$/ do
complete_work = FactoryBot.create(:work, title: "Finished Work")
incomplete_work = FactoryBot.create(:work, title: "Incomplete Work", complete: false, expected_number_of_chapters: 2)
complete_series = FactoryBot.create(:series_with_a_work, title: "Complete Series", complete: true)
incomplete_series = FactoryBot.create(:series_with_a_work, title: "Incomplete Series", complete: false)
external_work = FactoryBot.create(:external_work, title: "External Work")
FactoryBot.create(:bookmark, bookmarkable_id: complete_work.id)
FactoryBot.create(:bookmark, bookmarkable_id: incomplete_work.id)
FactoryBot.create(:bookmark, bookmarkable_id: complete_series.id, bookmarkable_type: "Series")
FactoryBot.create(:bookmark, bookmarkable_id: incomplete_series.id, bookmarkable_type: "Series")
FactoryBot.create(:bookmark, bookmarkable_id: external_work.id, bookmarkable_type: "ExternalWork")
step %{all indexing jobs have been run}
end
Given /^I have bookmarks of old series to search$/ do
step %{basic tags}
step %{the user "creator" exists and is activated}
creator = User.find_by(login: "creator").default_pseud
Timecop.freeze(30.days.ago) do
older_work = FactoryBot.create(:work, title: "WIP in a Series", authors: [creator])
older_series = FactoryBot.create(:series, title: "Older WIP Series", works: [older_work])
FactoryBot.create(:bookmark,
bookmarkable_id: older_series.id,
bookmarkable_type: "Series")
end
Timecop.freeze(7.days.ago) do
newer_series = FactoryBot.create(:series_with_a_work, title: "Newer Complete Series")
FactoryBot.create(:bookmark,
bookmarkable_id: newer_series.id,
bookmarkable_type: "Series")
end
end
# Freeform is omitted because there is no freeform option on the bookmark external work form
Given /^bookmarks of all types tagged with the (character|relationship|fandom) tag "(.*?)"$/ do |tag_type, tag|
work = if tag_type == "character"
FactoryBot.create(:work,
title: "BookmarkedWork",
character_string: tag)
elsif tag_type == "relationship"
FactoryBot.create(:work,
title: "BoomarkedWork",
relationship_string: tag)
elsif tag_type == "fandom"
FactoryBot.create(:work,
title: "BookmarkedWork",
fandom_string: tag)
end
FactoryBot.create(:bookmark, bookmarkable_id: work.id, bookmarkable_type: "Work")
step %{bookmarks of external works and series tagged with the #{tag_type} tag "#{tag}"}
end
# Freeform is omitted because there is no freeform option on the bookmark external work form
Given /^bookmarks of external works and series tagged with the (character|relationship|fandom) tag "(.*?)"$/ do |tag_type, tag|
# Series get their tags from works, so we have to create the work first
work = if tag_type == "character"
FactoryBot.create(:work, character_string: tag)
elsif tag_type == "relationship"
FactoryBot.create(:work, relationship_string: tag)
elsif tag_type == "fandom"
FactoryBot.create(:work, fandom_string: tag)
end
# We're going to need to use the series ID, so make the series
series = FactoryBot.create(:series, title: "BookmarkedSeries")
# Now add the work to the series
FactoryBot.create(:serial_work, work_id: work.id, series_id: series.id)
external_work = if tag_type == "character"
FactoryBot.create(:external_work, title: "BookmarkedExternalWork", character_string: tag)
elsif tag_type == "relationship"
FactoryBot.create(:external_work, title: "BookmarkedExternalWork", relationship_string: tag)
elsif tag_type == "fandom"
FactoryBot.create(:external_work, title: "BookmarkedExternalWork", fandom_string: tag)
end
FactoryBot.create(:bookmark,
bookmarkable_id: series.id,
bookmarkable_type: "Series")
FactoryBot.create(:bookmark,
bookmarkable_id: external_work.id,
bookmarkable_type: "ExternalWork")
step %{all indexing jobs have been run}
end
Given /^"(.*?)" has bookmarks of works in various languages$/ do |user|
step %{the user "#{user}" exists and is activated}
user_pseud = User.find_by(login: user).default_pseud
lang_en = Language.find_or_create_by!(name: "English", short: "en")
lang_de = Language.find_or_create_by!(name: "Deutsch", short: "de")
work1 = FactoryBot.create(:work, title: "english work", language_id: lang_en.id)
work2 = FactoryBot.create(:work, title: "german work", language_id: lang_de.id)
FactoryBot.create(:bookmark, bookmarkable_id: work1.id, pseud_id: user_pseud.id)
FactoryBot.create(:bookmark, bookmarkable_id: work2.id, pseud_id: user_pseud.id)
step %{all indexing jobs have been run}
end
Given "{string} has a bookmark of a work titled {string}" do |user, title|
step %{the user "#{user}" exists and is activated}
user_pseud = User.find_by(login: user).default_pseud
work1 = FactoryBot.create(:work, title: title)
FactoryBot.create(:bookmark,
bookmarkable: work1,
pseud: user_pseud)
step %{all indexing jobs have been run}
end
Given "pseud {string} has a bookmark of a work titled {string} by {string}" do |pseud, title, creator|
pseud = Pseud.find_by(name: pseud)
work = FactoryBot.create(:work, title: title, authors: [ensure_user(creator).default_pseud])
FactoryBot.create(:bookmark, bookmarkable: work, pseud: pseud)
step %{all indexing jobs have been run}
end
def submit_bookmark_form(pseud, note, tags)
select(pseud, from: "bookmark_pseud_id") unless pseud.nil?
fill_in("bookmark_notes", with: note) unless note.nil?
fill_in("Your tags", with: tags) unless tags.nil?
click_button("Create")
step %{all indexing jobs have been run}
end
When /^I bookmark the work "(.*?)"(?: as "(.*?)")?(?: with the note "(.*?)")?(?: with the tags "(.*?)")?$/ do |title, pseud, note, tags|
step %{I start a new bookmark for "#{title}"}
submit_bookmark_form(pseud, note, tags)
end
When /^I bookmark the work "(.*?)"(?: as "(.*?)")?(?: with the note "(.*?)")?(?: with the tags "(.*?)")? from new bookmark page$/ do |title, pseud, note, tags|
step %{I go to the new bookmark page for work "#{title}"}
submit_bookmark_form(pseud, note, tags)
end
When /^I bookmark the series "([^\"]*)"$/ do |series_title|
series = Series.find_by(title: series_title)
visit series_path(series)
click_link("Bookmark Series")
click_button("Create")
step %{all indexing jobs have been run}
end
When /^I start a new bookmark for "([^\"]*)"$/ do |title|
step %{I open the bookmarkable work "#{title}"}
click_link("Bookmark")
end
When /^I start a new bookmark$/ do
step %{I start a new bookmark for "#{DEFAULT_TITLE}"}
end
When /^I bookmark the works "([^\"]*)"$/ do |worklist|
worklist.split(/, ?/).each do |work_title|
step %{I bookmark the work "#{work_title}"}
step %{it is currently 1 second from now}
end
end
When /^I edit the bookmark for "([^\"]*)"$/ do |title|
step %{I open the bookmarkable work "#{title}"}
click_link("Edit Bookmark")
end
When /^I open a bookmarkable work$/ do
step %{I open the bookmarkable work "#{DEFAULT_TITLE}"}
end
When /^I open the bookmarkable work "([^\"]*)"$/ do |title|
work = Work.find_by(title: title)
work ||= FactoryBot.create(:work, title: title)
visit work_path(work)
end
When /^I add my bookmark to the collection "([^\"]*)"$/ do |collection_name|
step %{I follow "Add To Collection"}
fill_in("collection_names", with: collection_name)
click_button("Add")
end
When /^I rec the current work$/ do
click_link("Bookmark")
check("bookmark_rec")
click_button("Create")
step %{all indexing jobs have been run}
end
When(/^I attempt to create a bookmark of "([^"]*)" with a pseud that is not mine$/) do |work|
step %{I am logged in as "commenter"}
step %{I start a new bookmark for "#{work}"}
pseud_id = User.first.pseuds.first.id
find("#bookmark_pseud_id", visible: false).set(pseud_id)
click_button "Create"
end
When(/^I attempt to transfer my bookmark of "([^"]*)" to a pseud that is not mine$/) do |work|
step %{the user "not_the_bookmarker" exists and is activated}
step %{I edit the bookmark for "#{work}"}
pseud_id = User.find_by(login: "not_the_bookmarker").pseuds.first.id
find("#bookmark_pseud_id", visible: false).set(pseud_id)
click_button "Update"
end
When(/^I use the bookmarklet on a previously bookmarked URL$/) do
url = ExternalWork.first.url
visit new_external_work_path(params: { url_from_external: url })
step %{all AJAX requests are complete}
end
Then /^the bookmark on "([^\"]*)" should have tag "([^\"]*)"$$/ do |title, tag|
work = Work.find_by(title: title)
bookmark = work.bookmarks.first
bookmark.reload
bookmark.tags.collect(&:name).include?(tag)
end
Then /^the ([\d]+)(?:st|nd|rd|th) bookmark result should contain "([^"]*)"$/ do |n, text|
selector = "ol.bookmark > li:nth-of-type(#{n})"
with_scope(selector) do
page.should have_content(text)
end
end
Then /^the cache of the bookmark on "([^\"]*)" should expire after I edit the bookmark tags$/ do |title|
work = Work.find_by(title: title)
bookmark = work.bookmarks.first
orig_cache_key = bookmark.cache_key
Kernel::sleep 1
visit edit_bookmark_path(bookmark)
fill_in("bookmark_tag_string", with: "New Tag")
click_button("Update")
bookmark.reload
assert orig_cache_key != bookmark.cache_key, "Cache key #{orig_cache_key} matches #{bookmark.cache_key}."
end
Then /^the cache of the bookmark on "([^\"]*)" should not expire if I have not edited the bookmark$/ do |title|
work = Work.find_by(title: title)
bookmark = work.bookmarks.first
orig_cache_key = bookmark.cache_key
Kernel::sleep 1
visit edit_bookmark_path(bookmark)
visit bookmark_path(bookmark)
bookmark.reload
assert orig_cache_key == bookmark.cache_key, "Cache key #{orig_cache_key} does not match #{bookmark.cache_key}."
end