File: //usr/local/rvm/src/ruby-2.7.4/spec/bundler/bundler/remote_specification_spec.rb
# frozen_string_literal: true
RSpec.describe Bundler::RemoteSpecification do
let(:name) { "foo" }
let(:version) { Gem::Version.new("1.0.0") }
let(:platform) { Gem::Platform::RUBY }
let(:spec_fetcher) { double(:spec_fetcher) }
subject { described_class.new(name, version, platform, spec_fetcher) }
it "is Comparable" do
expect(described_class.ancestors).to include(Comparable)
end
it "can match platforms" do
expect(described_class.ancestors).to include(Bundler::MatchPlatform)
end
describe "#fetch_platform" do
let(:remote_spec) { double(:remote_spec, :platform => "jruby") }
before { allow(spec_fetcher).to receive(:fetch_spec).and_return(remote_spec) }
it "should return the spec platform" do
expect(subject.fetch_platform).to eq("jruby")
end
end
describe "#full_name" do
context "when platform is ruby" do
it "should return the spec name and version" do
expect(subject.full_name).to eq("foo-1.0.0")
end
end
context "when platform is nil" do
let(:platform) { nil }
it "should return the spec name and version" do
expect(subject.full_name).to eq("foo-1.0.0")
end
end
context "when platform is a non-ruby platform" do
let(:platform) { "jruby" }
it "should return the spec name, version, and platform" do
expect(subject.full_name).to eq("foo-1.0.0-jruby")
end
end
end
describe "#<=>" do
let(:other_name) { name }
let(:other_version) { version }
let(:other_platform) { platform }
let(:other_spec_fetcher) { spec_fetcher }
shared_examples_for "a comparison" do
context "which exactly matches" do
it "returns 0" do
expect(subject <=> other).to eq(0)
end
end
context "which is different by name" do
let(:other_name) { "a" }
it "returns 1" do
expect(subject <=> other).to eq(1)
end
end
context "which has a lower version" do
let(:other_version) { Gem::Version.new("0.9.0") }
it "returns 1" do
expect(subject <=> other).to eq(1)
end
end
context "which has a higher version" do
let(:other_version) { Gem::Version.new("1.1.0") }
it "returns -1" do
expect(subject <=> other).to eq(-1)
end
end
context "which has a different platform" do
let(:other_platform) { Gem::Platform.new("x86-mswin32") }
it "returns -1" do
expect(subject <=> other).to eq(-1)
end
end
end
context "comparing another Bundler::RemoteSpecification" do
let(:other) do
Bundler::RemoteSpecification.new(other_name, other_version,
other_platform, nil)
end
it_should_behave_like "a comparison"
end
context "comparing a Gem::Specification" do
let(:other) do
Gem::Specification.new(other_name, other_version).tap do |s|
s.platform = other_platform
end
end
it_should_behave_like "a comparison"
end
context "comparing a non sortable object" do
let(:other) { Object.new }
let(:remote_spec) { double(:remote_spec, :platform => "jruby") }
before do
allow(spec_fetcher).to receive(:fetch_spec).and_return(remote_spec)
allow(remote_spec).to receive(:<=>).and_return(nil)
end
it "should use default object comparison" do
expect(subject <=> other).to eq(nil)
end
end
end
describe "#__swap__" do
let(:spec) { double(:spec, :dependencies => []) }
let(:new_spec) { double(:new_spec, :dependencies => [], :runtime_dependencies => []) }
before { subject.instance_variable_set(:@_remote_specification, spec) }
it "should replace remote specification with the passed spec" do
expect(subject.instance_variable_get(:@_remote_specification)).to be(spec)
subject.__swap__(new_spec)
expect(subject.instance_variable_get(:@_remote_specification)).to be(new_spec)
end
end
describe "#sort_obj" do
context "when platform is ruby" do
it "should return a sorting delegate array with name, version, and -1" do
expect(subject.sort_obj).to match_array(["foo", version, -1])
end
end
context "when platform is not ruby" do
let(:platform) { "jruby" }
it "should return a sorting delegate array with name, version, and 1" do
expect(subject.sort_obj).to match_array(["foo", version, 1])
end
end
end
describe "method missing" do
context "and is present in Gem::Specification" do
let(:remote_spec) { double(:remote_spec, :authors => "abcd") }
before do
allow(subject).to receive(:_remote_specification).and_return(remote_spec)
expect(subject.methods.map(&:to_sym)).not_to include(:authors)
end
it "should send through to Gem::Specification" do
expect(subject.authors).to eq("abcd")
end
end
end
describe "respond to missing?" do
context "and is present in Gem::Specification" do
let(:remote_spec) { double(:remote_spec, :authors => "abcd") }
before do
allow(subject).to receive(:_remote_specification).and_return(remote_spec)
expect(subject.methods.map(&:to_sym)).not_to include(:authors)
end
it "should send through to Gem::Specification" do
expect(subject.respond_to?(:authors)).to be_truthy
end
end
end
end