diff options
author | Martin Emde <martin.emde@gmail.com> | 2023-08-21 14:05:57 -0700 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2023-08-28 11:15:32 +0900 |
commit | 7bf5f780281edc2fca83a0657e3a8d256e6e7065 (patch) | |
tree | c23cbdefc5cfd4c95ef140a278b36caf338fddc4 /spec | |
parent | 0c9d0684e1ab75277f8543db769dc7bdaccaa332 (diff) |
[rubygems/rubygems] Refactor Fetcher#api_fetcher? and fetcher loading logic
https://github.com/rubygems/rubygems/commit/f664d60114
Diffstat (limited to 'spec')
-rw-r--r-- | spec/bundler/bundler/fetcher_spec.rb | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/spec/bundler/bundler/fetcher_spec.rb b/spec/bundler/bundler/fetcher_spec.rb index 27a63c476d..92790dc7d6 100644 --- a/spec/bundler/bundler/fetcher_spec.rb +++ b/spec/bundler/bundler/fetcher_spec.rb @@ -189,4 +189,70 @@ RSpec.describe Bundler::Fetcher do end end end + + describe "#specs_with_retry" do + let(:downloader) { double(:downloader) } + let(:remote) { double(:remote, :cache_slug => "slug", :uri => uri, :original_uri => nil, :anonymized_uri => uri) } + let(:compact_index) { double(Bundler::Fetcher::CompactIndex, :available? => true, :api_fetcher? => true) } + let(:dependency) { double(Bundler::Fetcher::Dependency, :available? => true, :api_fetcher? => true) } + let(:index) { double(Bundler::Fetcher::Index, :available? => true, :api_fetcher? => false) } + + before do + allow(Bundler::Fetcher::CompactIndex).to receive(:new).and_return(compact_index) + allow(Bundler::Fetcher::Dependency).to receive(:new).and_return(dependency) + allow(Bundler::Fetcher::Index).to receive(:new).and_return(index) + end + + it "picks the first fetcher that works" do + expect(compact_index).to receive(:specs).with("name").and_return([["name", "1.2.3", "ruby"]]) + expect(dependency).not_to receive(:specs) + expect(index).not_to receive(:specs) + fetcher.specs_with_retry("name", double(Bundler::Source::Rubygems)) + end + + context "when APIs are not available" do + before do + allow(compact_index).to receive(:available?).and_return(false) + allow(dependency).to receive(:available?).and_return(false) + end + + it "uses the index" do + expect(compact_index).not_to receive(:specs) + expect(dependency).not_to receive(:specs) + expect(index).to receive(:specs).with("name").and_return([["name", "1.2.3", "ruby"]]) + + fetcher.specs_with_retry("name", double(Bundler::Source::Rubygems)) + end + end + end + + describe "#api_fetcher?" do + let(:downloader) { double(:downloader) } + let(:remote) { double(:remote, :cache_slug => "slug", :uri => uri, :original_uri => nil, :anonymized_uri => uri) } + let(:compact_index) { double(Bundler::Fetcher::CompactIndex, :available? => false, :api_fetcher? => true) } + let(:dependency) { double(Bundler::Fetcher::Dependency, :available? => false, :api_fetcher? => true) } + let(:index) { double(Bundler::Fetcher::Index, :available? => true, :api_fetcher? => false) } + + before do + allow(Bundler::Fetcher::CompactIndex).to receive(:new).and_return(compact_index) + allow(Bundler::Fetcher::Dependency).to receive(:new).and_return(dependency) + allow(Bundler::Fetcher::Index).to receive(:new).and_return(index) + end + + context "when an api fetcher is available" do + before do + allow(compact_index).to receive(:available?).and_return(true) + end + + it "is truthy" do + expect(fetcher).to be_api_fetcher + end + end + + context "when only the index fetcher is available" do + it "is falsey" do + expect(fetcher).not_to be_api_fetcher + end + end + end end |