inspec/test/unit/bundles/inspec-supermarket/api_test.rb

155 lines
6.4 KiB
Ruby
Raw Normal View History

require "helper"
require "bundles/inspec-supermarket/api"
def default_url?(supermarket_url)
supermarket_url == Supermarket::API::SUPERMARKET_URL
end
describe Supermarket::API do
let(:subject) { Supermarket::API }
[Supermarket::API::SUPERMARKET_URL, "https://my.custom.supermarket"].each do |supermarket_url|
describe "With #{default_url?(supermarket_url) ? 'default' : supermarket_url} Supermarket URL" do
let(:profile_search_response_body) do
{
"start" => 0,
"total" => 1,
"items" => [
{
"tool_name" => "test_name",
"tool_type" => "compliance_profile",
"tool_source_url" => supermarket_url,
"tool_description" => "test_description",
"tool_owner" => "test_owner",
"tool" => "#{supermarket_url}/api/v1/tools/test_name",
}
],
}
end
let(:profile_name) { "supermarket://test_owner/test_name" }
describe "#profiles" do
it "returns the profile list" do
stub_request(:get, "#{supermarket_url}/api/v1/tools-search?items=100&type=compliance_profile")
.to_return(status: 200, body: profile_search_response_body.to_json)
test_profile = default_url?(supermarket_url) ? subject.profiles.first : subject.profiles(supermarket_url).first
test_profile.must_equal(profile_search_response_body["items"].first.merge({ "slug" => "test_name" }))
end
end
describe "#profile_name" do
it "returns the profile name and owner from a supermarket://owner/name path" do
tool_owner, tool_name = subject.profile_name("supermarket://test_tool_owner/test_tool_name")
tool_owner.must_equal("test_tool_owner")
tool_name.must_equal("test_tool_name")
end
end
describe "#info" do
let(:profile_list_response_body) do
{
"name" => "test_name",
"slug" => "test_slug",
"type" => "test_type",
"source_url" => supermarket_url,
"description" => "test_description",
"instructions" => "test_instructions",
"owner" => "test_owner",
}
end
it "returns profile info" do
stub_request(:get, "#{supermarket_url}/api/v1/tools/test_name")
.to_return(status: 200, body: profile_list_response_body.to_json)
profile_info = default_url?(supermarket_url) ? subject.info("test_owner/test_name") : subject.info("test_owner/test_name", supermarket_url)
profile_info.must_equal(profile_list_response_body)
end
end
describe "#same?" do
let(:tool_url) { "#{supermarket_url}/api/v1/tools/test_name" }
it "is the same on a match" do
supermarket_tool = { "tool_owner" => "test_owner", "tool" => tool_url }
same = default_url?(supermarket_url) ? subject.same?(profile_name, supermarket_tool) : subject.same?(profile_name, supermarket_tool, supermarket_url)
same.must_equal(true)
end
it "is not the same on a mismatched owner" do
supermarket_tool = { "tool_owner" => "wrong_owner", "tool" => tool_url }
same = default_url?(supermarket_url) ? subject.same?(profile_name, supermarket_tool) : subject.same?(profile_name, supermarket_tool, supermarket_url)
same.must_equal(false)
end
it "is not the same on a mismatched supermarket tool" do
supermarket_tool = { "tool_owner" => "test_owner", "tool" => "garbage" }
same = default_url?(supermarket_url) ? subject.same?(profile_name, supermarket_tool) : subject.same?(profile_name, supermarket_tool, supermarket_url)
same.must_equal(false)
end
end
describe "#find" do
let(:empty_profile_search_response_body) do
{ start: 0, total: 0, items: [] }
end
it "returns nil if profiles are empty" do
stub_request(:get, "#{supermarket_url}/api/v1/tools-search?items=100&type=compliance_profile")
.to_return(status: 200, body: empty_profile_search_response_body.to_json)
search = default_url?(supermarket_url) ? subject.find(profile_name) : subject.find(profile_name, supermarket_url)
search.must_be_nil
end
it "returns nil if profile not found" do
stub_request(:get, "#{supermarket_url}/api/v1/tools-search?items=100&type=compliance_profile")
.to_return(status: 200, body: profile_search_response_body.to_json)
profile_name_cant_find = "supermarket://cant_find/not_found"
search = default_url?(supermarket_url) ? subject.find(profile_name_cant_find) : subject.find(profile_name_cant_find, supermarket_url)
search.must_be_nil
end
it "returns profile if it is found" do
stub_request(:get, "#{supermarket_url}/api/v1/tools-search?items=100&type=compliance_profile")
.to_return(status: 200, body: profile_search_response_body.to_json)
profile = default_url?(supermarket_url) ? subject.find(profile_name) : subject.find(profile_name, supermarket_url)
profile.must_equal(profile_search_response_body["items"].first.merge({ "slug" => "test_name" }))
end
it "downcases profile name for Supermarket API URL" do
profile_name = "supermarket://test_owner/Test_Name"
stub_request(:get, "#{supermarket_url}/api/v1/tools-search?items=100&type=compliance_profile")
.to_return(status: 200, body: profile_search_response_body.to_json)
profile = if default_url?(supermarket_url)
subject.find(profile_name)
else
subject.find(profile_name, supermarket_url)
end
profile.must_equal(profile_search_response_body["items"].first.merge({ "slug" => "test_name" }))
end
it "raises an error if tool name is not present" do
profile_name = "supermarket://owner_only"
stub_request(:get, "#{supermarket_url}/api/v1/tools-search?items=100&type=compliance_profile")
.to_return(status: 200, body: profile_search_response_body.to_json)
e = proc { subject.find(profile_name, supermarket_url) }.must_raise
e.message.must_equal("Could not parse tool name from #{profile_name}")
end
end
end
end
end