98 lines
4 KiB
Ruby
98 lines
4 KiB
Ruby
# frozen_string_literal: true
|
|
require "spec_helper"
|
|
require "controllers/api/api_helper"
|
|
|
|
include ApiHelper
|
|
|
|
def post_search_result(valid_params)
|
|
post "/api/v2/works/search", params: valid_params.to_json, headers: valid_headers
|
|
JSON.parse(response.body, symbolize_names: true)
|
|
end
|
|
|
|
describe "API v2 WorksController - Search", type: :request, work_search: true do
|
|
describe "valid work URL request" do
|
|
let!(:work) { create(:work, imported_from_url: "foo") }
|
|
|
|
it "returns 200 OK" do
|
|
valid_params = { works: [{ original_urls: %w(bar foo) }] }
|
|
post "/api/v2/works/search", params: valid_params.to_json, headers: valid_headers
|
|
|
|
assert_equal 200, response.status
|
|
end
|
|
|
|
it "returns the work URL for an imported work" do
|
|
valid_params = { works: [{ original_urls: %w(foo) }] }
|
|
parsed_body = post_search_result(valid_params)
|
|
search_results = parsed_body[:works].first[:search_results]
|
|
|
|
expect(parsed_body[:works].first[:status]).to eq "found"
|
|
expect(search_results).to include(include(archive_url: work_url(work)))
|
|
expect(search_results.any? { |w| w[:created].to_date == work.created_at.to_date }).to be_truthy
|
|
end
|
|
|
|
it "returns the original reference if one was provided" do
|
|
valid_params = { works: [{ original_urls: [{ id: "123", url: "foo" }] }] }
|
|
parsed_body = post_search_result(valid_params)
|
|
|
|
expect(parsed_body[:works].first[:status]).to eq "found"
|
|
expect(parsed_body[:works].first[:original_id]).to eq "123"
|
|
expect(parsed_body[:works].first[:original_url]).to eq "foo"
|
|
end
|
|
|
|
it "returns human-readable messages as an array" do
|
|
valid_params = { works: [{ original_urls: [{ id: "123", url: "foo" }] }] }
|
|
parsed_body = post_search_result(valid_params)
|
|
|
|
expect(parsed_body[:works].first[:status]).to eq "found"
|
|
expect(parsed_body[:works].first[:messages]).to include("Work \"#{work.title}\", created on #{work.created_at.to_date.to_fs(:iso_date)} was found at \"#{url_for(work)}\".")
|
|
end
|
|
|
|
it "returns an error when no works are provided" do
|
|
invalid_params = { works: [] }
|
|
parsed_body = post_search_result(invalid_params)
|
|
|
|
expect(parsed_body[:messages].first).to eq "Please provide a list of URLs to find."
|
|
end
|
|
|
|
it "returns an error when no URLs are provided" do
|
|
invalid_params = { works: [{ original_urls: [] }] }
|
|
parsed_body = post_search_result(invalid_params)
|
|
|
|
expect(parsed_body[:messages].first).to eq "Please provide a list of URLs to find."
|
|
end
|
|
|
|
it "returns an error when too many works are provided" do
|
|
loads_of_items = Array.new(210) { |_| { original_urls: ["url"] } }
|
|
valid_params = { works: loads_of_items }
|
|
parsed_body = post_search_result(valid_params)
|
|
|
|
expect(parsed_body[:messages].first).to start_with "Please provide no more than"
|
|
end
|
|
|
|
it "returns an error when too many URLs are provided" do
|
|
loads_of_items = Array.new(210) { |_| "url" }
|
|
valid_params = { works: [{ original_urls: loads_of_items }] }
|
|
parsed_body = post_search_result(valid_params)
|
|
|
|
expect(parsed_body[:messages].first).to start_with "Please provide no more than"
|
|
end
|
|
|
|
it "returns a not found message for a work that wasn't found" do
|
|
valid_params = { works: [{ original_urls: %w(bar) }] }
|
|
parsed_body = post_search_result(valid_params)
|
|
|
|
expect(parsed_body[:works].first[:status]).to eq("not_found")
|
|
expect(parsed_body[:works].first[:messages]).to include("No work has been imported from \"bar\".")
|
|
end
|
|
|
|
it "only does an exact match on the original url" do
|
|
valid_params = { works: [{ original_urls: %w(fo food) }] }
|
|
parsed_body = post_search_result(valid_params)
|
|
|
|
expect(parsed_body[:works].first[:status]).to eq("not_found")
|
|
expect(parsed_body[:works].first[:messages]).to include("No work has been imported from \"fo\".")
|
|
expect(parsed_body[:works].second[:status]).to eq("not_found")
|
|
expect(parsed_body[:works].second).to include(:messages)
|
|
end
|
|
end
|
|
end
|