summaryrefslogtreecommitdiff
path: root/spec/support/shared_examples/path_extraction_shared_examples.rb
blob: d76348aa26a050a721739a8bec0d983063c380ef (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# frozen_string_literal: true

RSpec.shared_examples 'assigns ref vars' do
  it 'assigns the repository var' do
    assign_ref_vars

    expect(@repo).to eq container.repository
  end

  context 'ref contains %20' do
    let(:ref) { 'foo%20bar' }

    it 'is not converted to a space in @id' do
      container.repository.add_branch(owner, 'foo%20bar', 'master')

      assign_ref_vars

      expect(@id).to start_with('foo%20bar/')
    end
  end

  context 'ref contains trailing space' do
    let(:ref) { 'master ' }

    it 'strips surrounding space' do
      assign_ref_vars

      expect(@ref).to eq('master')
    end
  end

  context 'ref contains leading space' do
    let(:ref) { ' master ' }

    it 'strips surrounding space' do
      assign_ref_vars

      expect(@ref).to eq('master')
    end
  end

  context 'path contains space' do
    let(:ref) { '38008cb17ce1466d8fec2dfa6f6ab8dcfe5cf49e' }
    let(:path) { 'with space' }

    it 'is not converted to %20 in @path' do
      assign_ref_vars

      expect(@path).to eq(path)
    end
  end

  context 'subclass overrides get_id' do
    it 'uses ref returned by get_id' do
      allow_next_instance_of(self.class) do |instance|
        allow(instance).to receive(:get_id) { '38008cb17ce1466d8fec2dfa6f6ab8dcfe5cf49e' }
      end

      assign_ref_vars

      expect(@id).to eq(get_id)
    end
  end
end

RSpec.shared_examples 'extracts refs' do
  describe '#extract_ref' do
    it 'returns an empty pair when no repository_container is set' do
      allow_any_instance_of(described_class).to receive(:repository_container).and_return(nil)
      expect(extract_ref('master/CHANGELOG')).to eq(['', ''])
    end

    context 'without a path' do
      it 'extracts a valid branch' do
        expect(extract_ref('master')).to eq(['master', ''])
      end

      it 'extracts a valid tag' do
        expect(extract_ref('v2.0.0')).to eq(['v2.0.0', ''])
      end

      it 'extracts a valid commit ref without a path' do
        expect(extract_ref('f4b14494ef6abf3d144c28e4af0c20143383e062')).to eq(
          ['f4b14494ef6abf3d144c28e4af0c20143383e062', '']
        )
      end

      it 'falls back to a primitive split for an invalid ref' do
        expect(extract_ref('stable')).to eq(['stable', ''])
      end

      it 'does not fetch ref names when there is no slash' do
        expect(self).not_to receive(:ref_names)

        extract_ref('master')
      end

      it 'fetches ref names when there is a slash' do
        expect(self).to receive(:ref_names).and_call_original

        extract_ref('release/app/v1.0.0')
      end
    end

    context 'with a path' do
      it 'extracts a valid branch' do
        expect(extract_ref('foo/bar/baz/CHANGELOG')).to eq(
          ['foo/bar/baz', 'CHANGELOG'])
      end

      it 'extracts a valid tag' do
        expect(extract_ref('v2.0.0/CHANGELOG')).to eq(['v2.0.0', 'CHANGELOG'])
      end

      it 'extracts a valid commit SHA' do
        expect(extract_ref('f4b14494ef6abf3d144c28e4af0c20143383e062/CHANGELOG')).to eq(
          %w(f4b14494ef6abf3d144c28e4af0c20143383e062 CHANGELOG)
        )
      end

      it 'falls back to a primitive split for an invalid ref' do
        expect(extract_ref('stable/CHANGELOG')).to eq(%w(stable CHANGELOG))
      end

      it 'extracts the longest matching ref' do
        expect(extract_ref('release/app/v1.0.0/README.md')).to eq(
          ['release/app/v1.0.0', 'README.md'])
      end

      context 'when the repository does not have ambiguous refs' do
        before do
          allow(container.repository).to receive(:has_ambiguous_refs?).and_return(false)
        end

        it 'does not fetch all ref names when the first path component is a ref' do
          expect(self).not_to receive(:ref_names)
          expect(container.repository).to receive(:branch_names_include?).with('v1.0.0').and_return(false)
          expect(container.repository).to receive(:tag_names_include?).with('v1.0.0').and_return(true)

          expect(extract_ref('v1.0.0/doc/README.md')).to eq(['v1.0.0', 'doc/README.md'])
        end

        it 'fetches all ref names when the first path component is not a ref' do
          expect(self).to receive(:ref_names).and_call_original
          expect(container.repository).to receive(:branch_names_include?).with('release').and_return(false)
          expect(container.repository).to receive(:tag_names_include?).with('release').and_return(false)

          expect(extract_ref('release/app/doc/README.md')).to eq(['release/app', 'doc/README.md'])
        end
      end

      context 'when the repository has ambiguous refs' do
        before do
          allow(container.repository).to receive(:has_ambiguous_refs?).and_return(true)
        end

        it 'always fetches all ref names' do
          expect(self).to receive(:ref_names).and_call_original
          expect(container.repository).not_to receive(:branch_names_include?)
          expect(container.repository).not_to receive(:tag_names_include?)

          expect(extract_ref('v1.0.0/doc/README.md')).to eq(['v1.0.0', 'doc/README.md'])
        end
      end
    end
  end
end