otwarchive-symphonyarchive/spec/controllers/opendoors/tools_controller_spec.rb
2026-03-11 22:22:11 +00:00

107 lines
4.7 KiB
Ruby

require "spec_helper"
describe Opendoors::ToolsController do
include LoginMacros
include RedirectExpectationHelper
let(:user) { create(:user) }
let(:opendoors_user) { create(:opendoors_user) }
describe "GET #index" do
it "denies access if not logged in with Open Doors privileges" do
fake_logout
get :index
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
fake_login_known_user(user)
get :index
it_redirects_to_with_error(user_path(user), "Sorry, you don't have permission to access the page you were trying to reach.")
end
context "when logged in with Open Doors privileges" do
before { fake_login_known_user(opendoors_user) }
it "shows the tools page" do
get :index
expect(response).to render_template("index")
expect(assigns(:external_author)).to be_a_new(ExternalAuthor)
expect(assigns(:imported_from_url)).to be_nil
end
it "optionally recognizes the imported-from URL" do
url = "http://example.com"
get :index, params: { imported_from_url: url }
expect(assigns(:imported_from_url)).to eq(url)
end
end
end
describe "POST #url_update" do
it "denies access if not logged in with Open Doors privileges" do
fake_logout
post :url_update
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
fake_login_known_user(user)
post :url_update
it_redirects_to_with_error(user_path(user), "Sorry, you don't have permission to access the page you were trying to reach.")
end
context "when logged in with Open Doors privileges" do
before { fake_login_known_user(opendoors_user) }
it "redirects to tools if work URL is missing" do
post :url_update
it_redirects_to_with_error(opendoors_tools_path, "We couldn't find that work on the Archive. Have you put in the full URL?")
end
it "redirects to tools if work URL is invalid" do
post :url_update, params: { work_url: "/faq" }
it_redirects_to_with_error(opendoors_tools_path, "We couldn't find that work on the Archive. Have you put in the full URL?")
end
it "redirects to tools if work ID is not found" do
post :url_update, params: { work_url: "/works/7331278/" }
it_redirects_to_with_error(opendoors_tools_path, "We couldn't find that work on the Archive. Have you put in the full URL?")
end
context "with a valid work ID" do
let(:work) { create(:work) }
let(:work_with_imported_from_url) { create(:work, imported_from_url: "http://example.org/my-immortal") }
it "redirects to tools if imported-from URL is missing" do
post :url_update, params: { work_url: "/works/#{work.id}/" }
it_redirects_to_with_error(opendoors_tools_path, "The imported-from url you are trying to set doesn't seem valid.")
end
it "redirects to tools if imported-from URL is invalid" do
post :url_update, params: { work_url: "/works/#{work.id}/", imported_from_url: " " }
it_redirects_to_with_error(opendoors_tools_path, "The imported-from url you are trying to set doesn't seem valid.")
end
it "redirects to tools if imported-from URL is already used in another work" do
url = work_with_imported_from_url.imported_from_url
post :url_update, params: { work_url: "/works/#{work.id}/", imported_from_url: url }
it_redirects_to_with_error(opendoors_tools_path(imported_from_url: url), "There is already a work imported from the url #{url}.")
end
it "updates work if imported-from URL is valid" do
url = "https://example.com/share/?url=https://example.com/dead-archive"
post :url_update, params: { work_url: "http://example.org/works/#{work.id}/", imported_from_url: url }
it_redirects_to_with_notice(opendoors_tools_path(imported_from_url: url), "Updated imported-from url for #{work.title} to #{url}")
work.reload
expect(work.imported_from_url).to eq(url)
end
it "updates work if imported-from URL has non-ASCII characters" do
url = "https://example.com/work/resurrección"
post :url_update, params: { work_url: "http://example.org/works/#{work.id}/", imported_from_url: url }
encoded_url = URI::Parser.new.escape(url)
it_redirects_to_with_notice(opendoors_tools_path(imported_from_url: encoded_url), "Updated imported-from url for #{work.title} to #{encoded_url}")
work.reload
expect(work.imported_from_url).to eq(encoded_url)
end
end
end
end
end