### GIVEN Given /^the following admin settings are configured:$/ do |table| admin_settings = AdminSetting.first admin_settings.assign_attributes(table.rows_hash.symbolize_keys) # Skip validations which require setting an admin as the last updater. admin_settings.save!(validate: false) end Given /the following admins? exists?/ do |table| table.hashes.each do |hash| FactoryBot.create(:admin, hash) end end Given "I am logged in as a super admin" do step %{I am logged in as a "superadmin" admin} end Given "I am logged in as a(n) {string} admin" do |role| step "I start a new session" login = "testadmin-#{role}" email = "#{login}@example.org" FactoryBot.create(:admin, login: login, email: email, roles: [role], password: "adminpassword") if Admin.find_by(login: login, email: email).nil? visit new_admin_session_path fill_in "Admin username", with: login fill_in "Admin password", with: "adminpassword" click_button "Log In as Admin" step %{I should see "Successfully logged in"} end Given "I am logged in as an admin" do step "I start a new session" FactoryBot.create(:admin, login: "testadmin", email: "testadmin@example.org", password: "adminpassword") if Admin.find_by(login: "testadmin").nil? visit new_admin_session_path fill_in "Admin username", with: "testadmin" fill_in "Admin password", with: "adminpassword" click_button "Log In as Admin" step %{I should see "Successfully logged in"} end Given /^basic languages$/ do Language.default german = Language.find_or_create_by(short: "DE", name: "Deutsch", support_available: true, abuse_support_available: true) Locale.create(iso: "de", name: "Deutsch", language: german) end Given /^Persian language$/ do Language.default persian = Language.find_or_create_by(short: "fa", name: "Persian", support_available: true, abuse_support_available: true) Locale.create(iso: "fa", name: "Persian", language: persian) end Given /^downloads are off$/ do step("I am logged in as a super admin") visit(admin_settings_path) uncheck("Allow downloads") click_button("Update") end Given /^tag wrangling is off$/ do step(%{I am logged in as a "tag_wrangling" admin}) visit(admin_settings_path) step(%{I check "Turn off tag wrangling for non-admins"}) step(%{I press "Update"}) step("I log out") end Given /^tag wrangling is on$/ do step(%{I am logged in as a "tag_wrangling" admin}) visit(admin_settings_path) step(%{I uncheck "Turn off tag wrangling for non-admins"}) step(%{I press "Update"}) step("I log out") end Given /^the support form is disabled and its text field set to "Please don't contact us"$/ do step(%{I am logged in as a "support" admin}) visit(admin_settings_path) check("Turn off support form") fill_in(:admin_setting_disabled_support_form_text, with: "Please don't contact us") click_button("Update") end Given /^the support form is enabled$/ do step(%{I am logged in as a "support" admin}) visit(admin_settings_path) uncheck("Turn off support form") click_button("Update") end Given "guest comments are on" do step("I am logged in as a super admin") visit(admin_settings_path) uncheck("Turn off guest comments across the site") click_button("Update") end Given "guest comments are off" do step("I am logged in as a super admin") visit(admin_settings_path) check("Turn off guest comments across the site") click_button("Update") end Given "account age threshold for comment spam check is set to {int} days" do |days| step("I am logged in as a super admin") visit(admin_settings_path) fill_in("admin_setting_account_age_threshold_for_comment_spam_check", with: days) click_button("Update") end Given "I have posted known issues" do step %{I am logged in as a super admin} step %{I follow "Admin Posts"} step %{I follow "Known Issues" within "#header"} step %{I follow "make a new known issues post"} step %{I fill in "known_issue_title" with "First known problem"} step %{I fill in "content" with "This is a bit of a problem"} step %{I press "Post"} end Given /^I have posted an admin post$/ do step(%{I am logged in as a "communications" admin}) step("I make an admin post") step("I log out") end Given "the admin post {string}" do |title| FactoryBot.create(:admin_post, title: title, comment_permissions: :enable_all) end Given "the fannish next of kin {string} for the user {string}" do |kin, user| user = ensure_user(user) kin = ensure_user(kin) user.create_fannish_next_of_kin(kin: kin, kin_email: "fnok@example.com") end Given "the user {string} is suspended" do |user| step %{the user "#{user}" exists and is activated} step %{I am logged in as a "policy_and_abuse" admin} step %{I go to the user administration page for "#{user}"} choose("admin_action_suspend") fill_in("suspend_days", with: 30) fill_in("Notes", with: "Why they are suspended") click_button("Update") end Given /^the user "([^\"]*)" is banned$/ do |user| step %{the user "#{user}" exists and is activated} step(%{I am logged in as a "policy_and_abuse" admin}) step %{I go to the user administration page for "#{user}"} choose("admin_action_ban") fill_in("Notes", with: "Why they are banned") click_button("Update") end Then /^the user "([^\"]*)" should be permanently banned$/ do |user| u = User.find_by(login: user) assert u.banned? end Given /^I have posted an admin post without paragraphs$/ do step(%{I am logged in as a "communications" admin}) step("I make an admin post without paragraphs") step("I log out") end Given /^I have posted an admin post with tags "(.*?)"$/ do |tags| step(%{I am logged in as a "communications" admin}) visit new_admin_post_path fill_in("admin_post_title", with: "Default Admin Post") fill_in("content", with: "Content of the admin post.") fill_in("admin_post_tag_list", with: tags) click_button("Post") end Given(/^the following language exists$/) do |table| table.hashes.each do |hash| FactoryBot.create(:language, hash) end end Given /^I have posted an admin post with guest comments disabled$/ do step %{I am logged in as a "communications" admin} step %{I start to make an admin post} choose("Only registered users can comment") click_button("Post") step %{I log out} end Given /^I have posted an admin post with comments disabled$/ do step %{I am logged in as a "communications" admin} step %{I start to make an admin post} choose("No one can comment") click_button("Post") step %{I log out} end Given "an abuse ticket ID exists" do ticket = { "departmentId" => ArchiveConfig.ABUSE_ZOHO_DEPARTMENT_ID, "status" => "Open", "webUrl" => Faker::Internet.url } allow_any_instance_of(ZohoResourceClient).to receive(:find_ticket).and_return(ticket) end Given "a work {string} with the original creator {string}" do |title, creator| step %{the work "#{title}" by "#{creator}"} step %{I have an orphan account} step %{"#{creator}" orphans and takes their pseud off the work "#{title}"} end Given "the admin {string} is locked" do |login| admin = Admin.find_by(login: login) || FactoryBot.create(:admin, login: login) # Same as script/lock_admin.rb admin.lock_access!({ send_instructions: false }) end Given "the admin {string} is unlocked" do |login| admin = Admin.find_by(login: login) || FactoryBot.create(:admin, login: login) # Same as script/unlock_admin.rb admin.unlock_access! end Given "there is/are {int} user creation(s) per page" do |amount| allow(Work).to receive(:per_page).and_return(amount) allow(Comment).to receive(:per_page).and_return(amount) end Given "an archive FAQ category with the title {string} exists" do |title| FactoryBot.create(:archive_faq, title: title) end Given "the app name is {string}" do |app_name| allow(ArchiveConfig).to receive(:APP_NAME).and_return(app_name) end ### WHEN When /^I visit the last activities item$/ do visit("/admin/activities/#{AdminActivity.last.id}") end When /^I fill in "([^"]*)" with "([^"]*)'s" invite code$/ do |field, login| user = User.find_by(login: login) token = user.invitations.first.token fill_in(field, with: token) end When "I start to make an admin post" do visit new_admin_post_path fill_in("admin_post_title", with: "Default Admin Post") fill_in("content", with: "Content of the admin post.") end When /^I make an admin post$/ do step %(I start to make an admin post) click_button("Post") end When /^I make an admin post without paragraphs$/ do visit new_admin_post_path fill_in("admin_post_title", with: "Admin Post Without Paragraphs") fill_in("content", with: "") click_button("Post") end When /^I make a multi-question FAQ post$/ do visit new_archive_faq_path fill_in("Question*", with: "Number 1 Question.") fill_in("Answer*", with: "Number 1 posted FAQ, this is.") fill_in("Category name*", with: "Standard FAQ Category") fill_in("Anchor name*", with: "Number1anchor") click_button("Post") step %{I follow "Edit"} step %{I fill in "Questions:" with "3"} step %{I press "Update Form"} fill_in("archive_faq_questions_attributes_1_question", with: "Number 2 Question.") fill_in("archive_faq_questions_attributes_1_content", with: "This is an answer to the second question") fill_in("archive_faq_questions_attributes_1_anchor", with: "whatisao32") fill_in("archive_faq_questions_attributes_2_question", with: "Number 3 Question.") fill_in("archive_faq_questions_attributes_2_content", with: "This is an answer to the third question") fill_in("archive_faq_questions_attributes_2_anchor", with: "whatisao33") click_button("Post") end When "{int} Archive FAQ(s) exist(s)" do |n| (1..n).each do |i| FactoryBot.create(:archive_faq, id: i, title: "The #{i} FAQ") end end When "{int} Archive FAQ(s) with {int} question(s) exist(s)" do |faqs, questions| (1..faqs).each do |i| archive_faq = FactoryBot.create(:archive_faq, id: i) (1..questions).each do FactoryBot.create(:question, archive_faq: archive_faq) end end end When "the invite_from_queue_at is yesterday" do AdminSetting.first.update_attribute(:invite_from_queue_at, Time.current - 1.day) end When "the scheduled check_invite_queue job is run" do Resque.enqueue(AdminSetting, :check_queue) end When "I edit known issues" do step %{I follow "Admin Posts"} step %{I follow "Known Issues" within "#header"} step %{I follow "Edit"} step %{I fill in "known_issue_title" with "More known problems"} step %{I fill in "content" with "This is a bit of a problem, and this is too"} step %{I press "Post"} end When "I delete known issues" do step %{I follow "Admin Posts"} step %{I follow "Known Issues" within "#header"} step %{I follow "Delete"} end When "I check the {string} role checkbox" do |role| role_id = Role.find_by(name: role).id check("user_roles_#{role_id}") end When "I uncheck the {string} role checkbox" do |role| role_id = Role.find_by(name: role).id uncheck("user_roles_#{role_id}") end When /^I make a translation of an admin post( with tags "(.*?)")?$/ do |tags| admin_post = AdminPost.find_by(title: "Default Admin Post") # If post doesn't exist, assume we want to reference a non-existent post admin_post_id = !admin_post.nil? ? admin_post.id : 0 visit new_admin_post_path fill_in("admin_post_title", with: "Deutsch Ankuendigung") fill_in("content", with: "Deutsch Woerter") step %{I select "Deutsch" from "Choose a language"} fill_in("admin_post_translated_post_id", with: admin_post_id) fill_in("admin_post_tag_list", with: tags) if tags click_button("Post") end When /^I hide the work "(.*?)"$/ do |title| work = Work.find_by(title: title) visit work_path(work) step %{I follow "Hide Work"} end When "I unhide the work {string}" do |title| work = Work.find_by(title: title) visit work_path(work) step %{I follow "Make Work Visible"} end When "the search criteria contains the ID for {string}" do |login| user_id = User.find_by(login: login).id fill_in("user_id", with: user_id) end When "it is past the admin password reset token's expiration date" do days = ArchiveConfig.DAYS_UNTIL_ADMIN_RESET_PASSWORD_LINK_EXPIRES + 1 step "it is currently #{days} days from now" end When "I confirm I want to remove the pseud" do expect(page.accept_alert).to eq("Are you sure you want to remove the creator's pseud from this work?") if @javascript end When "I follow the first invitation token url" do first('//td/a[href*="/invitations/"]').click end ### THEN Then (/^the translation information should still be filled in$/) do step %{the "admin_post_title" field should contain "Deutsch Ankuendigung"} step %{the "content" field should contain "Deutsch Woerter"} step %{"Deutsch" should be selected within "Choose a language"} end Then /^I should see a translated admin post( with tags "(.*?)")?$/ do |tags| tags = tags.split(/, ?/) if tags step %{I go to the admin-posts page} step %{I should see "Default Admin Post"} step %{I should see "Tags: #{tags.join(' ')}"} if tags step %{I should see "Translations: Deutsch"} step %{I follow "Default Admin Post"} step %{I should see "Deutsch" within "dd.translations"} step %{I follow "Deutsch"} step %{I should see "Deutsch Woerter"} tags&.each do |tag| step %{I should see "#{tag}" within "dd.tags"} end end Then (/^I should not see a translated admin post$/) do step %{I go to the admin-posts page} step %{I should see "Default Admin Post"} step %{I should see "Deutsch Ankuendigung"} step %{I follow "Default Admin Post"} step %{I should not see "Translations: Deutsch"} end Then "the {string} role checkbox should be checked" do |role| role_id = Role.find_by(name: role).id assert has_checked_field?("user_roles_#{role_id}") end Then "the {string} role checkbox should not be checked" do |role| role_id = Role.find_by(name: role).id assert has_unchecked_field?("user_roles_#{role_id}") end Then /^the work "([^\"]*)" should be hidden$/ do |work| w = Work.find_by_title(work) user = w.pseuds.first.user.login step %{logged out users should not see the hidden work "#{work}" by "#{user}"} step %{logged in users should not see the hidden work "#{work}" by "#{user}"} end Then /^the work "([^\"]*)" should not be hidden$/ do |work| w = Work.find_by_title(work) user = w.pseuds.first.user.login step %{logged out users should see the unhidden work "#{work}" by "#{user}"} step %{logged in users should see the unhidden work "#{work}" by "#{user}"} end Then /^logged out users should not see the hidden work "([^\"]*)" by "([^\"]*)"?/ do |work, user| step "I am a visitor" step %{I should not see the hidden work "#{work}" by "#{user}"} end Then /^logged in users should not see the hidden work "([^\"]*)" by "([^\"]*)"?/ do |work, user| step %{I am logged in as a random user} step %{I should not see the hidden work "#{work}" by "#{user}"} end Then /^I should not see the hidden work "([^\"]*)" by "([^\"]*)"?/ do |work, user| step %{I am on #{user}'s works page} step %{I should not see "#{work}"} step %{I view the work "#{work}"} step %{I should see "Sorry, you don't have permission to access the page you were trying to reach."} end Then /^"([^\"]*)" should see their work "([^\"]*)" is hidden?/ do |user, work| step %{I am logged in as "#{user}"} step %{I am on #{user}'s works page} step %{I should not see "#{work}"} step %{I view the work "#{work}"} step %{I should see the image "title" text "Hidden by Administrator"} end Then /^logged out users should see the unhidden work "([^\"]*)" by "([^\"]*)"?/ do |work, user| step "I am a visitor" step %{I should see the unhidden work "#{work}" by "#{user}"} end Then /^logged in users should see the unhidden work "([^\"]*)" by "([^\"]*)"?/ do |work, user| step %{I am logged in as a random user} step %{I should see the unhidden work "#{work}" by "#{user}"} end Then /^I should see the unhidden work "([^\"]*)" by "([^\"]*)"?/ do |work, user| step %{I am on #{user}'s works page} step %{I should see "#{work}"} step %{I view the work "#{work}"} step %{I should see "#{work}"} end Then(/^the work "(.*?)" should not be deleted$/) do |work| w = Work.find_by(title: work) assert w && w.posted? end Then(/^there should be no bookmarks on the work "(.*?)"$/) do |work| w = Work.find_by(title: work) assert w.bookmarks.count == 0 end Then(/^there should be no comments on the work "(.*?)"$/) do |work| w = Work.find_by(title: work) assert w.comments.count == 0 end When(/^the user "(.*?)" is unbanned in the background/) do |user| u = User.find_by(login: user) u.update_attribute(:banned, false) end Given "I have banned the address {string}" do |email| visit admin_blacklisted_emails_url fill_in("Email to ban", with: email) click_button("Ban Email") end Given "I have banned the address for user {string}" do |user| visit admin_blacklisted_emails_url u = User.find_by(login: user) fill_in("admin_blacklisted_email_email", with: u.email) click_button("Ban Email") end Then "the address {string} should be banned" do |email| visit admin_blacklisted_emails_url fill_in("Email to find", with: email) click_button("Search Banned Emails") assert page.should have_content(email) end Then "the address {string} should not be banned" do |email| visit admin_blacklisted_emails_url fill_in("Email to find", with: email) click_button("Search Banned Emails") step %{I should see "0 emails found"} end Then "I should not be able to add the email {string} to the invite queue" do |email| step %{I am on the homepage} click_link "Get an Invitation" fill_in "Email", with: email click_button "Add me to the list" expect(page).to have_content("Sorry! We couldn't save this invite request because:") expect(page).to have_content("Email has been blocked at the owner's request. That means it can't be used for invitations. Please check the address to make sure it's yours to use and contact AO3 Support if you have any questions.") end Then(/^I should not be able to comment with the address "([^"]*)"$/) do |email| step %{the work "New Work"} step %{I post the comment "I loved this" on the work "New Work" as a guest with email "#{email}"} step %{I should see "has been blocked at the owner's request"} step %{I should not see "Comment created!"} end Then(/^I should be able to comment with the address "([^"]*)"$/) do |email| step %{the work "New Work"} step %{I post the comment "I loved this" on the work "New Work" as a guest with email "#{email}"} step %{I should not see "has been blocked at the owner's request"} step %{I should see "Comment created!"} end Then /^the work "([^\"]*)" should be marked as spam/ do |work| w = Work.find_by_title(work) assert w.spam? end Then /^the work "([^\"]*)" should not be marked as spam/ do |work| w = Work.find_by_title(work) assert !w.spam? end Then "I should see {int} admin activity log entry/entries" do |count| expect(page).to have_css("tr[id^=admin_activity_]", count: count) end Then /^the user content should be shown as right-to-left$/ do page.should have_xpath("//div[contains(@class, 'userstuff') and @dir='rtl']") end Then "I should see the original creator {string}" do |creator| user = User.find_by(login: creator) expect(page).to have_selector(".original_creators", text: "#{user.id} (#{creator})") end Then "the history table should show that {string} was {word} as next of kin" do |username, action| user_id = User.find_by(login: username).id step %{I should see "Fannish Next of Kin #{action.capitalize}: #{user_id}" within "#user_history"} end Then "the history table should show they were {word} as next of kin of {string}" do |action, username| user_id = User.find_by(login: username).id step %{I should see "#{action.capitalize} as Fannish Next of Kin for: #{user_id}" within "#user_history"} end