blob_controller_spec.rb 6.7 KB
Newer Older
1 2 3
require 'rails_helper'

describe Projects::BlobController do
B
Bob Van Landuyt 已提交
4 5
  include ProjectForksHelper

6
  let(:project) { create(:project, :public, :repository) }
7

S
Sean McGivern 已提交
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
  describe "GET show" do
    render_views

    context 'with file path' do
      before do
        get(:show,
            namespace_id: project.namespace,
            project_id: project,
            id: id)
      end

      context "valid branch, valid file" do
        let(:id) { 'master/README.md' }
        it { is_expected.to respond_with(:success) }
      end

      context "valid branch, invalid file" do
        let(:id) { 'master/invalid-path.rb' }
        it { is_expected.to respond_with(:not_found) }
      end

      context "invalid branch, valid file" do
        let(:id) { 'invalid-branch/README.md' }
        it { is_expected.to respond_with(:not_found) }
      end

      context "binary file" do
        let(:id) { 'binary-encoding/encoding/binary-1.bin' }
        it { is_expected.to respond_with(:success) }
      end
    end

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
    context 'with file path and JSON format' do
      context "valid branch, valid file" do
        let(:id) { 'master/README.md' }

        before do
          get(:show,
              namespace_id: project.namespace,
              project_id: project,
              id: id,
              format: :json)
        end

        it do
          expect(response).to be_ok
          expect(json_response).to have_key 'html'
55
          expect(json_response).to have_key 'raw_path'
56 57 58 59
        end
      end
    end

S
Sean McGivern 已提交
60 61 62 63 64 65 66 67 68 69 70 71
    context 'with tree path' do
      before do
        get(:show,
            namespace_id: project.namespace,
            project_id: project,
            id: id)
        controller.instance_variable_set(:@blob, nil)
      end

      context 'redirect to tree' do
        let(:id) { 'markdown/doc' }
        it 'redirects' do
72
          expect(subject)
73
            .to redirect_to("/#{project.full_path}/tree/markdown/doc")
S
Sean McGivern 已提交
74 75 76 77 78
        end
      end
    end
  end

79
  describe 'GET diff' do
E
Eric Eastwood 已提交
80 81
    let(:user) { create(:user) }

82 83 84
    render_views

    def do_get(opts = {})
85 86
      params = { namespace_id: project.namespace,
                 project_id: project,
87 88 89 90
                 id: 'master/CHANGELOG' }
      get :diff, params.merge(opts)
    end

E
Eric Eastwood 已提交
91
    before do
92
      project.add_master(user)
E
Eric Eastwood 已提交
93 94 95 96

      sign_in(user)
    end

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
    context 'when essential params are missing' do
      it 'renders nothing' do
        do_get

        expect(response.body).to be_blank
      end
    end

    context 'when essential params are present' do
      it 'renders the diff content' do
        do_get(since: 1, to: 5, offset: 10)

        expect(response.body).to be_present
      end
    end
  end
113

E
Eric Eastwood 已提交
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
  describe 'GET edit' do
    let(:default_params) do
      {
        namespace_id: project.namespace,
        project_id: project,
        id: 'master/CHANGELOG'
      }
    end

    context 'anonymous' do
      before do
        get :edit, default_params
      end

      it 'redirects to sign in and returns' do
        expect(response).to redirect_to(new_user_session_path)
      end
    end

    context 'as guest' do
      let(:guest) { create(:user) }

      before do
        sign_in(guest)
        get :edit, default_params
      end

      it 'redirects to blob show' do
142
        expect(response).to redirect_to(project_blob_path(project, 'master/CHANGELOG'))
E
Eric Eastwood 已提交
143 144 145 146 147 148 149
      end
    end

    context 'as developer' do
      let(:developer) { create(:user) }

      before do
150
        project.add_developer(developer)
E
Eric Eastwood 已提交
151 152 153 154 155
        sign_in(developer)
        get :edit, default_params
      end

      it 'redirects to blob show' do
156
        expect(response).to have_gitlab_http_status(200)
E
Eric Eastwood 已提交
157 158 159 160 161 162 163
      end
    end

    context 'as master' do
      let(:master) { create(:user) }

      before do
164
        project.add_master(master)
E
Eric Eastwood 已提交
165 166 167 168 169
        sign_in(master)
        get :edit, default_params
      end

      it 'redirects to blob show' do
170
        expect(response).to have_gitlab_http_status(200)
E
Eric Eastwood 已提交
171 172 173 174
      end
    end
  end

175
  describe 'PUT update' do
E
Eric Eastwood 已提交
176
    let(:user) { create(:user) }
177 178
    let(:default_params) do
      {
179 180
        namespace_id: project.namespace,
        project_id: project,
181
        id: 'master/CHANGELOG',
D
Douwe Maan 已提交
182
        branch_name: 'master',
183 184 185 186 187 188
        content: 'Added changes',
        commit_message: 'Update CHANGELOG'
      }
    end

    def blob_after_edit_path
189
      project_blob_path(project, 'master/CHANGELOG')
190 191
    end

E
Eric Eastwood 已提交
192
    before do
193
      project.add_master(user)
E
Eric Eastwood 已提交
194 195 196 197

      sign_in(user)
    end

198 199 200 201 202 203 204 205 206 207 208 209 210
    it 'redirects to blob' do
      put :update, default_params

      expect(response).to redirect_to(blob_after_edit_path)
    end

    context '?from_merge_request_iid' do
      let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
      let(:mr_params) { default_params.merge(from_merge_request_iid: merge_request.iid) }

      it 'redirects to MR diff' do
        put :update, mr_params

211
        after_edit_path = diffs_project_merge_request_path(project, merge_request)
212
        file_anchor = "##{Digest::SHA1.hexdigest('CHANGELOG')}"
213 214 215 216 217
        expect(response).to redirect_to(after_edit_path + file_anchor)
      end

      context "when user doesn't have access" do
        before do
218
          other_project = create(:project, :repository)
219 220 221 222 223 224 225 226 227 228
          merge_request.update!(source_project: other_project, target_project: other_project)
        end

        it "it redirect to blob" do
          put :update, mr_params

          expect(response).to redirect_to(blob_after_edit_path)
        end
      end
    end
229 230

    context 'when user has forked project' do
B
Bob Van Landuyt 已提交
231 232
      let!(:forked_project) { fork_project(project, guest, namespace: guest.namespace, repository: true) }
      let(:guest) { create(:user) }
233

234 235 236
      before do
        sign_in(guest)
      end
237

238 239
      context 'when editing on the fork' do
        before do
240 241
          default_params[:namespace_id] = forked_project.namespace
          default_params[:project_id] = forked_project
242 243 244 245 246
        end

        it 'redirects to blob' do
          put :update, default_params

247
          expect(response).to redirect_to(project_blob_path(forked_project, 'master/CHANGELOG'))
248 249 250 251 252
        end
      end

      context 'when editing on the original repository' do
        it "redirects to forked project new merge request" do
D
Douwe Maan 已提交
253
          default_params[:branch_name] = "fork-test-1"
254 255 256 257 258
          default_params[:create_merge_request] = 1

          put :update, default_params

          expect(response).to redirect_to(
259
            project_new_merge_request_path(
260 261 262 263 264 265 266 267
              forked_project,
              merge_request: {
                source_project_id: forked_project.id,
                target_project_id: project.id,
                source_branch: "fork-test-1",
                target_branch: "master"
              }
            )
268
          )
269
        end
270 271
      end
    end
272
  end
273
end