merge_request_spec.rb 5.7 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4
# == Schema Information
#
# Table name: merge_requests
#
D
Dmitriy Zaporozhets 已提交
5 6 7 8 9 10 11
#  id                :integer          not null, primary key
#  target_branch     :string(255)      not null
#  source_branch     :string(255)      not null
#  source_project_id :integer          not null
#  author_id         :integer
#  assignee_id       :integer
#  title             :string(255)
D
Dmitriy Zaporozhets 已提交
12 13
#  created_at        :datetime
#  updated_at        :datetime
D
Dmitriy Zaporozhets 已提交
14 15 16 17 18
#  milestone_id      :integer
#  state             :string(255)
#  merge_status      :string(255)
#  target_project_id :integer          not null
#  iid               :integer
D
Dmitriy Zaporozhets 已提交
19
#  description       :text
D
Dmitriy Zaporozhets 已提交
20
#  position          :integer          default(0)
D
Dmitriy Zaporozhets 已提交
21
#  locked_at         :datetime
D
Dmitriy Zaporozhets 已提交
22 23
#

D
Dmitriy Zaporozhets 已提交
24 25 26
require 'spec_helper'

describe MergeRequest do
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
  subject { create(:merge_request) }

  describe 'modules' do
    subject { described_class }

    it { is_expected.to include_module(InternalId) }
    it { is_expected.to include_module(Issuable) }
    it { is_expected.to include_module(Referable) }
    it { is_expected.to include_module(Sortable) }
    it { is_expected.to include_module(Taskable) }
  end

  describe 'associations' do
    it { is_expected.to belong_to(:target_project).with_foreign_key(:target_project_id).class_name('Project') }
    it { is_expected.to belong_to(:source_project).with_foreign_key(:source_project_id).class_name('Project') }

    it { is_expected.to have_one(:merge_request_diff).dependent(:destroy) }
  end

  describe 'validation' do
47 48
    it { is_expected.to validate_presence_of(:target_branch) }
    it { is_expected.to validate_presence_of(:source_branch) }
D
Dmitriy Zaporozhets 已提交
49 50
  end

51 52 53
  describe "Mass assignment" do
  end

54
  describe "Respond to" do
55 56 57
    it { is_expected.to respond_to(:unchecked?) }
    it { is_expected.to respond_to(:can_be_merged?) }
    it { is_expected.to respond_to(:cannot_be_merged?) }
58
  end
A
Andrey Kumanyaev 已提交
59

60 61 62 63 64 65 66 67 68
  describe '#to_reference' do
    it 'returns a String reference to the object' do
      expect(subject.to_reference).to eq "!#{subject.iid}"
    end

    it 'supports a cross-project reference' do
      cross = double('project')
      expect(subject.to_reference(cross)).to eq "#{subject.source_project.to_reference}!#{subject.iid}"
    end
69
  end
70 71

  describe "#mr_and_commit_notes" do
72
    let!(:merge_request) { create(:merge_request) }
73 74

    before do
75
      allow(merge_request).to receive(:commits) { [merge_request.source_project.repository.commit] }
D
Dmitriy Zaporozhets 已提交
76 77
      create(:note, commit_id: merge_request.commits.first.id, noteable_type: 'Commit', project: merge_request.project)
      create(:note, noteable: merge_request, project: merge_request.project)
78 79 80
    end

    it "should include notes for commits" do
81 82
      expect(merge_request.commits).not_to be_empty
      expect(merge_request.mr_and_commit_notes.count).to eq(2)
83 84
    end
  end
85

86
  subject { create(:merge_request) }
87 88 89

  describe '#is_being_reassigned?' do
    it 'returns true if the merge_request assignee has changed' do
90
      subject.assignee = create(:user)
91
      expect(subject.is_being_reassigned?).to be_truthy
92 93
    end
    it 'returns false if the merge request assignee has not changed' do
94
      expect(subject.is_being_reassigned?).to be_falsey
95 96
    end
  end
I
Izaak Alpert 已提交
97 98 99

  describe '#for_fork?' do
    it 'returns true if the merge request is for a fork' do
D
Dmitriy Zaporozhets 已提交
100 101
      subject.source_project = create(:project, namespace: create(:group))
      subject.target_project = create(:project, namespace: create(:group))
I
Izaak Alpert 已提交
102

103
      expect(subject.for_fork?).to be_truthy
I
Izaak Alpert 已提交
104
    end
D
Dmitriy Zaporozhets 已提交
105

I
Izaak Alpert 已提交
106
    it 'returns false if is not for a fork' do
107
      expect(subject.for_fork?).to be_falsey
I
Izaak Alpert 已提交
108 109 110
    end
  end

111 112 113
  describe 'detection of issues to be closed' do
    let(:issue0) { create :issue, project: subject.project }
    let(:issue1) { create :issue, project: subject.project }
S
skv 已提交
114 115 116
    let(:commit0) { double('commit0', closes_issues: [issue0]) }
    let(:commit1) { double('commit1', closes_issues: [issue0]) }
    let(:commit2) { double('commit2', closes_issues: [issue1]) }
117 118

    before do
D
Dmitriy Zaporozhets 已提交
119
      subject.stub(commits: [commit0, commit1, commit2])
120 121 122
    end

    it 'accesses the set of issues that will be closed on acceptance' do
123
      subject.project.stub(default_branch: subject.target_branch)
124

125
      expect(subject.closes_issues).to eq([issue0, issue1].sort_by(&:id))
126 127 128
    end

    it 'only lists issues as to be closed if it targets the default branch' do
129
      subject.project.stub(default_branch: 'master')
130 131
      subject.target_branch = 'something-else'

132
      expect(subject.closes_issues).to be_empty
133
    end
134 135 136 137 138 139

    it 'detects issues mentioned in the description' do
      issue2 = create(:issue, project: subject.project)
      subject.description = "Closes ##{issue2.iid}"
      subject.project.stub(default_branch: subject.target_branch)

140
      expect(subject.closes_issues).to include(issue2)
141
    end
142 143
  end

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
  describe "#work_in_progress?" do
    it "detects the 'WIP ' prefix" do
      subject.title = "WIP #{subject.title}"
      expect(subject).to be_work_in_progress
    end

    it "detects the 'WIP: ' prefix" do
      subject.title = "WIP: #{subject.title}"
      expect(subject).to be_work_in_progress
    end

    it "detects the '[WIP] ' prefix" do
      subject.title = "[WIP] #{subject.title}"
      expect(subject).to be_work_in_progress
    end

    it "doesn't detect WIP for words starting with WIP" do
      subject.title = "Wipwap #{subject.title}"
      expect(subject).not_to be_work_in_progress
    end

    it "doesn't detect WIP by default" do
      expect(subject).not_to be_work_in_progress
    end
  end

170
  it_behaves_like 'an editable mentionable' do
171 172
    subject { create(:merge_request, source_project: project, target_project: project) }

173 174 175
    let(:backref_text) { "merge request !#{subject.iid}" }
    let(:set_mentionable_text) { ->(txt){ subject.title = txt } }
  end
V
Vinnie Okada 已提交
176 177

  it_behaves_like 'a Taskable' do
178
    subject { create :merge_request, :simple }
V
Vinnie Okada 已提交
179
  end
D
Dmitriy Zaporozhets 已提交
180
end