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

156 lines
5.8 KiB
Ruby

When /^I view the series "([^\"]*)"$/ do |series|
visit series_path(Series.find_by(title: series))
end
Given "there are {int} works per series page" do |amount|
allow(WillPaginate).to receive(:per_page).and_return(amount)
end
When /^I add the series "([^\"]*)"$/ do |series_title|
check("series-options-show")
if Series.find_by(title: series_title)
step %{I select "#{series_title}" from "work_series_attributes_id"}
else
fill_in("work_series_attributes_title", with: series_title)
end
end
When /^I add the work "([^\"]*)" to (?:the )?series "([^\"]*)"(?: as "([^"]*)")?$/ do |work_title, series_title, pseud|
if Work.where(title: work_title).exists?
# an existing work
step %{I edit the work "#{work_title}"}
else
# a new work
step "I set up the draft \"#{work_title}\""
end
if pseud
select(pseud, from: "work_author_attributes_ids")
end
step %{I add the series "#{series_title}"}
click_button("Post")
end
When /^I add the draft "([^\"]*)" to series "([^\"]*)"$/ do |work_title, series_title|
step %{I edit the work "#{work_title}"}
step %{I add the series "#{series_title}"}
click_button("Save As Draft")
end
When /^I add the work "([^\"]*)" to "(\d+)" series "([^\"]*)"$/ do |work_title, count, series_title|
work = Work.find_by(title: work_title)
if work.blank?
step "the draft \"#{work_title}\""
work = Work.find_by(title: work_title)
visit preview_work_path(work)
click_button("Post")
step "I should see \"Work was successfully posted.\""
step %{all indexing jobs have been run}
step "the periodic tag count task is run"
end
count.to_i.times do |i|
step "I edit the work \"#{work_title}\""
check("series-options-show")
fill_in("work_series_attributes_title", with: series_title + i.to_s)
click_button("Post")
end
end
When /^I reorder the (\d+)(?:st|nd|rd|th) work to be below the (\d+)(?:st|nd|rd|th) work in the series$/ do |n1, n2|
# Step only accounts for downward changes through a downward offset.
assert n1 < n2
draggable = find(".serial-position-list:nth-child(#{n1})")
droppable = find(".serial-position-list:nth-child(#{n2})")
# Capybara's drag_to method doesn't work well with this jQuery sortable list that has a default tolerance of "intersect".
# Using another way to simulate dragging. Credit to https://stackoverflow.com/questions/72369314/
webdriver = page.driver.browser
webdriver.action.click_and_hold(draggable.native).perform
step "I wait 1 second" # a delay is necessary.
# Add downward offset to make the rearrangement register.
webdriver.action.move_to(droppable.native, 0, 10).release.perform
step "all AJAX requests are complete"
end
When /^I delete the series "([^"]*)"$/ do |series|
step %{I view the series "#{series}"}
step %{I follow "Delete Series"}
step %{I press "Yes, Delete Series"}
step %{I should see "Series was successfully deleted."}
step %{all indexing jobs have been run}
end
Then /^the series "(.*)" should be deleted/ do |series|
assert Series.where(title: series).first.nil?
end
Then /^the work "([^\"]*)" should be part of the "([^\"]*)" series in the database$/ do |work_title, series_title|
work = Work.find_by(title: work_title)
series = Series.find_by(title: series_title)
assert SerialWork.where(series_id: series, work_id: work).exists?
end
Then /^the work "([^\"]*)" should not be visible on the "([^\"]*)" series page$/ do |work_title, series_title|
series = Series.find_by(title: series_title)
visit series_path(series)
page.should_not have_content(work_title)
end
Then /^the series "([^\"]*)" should not be visible on the "([^\"]*)" work page$/ do |series_title, work_title|
work = Work.find_by(title: work_title)
visit work_path(work)
page.should_not have_content(series_title)
end
Then /^the work "([^\"]*)" should be visible on the "([^\"]*)" series page$/ do |work_title, series_title|
series = Series.find_by(title: series_title)
visit series_path(series)
page.should have_content(work_title)
end
Then /^the series "([^\"]*)" should be visible on the "([^\"]*)" work page$/ do |series_title, work_title|
work = Work.find_by(title: work_title)
series = Series.find_by(title: series_title)
visit work_path(work)
page.should have_content(series_title)
page.should have_content("Part #{SerialWork.where(series_id: series, work_id: work).first.position}")
end
Then /^the neighbors of "([^\"]*)" in the "([^\"]*)" series should link over it$/ do |work_title, series_title|
work = Work.find_by(title: work_title)
series = Series.find_by(title: series_title)
position = SerialWork.where(series_id: series, work_id: work).first.position
neighbors = SerialWork.where(series_id: series, position: [position - 1, position + 1])
neighbors.each_with_index do |neighbor, index|
visit work_path(neighbor.work)
# the neighbors should link to each other if they both exist
if neighbors.count > 1 && index == 0
click_link("Next Work →")
page.should_not have_content(work_title)
page.should have_content(neighbors[1].work.title)
elsif neighbors.count > 1 && index == 1
click_link("← Previous Work")
page.should_not have_content(work_title)
page.should have_content(neighbors[0].work.title)
end
end
end
Then /^the neighbors of "([^\"]*)" in the "([^\"]*)" series should link to it$/ do |work_title, series_title|
work = Work.find_by(title: work_title)
series = Series.find_by(title: series_title)
position = SerialWork.where(series_id: series, work_id: work).first.position
neighbors = SerialWork.where(series_id: series, position: [position - 1, position + 1])
neighbors.each do |neighbor|
visit work_path(neighbor.work)
if neighbor.position > position
click_link("← Previous Work")
page.should have_content(work_title)
else
click_link("Next Work →")
page.should have_content(work_title)
end
end
end