summaryrefslogtreecommitdiff
path: root/spec/bundler/source_spec.rb
blob: 1b4e4bdde9df1a14f50f546e24710ddde94b4efb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# frozen_string_literal: true
require "spec_helper"

describe Bundler::Source do
  class ExampleSource < Bundler::Source
  end

  subject { ExampleSource.new }

  describe "#unmet_deps" do
    let(:specs) { double(:specs) }
    let(:unmet_dependency_names) { double(:unmet_dependency_names) }

    before do
      allow(subject).to receive(:specs).and_return(specs)
      allow(specs).to receive(:unmet_dependency_names).and_return(unmet_dependency_names)
    end

    it "should return the names of unmet dependencies" do
      expect(subject.unmet_deps).to eq(unmet_dependency_names)
    end
  end

  describe "#version_message" do
    let(:spec) { double(:spec, :name => "nokogiri", :version => ">= 1.6") }

    shared_examples_for "the lockfile specs are not relevant" do
      it "should return a string with the spec name and version" do
        expect(subject.version_message(spec)).to eq("nokogiri >= 1.6")
      end
    end

    context "when there are locked gems" do
      let(:locked_gems) { double(:locked_gems) }

      before { allow(Bundler).to receive(:locked_gems).and_return(locked_gems) }

      context "that contain the relevant gem spec" do
        before do
          specs = double(:specs)
          allow(locked_gems).to receive(:specs).and_return(specs)
          allow(specs).to receive(:find).and_return(locked_gem)
        end

        context "without a version" do
          let(:locked_gem) { double(:locked_gem, :name => "nokogiri", :version => nil) }

          it_behaves_like "the lockfile specs are not relevant"
        end

        context "with the same version" do
          let(:locked_gem) { double(:locked_gem, :name => "nokogiri", :version => ">= 1.6") }

          it_behaves_like "the lockfile specs are not relevant"
        end

        context "with a different version" do
          let(:locked_gem) { double(:locked_gem, :name => "nokogiri", :version => "< 1.5") }

          it "should return a string with the spec name and version and locked spec version" do
            expect(subject.version_message(spec)).to eq("nokogiri >= 1.6 (was < 1.5)")
          end
        end
      end

      context "that do not contain the relevant gem spec" do
        before do
          specs = double(:specs)
          allow(locked_gems).to receive(:specs).and_return(specs)
          allow(specs).to receive(:find).and_return(nil)
        end

        it_behaves_like "the lockfile specs are not relevant"
      end
    end

    context "when there are no locked gems" do
      before { allow(Bundler).to receive(:locked_gems).and_return(nil) }

      it_behaves_like "the lockfile specs are not relevant"
    end
  end

  describe "#can_lock?" do
    context "when the passed spec's source is equivalent" do
      let(:spec) { double(:spec, :source => subject) }

      it "should return true" do
        expect(subject.can_lock?(spec)).to be_truthy
      end
    end

    context "when the passed spec's source is not equivalent" do
      let(:spec) { double(:spec, :source => double(:other_source)) }

      it "should return false" do
        expect(subject.can_lock?(spec)).to be_falsey
      end
    end
  end

  describe "#include?" do
    context "when the passed source is equivalent" do
      let(:source) { subject }

      it "should return true" do
        expect(subject).to include(source)
      end
    end

    context "when the passed source is not equivalent" do
      let(:source) { double(:source) }

      it "should return false" do
        expect(subject).to_not include(source)
      end
    end
  end
end