From 39341b67f226590a30f2b70fe3692e6e064d2cdb Mon Sep 17 00:00:00 2001 From: mo khan Date: Wed, 18 Mar 2020 20:43:11 -0600 Subject: Extract python namespace --- spec/unit/python/pypi_spec.rb | 80 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 spec/unit/python/pypi_spec.rb (limited to 'spec/unit/python') diff --git a/spec/unit/python/pypi_spec.rb b/spec/unit/python/pypi_spec.rb new file mode 100644 index 0000000..aa87025 --- /dev/null +++ b/spec/unit/python/pypi_spec.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +RSpec.describe Spandx::Python::PyPI do + describe '#definition_for' do + subject { described_class.new } + + let(:source) { 'pypi.org' } + let(:package) { 'six' } + let(:version) { '1.13.0' } + let(:successful_response_body) do + JSON.generate( + info: { + name: package, + version: version + } + ) + end + + context 'when the default source is reachable' do + before do + stub_request(:get, "https://#{source}/pypi/#{package}/#{version}/json") + .to_return(status: 200, body: successful_response_body) + end + + specify do + expect(subject.definition_for(package, version)).to include( + 'name' => package, + 'version' => version + ) + end + end + + context 'when the response redirects to a different location' do + let(:redirect_url) { "https://#{source}/pypi/#{SecureRandom.uuid}" } + + before do + stub_request(:get, "https://#{source}/pypi/#{package}/#{version}/json") + .to_return(status: 301, headers: { 'Location' => redirect_url }) + + stub_request(:get, redirect_url) + .to_return(status: 200, body: successful_response_body) + end + + specify do + expect(subject.definition_for(package, version)).to include( + 'name' => package, + 'version' => version + ) + end + end + + context 'when stuck in an infinite redirect loop' do + before do + url = "https://#{source}/pypi/#{package}/#{version}/json" + + 11.times do |n| + redirect_url = "#{url}#{n}" + stub_request(:get, url) + .to_return(status: 301, headers: { 'Location' => redirect_url }) + url = redirect_url + end + end + + it 'gives up after `n` attempts' do + expect(subject.definition_for(package, version)).to be_empty + end + end + + context 'when the source is not reachable' do + before do + stub_request(:get, "https://#{source}/pypi/#{package}/#{version}/json") + .to_timeout + end + + it 'fails gracefully' do + expect(subject.definition_for(package, version)).to be_empty + end + end + end +end -- cgit v1.2.3