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

describe Projects::BlobController do
4
  let(:project) { create(:project, :public, :repository) }
5

S
Sean McGivern 已提交
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
  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

    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
50
          expect(subject)
51
            .to redirect_to("/#{project.full_path}/tree/markdown/doc")
S
Sean McGivern 已提交
52 53 54 55 56
        end
      end
    end
  end

57
  describe 'GET diff' do
E
Eric Eastwood 已提交
58 59
    let(:user) { create(:user) }

60 61 62
    render_views

    def do_get(opts = {})
63 64
      params = { namespace_id: project.namespace,
                 project_id: project,
65 66 67 68
                 id: 'master/CHANGELOG' }
      get :diff, params.merge(opts)
    end

E
Eric Eastwood 已提交
69 70 71 72 73 74
    before do
      project.team << [user, :master]

      sign_in(user)
    end

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    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
91

E
Eric Eastwood 已提交
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
  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
120
        expect(response).to redirect_to(project_blob_path(project, 'master/CHANGELOG'))
E
Eric Eastwood 已提交
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
      end
    end

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

      before do
        project.team << [developer, :developer]
        sign_in(developer)
        get :edit, default_params
      end

      it 'redirects to blob show' do
        expect(response).to have_http_status(200)
      end
    end

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

      before do
        project.team << [master, :master]
        sign_in(master)
        get :edit, default_params
      end

      it 'redirects to blob show' do
        expect(response).to have_http_status(200)
      end
    end
  end

153
  describe 'PUT update' do
E
Eric Eastwood 已提交
154
    let(:user) { create(:user) }
155 156
    let(:default_params) do
      {
157 158
        namespace_id: project.namespace,
        project_id: project,
159
        id: 'master/CHANGELOG',
D
Douwe Maan 已提交
160
        branch_name: 'master',
161 162 163 164 165 166
        content: 'Added changes',
        commit_message: 'Update CHANGELOG'
      }
    end

    def blob_after_edit_path
167
      project_blob_path(project, 'master/CHANGELOG')
168 169
    end

E
Eric Eastwood 已提交
170 171 172 173 174 175
    before do
      project.team << [user, :master]

      sign_in(user)
    end

176 177 178 179 180 181 182 183 184 185 186 187 188
    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

189
        after_edit_path = diffs_project_merge_request_path(project, merge_request)
190
        file_anchor = "##{Digest::SHA1.hexdigest('CHANGELOG')}"
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
        expect(response).to redirect_to(after_edit_path + file_anchor)
      end

      context "when user doesn't have access" do
        before do
          other_project = create(:empty_project)
          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
207 208

    context 'when user has forked project' do
209 210 211
      let(:forked_project_link) { create(:forked_project_link, forked_from_project: project) }
      let!(:forked_project) { forked_project_link.forked_to_project }
      let(:guest) { forked_project.owner }
212

213 214 215
      before do
        sign_in(guest)
      end
216

217 218
      context 'when editing on the fork' do
        before do
219 220
          default_params[:namespace_id] = forked_project.namespace
          default_params[:project_id] = forked_project
221 222 223 224 225
        end

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

226
          expect(response).to redirect_to(project_blob_path(forked_project, 'master/CHANGELOG'))
227 228 229 230 231
        end
      end

      context 'when editing on the original repository' do
        it "redirects to forked project new merge request" do
D
Douwe Maan 已提交
232
          default_params[:branch_name] = "fork-test-1"
233 234 235 236 237
          default_params[:create_merge_request] = 1

          put :update, default_params

          expect(response).to redirect_to(
238
            project_new_merge_request_path(
239 240 241 242 243 244 245 246
              forked_project,
              merge_request: {
                source_project_id: forked_project.id,
                target_project_id: project.id,
                source_branch: "fork-test-1",
                target_branch: "master"
              }
            )
247
          )
248
        end
249 250
      end
    end
251
  end
252
end