issuable_spec.rb 7.9 KB
Newer Older
1 2
require 'spec_helper'

D
Dmitriy Zaporozhets 已提交
3
describe Issue, "Issuable" do
4
  let(:issue) { create(:issue) }
5
  let(:user) { create(:user) }
6 7

  describe "Associations" do
8 9 10 11
    it { is_expected.to belong_to(:project) }
    it { is_expected.to belong_to(:author) }
    it { is_expected.to belong_to(:assignee) }
    it { is_expected.to have_many(:notes).dependent(:destroy) }
12
    it { is_expected.to have_many(:todos).dependent(:destroy) }
13 14
  end

15 16 17 18
  describe 'Included modules' do
    it { is_expected.to include_module(Awardable) }
  end

19
  describe "Validation" do
20 21 22 23
    before do
      allow(subject).to receive(:set_iid).and_return(false)
    end

24 25 26 27
    it { is_expected.to validate_presence_of(:project) }
    it { is_expected.to validate_presence_of(:iid) }
    it { is_expected.to validate_presence_of(:author) }
    it { is_expected.to validate_presence_of(:title) }
28
    it { is_expected.to validate_length_of(:title).is_at_least(0).is_at_most(255) }
29 30 31
  end

  describe "Scope" do
32 33 34
    it { expect(described_class).to respond_to(:opened) }
    it { expect(described_class).to respond_to(:closed) }
    it { expect(described_class).to respond_to(:assigned) }
35 36 37 38 39
  end

  describe ".search" do
    let!(:searchable_issue) { create(:issue, title: "Searchable issue") }

Y
Yorick Peterse 已提交
40
    it 'returns notes with a matching title' do
41 42 43 44 45
      expect(described_class.search(searchable_issue.title)).
        to eq([searchable_issue])
    end

    it 'returns notes with a partially matching title' do
46
      expect(described_class.search('able')).to eq([searchable_issue])
47
    end
48 49 50 51 52 53 54 55 56 57 58 59

    it 'returns notes with a matching title regardless of the casing' do
      expect(described_class.search(searchable_issue.title.upcase)).
        to eq([searchable_issue])
    end
  end

  describe ".full_search" do
    let!(:searchable_issue) do
      create(:issue, title: "Searchable issue", description: 'kittens')
    end

Y
Yorick Peterse 已提交
60
    it 'returns notes with a matching title' do
61 62 63 64 65 66 67 68 69 70 71 72 73
      expect(described_class.full_search(searchable_issue.title)).
        to eq([searchable_issue])
    end

    it 'returns notes with a partially matching title' do
      expect(described_class.full_search('able')).to eq([searchable_issue])
    end

    it 'returns notes with a matching title regardless of the casing' do
      expect(described_class.full_search(searchable_issue.title.upcase)).
        to eq([searchable_issue])
    end

Y
Yorick Peterse 已提交
74
    it 'returns notes with a matching description' do
75 76 77 78 79 80 81 82 83 84 85 86 87
      expect(described_class.full_search(searchable_issue.description)).
        to eq([searchable_issue])
    end

    it 'returns notes with a partially matching description' do
      expect(described_class.full_search(searchable_issue.description)).
        to eq([searchable_issue])
    end

    it 'returns notes with a matching description regardless of the casing' do
      expect(described_class.full_search(searchable_issue.description.upcase)).
        to eq([searchable_issue])
    end
88 89 90 91 92
  end

  describe "#today?" do
    it "returns true when created today" do
      # Avoid timezone differences and just return exactly what we want
93 94
      allow(Date).to receive(:today).and_return(issue.created_at.to_date)
      expect(issue.today?).to be_truthy
95 96 97
    end

    it "returns false when not created today" do
98 99
      allow(Date).to receive(:today).and_return(Date.yesterday)
      expect(issue.today?).to be_falsey
100 101 102 103 104
    end
  end

  describe "#new?" do
    it "returns true when created today and record hasn't been updated" do
105 106
      allow(issue).to receive(:today?).and_return(true)
      expect(issue.new?).to be_truthy
107 108 109
    end

    it "returns false when not created today" do
110 111
      allow(issue).to receive(:today?).and_return(false)
      expect(issue.new?).to be_falsey
112 113 114
    end

    it "returns false when record has been updated" do
115
      allow(issue).to receive(:today?).and_return(true)
116
      issue.touch
117
      expect(issue.new?).to be_falsey
118 119
    end
  end
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
  describe '#subscribed?' do
    context 'user is not a participant in the issue' do
      before { allow(issue).to receive(:participants).with(user).and_return([]) }

      it 'returns false when no subcription exists' do
        expect(issue.subscribed?(user)).to be_falsey
      end

      it 'returns true when a subcription exists and subscribed is true' do
        issue.subscriptions.create(user: user, subscribed: true)

        expect(issue.subscribed?(user)).to be_truthy
      end

      it 'returns false when a subcription exists and subscribed is false' do
        issue.subscriptions.create(user: user, subscribed: false)

        expect(issue.subscribed?(user)).to be_falsey
      end
    end

    context 'user is a participant in the issue' do
      before { allow(issue).to receive(:participants).with(user).and_return([user]) }

      it 'returns false when no subcription exists' do
        expect(issue.subscribed?(user)).to be_truthy
      end

      it 'returns true when a subcription exists and subscribed is true' do
        issue.subscriptions.create(user: user, subscribed: true)

        expect(issue.subscribed?(user)).to be_truthy
      end

      it 'returns false when a subcription exists and subscribed is false' do
        issue.subscriptions.create(user: user, subscribed: false)

        expect(issue.subscribed?(user)).to be_falsey
      end
    end
  end

163
  describe "#to_hook_data" do
164 165 166
    let(:data) { issue.to_hook_data(user) }
    let(:project) { issue.project }

167 168

    it "returns correct hook data" do
169 170 171 172
      expect(data[:object_kind]).to eq("issue")
      expect(data[:user]).to eq(user.hook_attrs)
      expect(data[:object_attributes]).to eq(issue.hook_attrs)
      expect(data).to_not have_key(:assignee)
173 174 175 176 177 178
    end

    context "issue is assigned" do
      before { issue.update_attribute(:assignee, user) }

      it "returns correct hook data" do
179 180
        expect(data[:object_attributes]['assignee_id']).to eq(user.id)
        expect(data[:assignee]).to eq(user.hook_attrs)
181
      end
182
    end
183 184 185

    include_examples 'project hook data'
    include_examples 'deprecated repository hook data'
186
  end
187 188 189 190 191 192 193

  describe '#card_attributes' do
    it 'includes the author name' do
      allow(issue).to receive(:author).and_return(double(name: 'Robert'))
      allow(issue).to receive(:assignee).and_return(nil)

      expect(issue.card_attributes).
D
Douwe Maan 已提交
194
        to eq({ 'Author' => 'Robert', 'Assignee' => nil })
195 196 197 198 199 200 201
    end

    it 'includes the assignee name' do
      allow(issue).to receive(:author).and_return(double(name: 'Robert'))
      allow(issue).to receive(:assignee).and_return(double(name: 'Douwe'))

      expect(issue.card_attributes).
D
Douwe Maan 已提交
202
        to eq({ 'Author' => 'Robert', 'Assignee' => 'Douwe' })
203 204
    end
  end
205

206
  # TODO ZJ
207 208
  describe "votes" do
    before do
209 210
      create!(:award_emoji, :upvote, awardable: issue)
      create!(:award_emoji, :downvote, awardable: issue)
211 212 213 214 215 216 217
    end

    it "returns correct values" do
      expect(issue.upvotes).to eq(1)
      expect(issue.downvotes).to eq(1)
    end
  end
218 219

  describe ".with_label" do
J
James Lopez 已提交
220 221 222 223 224 225 226
    let(:project) { create(:project, :public) }
    let(:bug) { create(:label, project: project, title: 'bug') }
    let(:feature) { create(:label, project: project, title: 'feature') }
    let(:enhancement) { create(:label, project: project, title: 'enhancement') }
    let(:issue1) { create(:issue, title: "Bugfix1", project: project) }
    let(:issue2) { create(:issue, title: "Bugfix2", project: project) }
    let(:issue3) { create(:issue, title: "Feature1", project: project) }
227

228
    before(:each) do
J
James Lopez 已提交
229 230 231 232 233
      issue1.labels << bug
      issue1.labels << feature
      issue2.labels << bug
      issue2.labels << enhancement
      issue3.labels << feature
234 235
    end

J
James Lopez 已提交
236 237
    it 'finds the correct issue containing just enhancement label' do
      expect(Issue.with_label(enhancement.title)).to match_array([issue2])
238 239
    end

J
James Lopez 已提交
240 241
    it 'finds the correct issues containing the same label' do
      expect(Issue.with_label(bug.title)).to match_array([issue1, issue2])
242
    end
243

J
James Lopez 已提交
244 245
    it 'finds the correct issues containing only both labels' do
      expect(Issue.with_label([bug.title, enhancement.title])).to match_array([issue2])
246
    end
247
  end
248
end