90 lines
3.1 KiB
Ruby
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
|