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

90 lines
3.1 KiB
Ruby

require "spec_helper"
describe ExternalWorksController do
include LoginMacros
include RedirectExpectationHelper
describe "GET #fetch" do
let(:url) { "http://example.org/200" }
before { WebMock.stub_request(:any, url) }
context "when the URL has an external work" do
let!(:external_work) { create(:external_work, url: url) }
it "responds with javascript" do
get :fetch, xhr: true, params: { external_work_url: url, format: :js }
expect(response.content_type).to match("text/javascript")
end
it "responds with the matching work" do
get :fetch, params: { external_work_url: url, format: :json }
expect(assigns(:external_work)).to eq(external_work)
end
context "when the URL has a second external work" do
let!(:external_work2) { create(:external_work, url: url) }
it "responds with the first matching work" do
get :fetch, params: { external_work_url: url, format: :json }
expect(assigns(:external_work)).to eq(external_work)
expect(assigns(:external_work)).not_to eq(external_work2)
end
end
end
context "when the URL doesn't have an exteral work" do
it "responds with javascript" do
get :fetch, xhr: true, params: { external_work_url: url, format: :js }
expect(response.content_type).to match("text/javascript")
end
it "responds with blank" do
get :fetch, params: { external_work_url: url, format: :json }
expect(assigns(:external_work)).to be_nil
end
end
end
describe "POST #update" do
let(:admin) { create(:admin) }
let(:external_work) { create(:external_work) }
before { fake_login_admin(admin) }
shared_examples "unauthorized admin cannot update external works" do
it "redirects with error" do
expect do
post :update, params: {
id: external_work, external_work: attributes_for(:external_work), work: { relationship_string: "takotori" }
}
end.to avoid_changing { external_work.reload.updated_at }
it_redirects_to_with_error(root_path, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
shared_examples "authorized admin can update external works" do
it "updates the external work and redirects with notice" do
post :update, params: {
id: external_work, external_work: attributes_for(:external_work), work: { relationship_string: "takotori" }
}
it_redirects_to_with_notice(external_work_path(external_work), "External work was successfully updated.")
expect(external_work.reload.relationship_string).to eq("takotori")
end
end
context "when admin does not have correct authorization" do
before { admin.update!(roles: []) }
it_behaves_like "unauthorized admin cannot update external works"
end
%w[superadmin policy_and_abuse].each do |role|
context "when admin has #{role} role" do
let(:admin) { create(:admin, roles: [role]) }
it_behaves_like "authorized admin can update external works"
end
end
end
end