BigW Consortium Gitlab

commit_controller_spec.rb 7.54 KB
Newer Older
1 2
require 'spec_helper'

3
describe Projects::CommitController do
4
  let(:project) { create(:project) }
5
  let(:user)    { create(:user) }
6
  let(:commit)  { project.commit("master") }
7 8
  let(:master_pickable_sha) { '7d3b0f7cff5f37573aea97cebfd5692ea1689924' }
  let(:master_pickable_commit)  { project.commit(master_pickable_sha) }
9 10 11

  before do
    sign_in(user)
Dmitriy Zaporozhets committed
12
    project.team << [user, :master]
13 14 15 16 17
  end

  describe "#show" do
    shared_examples "export as" do |format|
      it "should generally work" do
18 19 20 21 22
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id,
            format: format)
23 24 25 26 27

        expect(response).to be_success
      end

      it "should generate it" do
28
        expect_any_instance_of(Commit).to receive(:"to_#{format}")
29

30 31 32 33
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id, format: format)
34 35 36
      end

      it "should render it" do
37 38 39 40
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id, format: format)
41 42 43 44 45

        expect(response.body).to eq(commit.send(:"to_#{format}"))
      end

      it "should not escape Html" do
46 47
        allow_any_instance_of(Commit).to receive(:"to_#{format}").
          and_return('HTML entities &<>" ')
48

49 50 51 52
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id, format: format)
53

54 55 56 57
        expect(response.body).not_to include('&amp;')
        expect(response.body).not_to include('&gt;')
        expect(response.body).not_to include('&lt;')
        expect(response.body).not_to include('&quot;')
58 59 60 61 62 63 64 65
      end
    end

    describe "as diff" do
      include_examples "export as", :diff
      let(:format) { :diff }

      it "should really only be a git diff" do
66 67 68 69 70
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id,
            format: format)
71 72 73

        expect(response.body).to start_with("diff --git")
      end
74 75 76 77 78 79 80 81 82 83 84 85
      
      it "should really only be a git diff without whitespace changes" do
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: '66eceea0db202bb39c4e445e8ca28689645366c5',
            # id: commit.id,
            format: format,
            w: 1)

        expect(response.body).to start_with("diff --git")
        # without whitespace option, there are more than 2 diff_splits
86
        diff_splits = assigns(:diffs).first.diff.split("\n")
87 88
        expect(diff_splits.length).to be <= 2
      end
89 90 91 92 93 94 95
    end

    describe "as patch" do
      include_examples "export as", :patch
      let(:format) { :patch }

      it "should really be a git email patch" do
96 97 98 99 100
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id,
            format: format)
101 102 103 104 105

        expect(response.body).to start_with("From #{commit.id}")
      end

      it "should contain a git diff" do
106 107 108 109 110
        get(:show,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id,
            format: format)
111 112 113 114

        expect(response.body).to match(/^diff --git/)
      end
    end
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134

    context 'commit that removes a submodule' do
      render_views

      let(:fork_project) { create(:forked_project_with_submodules) }
      let(:commit) { fork_project.commit('remove-submodule') }

      before do
        fork_project.team << [user, :master]
      end

      it 'renders it' do
        get(:show,
            namespace_id: fork_project.namespace.to_param,
            project_id: fork_project.to_param,
            id: commit.id)

        expect(response).to be_success
      end
    end
135
  end
136 137 138

  describe "#branches" do
    it "contains branch and tags information" do
139 140 141 142
      get(:branches,
          namespace_id: project.namespace.to_param,
          project_id: project.to_param,
          id: commit.id)
143 144 145 146 147

      expect(assigns(:branches)).to include("master", "feature_conflict")
      expect(assigns(:tags)).to include("v1.1.0")
    end
  end
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196

  describe '#revert' do
    context 'when target branch is not provided' do
      it 'should render the 404 page' do
        post(:revert,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: commit.id)

        expect(response).not_to be_success
        expect(response.status).to eq(404)
      end
    end

    context 'when the revert was successful' do
      it 'should redirect to the commits page' do
        post(:revert,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            target_branch: 'master',
            id: commit.id)

        expect(response).to redirect_to namespace_project_commits_path(project.namespace, project, 'master')
        expect(flash[:notice]).to eq('The commit has been successfully reverted.')
      end
    end

    context 'when the revert failed' do
      before do
        post(:revert,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            target_branch: 'master',
            id: commit.id)
      end

      it 'should redirect to the commit page' do
        # Reverting a commit that has been already reverted.
        post(:revert,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            target_branch: 'master',
            id: commit.id)

        expect(response).to redirect_to namespace_project_commit_path(project.namespace, project, commit.id)
        expect(flash[:alert]).to match('Sorry, we cannot revert this commit automatically.')
      end
    end
  end
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

  describe '#cherry_pick' do
    context 'when target branch is not provided' do
      it 'should render the 404 page' do
        post(:cherry_pick,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            id: master_pickable_commit.id)

        expect(response).not_to be_success
        expect(response.status).to eq(404)
      end
    end

    context 'when the cherry-pick was successful' do
      it 'should redirect to the commits page' do
        post(:cherry_pick,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            target_branch: 'master',
            id: master_pickable_commit.id)

        expect(response).to redirect_to namespace_project_commits_path(project.namespace, project, 'master')
        expect(flash[:notice]).to eq('The commit has been successfully cherry-picked.')
      end
    end

    context 'when the cherry_pick failed' do
      before do
        post(:cherry_pick,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            target_branch: 'master',
            id: master_pickable_commit.id)
      end

      it 'should redirect to the commit page' do
        # Cherry-picking a commit that has been already cherry-picked.
        post(:cherry_pick,
            namespace_id: project.namespace.to_param,
            project_id: project.to_param,
            target_branch: 'master',
            id: master_pickable_commit.id)

        expect(response).to redirect_to namespace_project_commit_path(project.namespace, project, master_pickable_commit.id)
        expect(flash[:alert]).to match('Sorry, we cannot cherry-pick this commit automatically.')
      end
    end
  end
246
end