Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ref_extraction_shared_examples.rb « shared_examples « support « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f51c3a164064114931b9591769c8da4fdcb40451 (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
# frozen_string_literal: true

RSpec.shared_examples 'extracts ref vars' do
  describe '#extract!' do
    context 'when 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')

        ref_extractor.extract!

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

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

      it 'strips surrounding space' do
        ref_extractor.extract!

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

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

      it 'strips surrounding space' do
        ref_extractor.extract!

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

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

      it 'is not converted to %20 in @path' do
        ref_extractor.extract!

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

    context 'when override_id is given' do
      let(:ref_extractor) do
        described_class.new(container, params, override_id: '38008cb17ce1466d8fec2dfa6f6ab8dcfe5cf49e')
      end

      it 'uses override_id' do
        ref_extractor.extract!

        expect(ref_extractor.id).to eq('38008cb17ce1466d8fec2dfa6f6ab8dcfe5cf49e')
      end
    end
  end
end

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

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

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

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

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

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

        ref_extractor.extract_ref('master')
      end

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

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

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

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

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

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

      it 'extracts the longest matching ref' do
        expect(ref_extractor.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(ref_extractor).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(ref_extractor.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(ref_extractor).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(ref_extractor.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(ref_extractor).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(ref_extractor.extract_ref('v1.0.0/doc/README.md')).to eq(['v1.0.0', 'doc/README.md'])
        end
      end
    end
  end
end