close_service_spec.rb 3.4 KB
Newer Older
1 2
require 'spec_helper'

D
Douwe Maan 已提交
3
describe Issues::CloseService, services: true do
4 5
  let(:user) { create(:user) }
  let(:user2) { create(:user) }
6
  let(:guest) { create(:user) }
7
  let(:issue) { create(:issue, assignees: [user2]) }
D
Douwe Maan 已提交
8
  let(:project) { issue.project }
9
  let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
10 11 12 13

  before do
    project.team << [user, :master]
    project.team << [user2, :developer]
14
    project.team << [guest, :guest]
15 16
  end

17
  describe '#execute' do
18 19 20
    let(:service) { described_class.new(project, user) }

    it 'checks if the user is authorized to update the issue' do
21 22
      expect(service).to receive(:can?).with(user, :update_issue, issue)
        .and_call_original
23 24 25 26 27

      service.execute(issue)
    end

    it 'does not close the issue when the user is not authorized to do so' do
28 29
      allow(service).to receive(:can?).with(user, :update_issue, issue)
        .and_return(false)
30 31 32 33 34 35

      expect(service).not_to receive(:close_issue)
      expect(service.execute(issue)).to eq(issue)
    end

    it 'closes the issue when the user is authorized to do so' do
36 37
      allow(service).to receive(:can?).with(user, :update_issue, issue)
        .and_return(true)
38

39 40
      expect(service).to receive(:close_issue)
        .with(issue, commit: nil, notifications: true, system_note: true)
41 42 43

      service.execute(issue)
    end
44 45 46 47 48 49

    it 'invalidates counter cache for assignees' do
      expect_any_instance_of(User).to receive(:invalidate_issue_cache_counts)

      service.execute(issue)
    end
50 51 52
  end

  describe '#close_issue' do
53 54
    context "valid params" do
      before do
V
Valery Sizov 已提交
55
        perform_enqueued_jobs do
56
          described_class.new(project, user).close_issue(issue)
V
Valery Sizov 已提交
57
        end
58 59
      end

60 61 62 63
      it 'closes the issue' do
        expect(issue).to be_valid
        expect(issue).to be_closed
      end
64

65
      it 'sends email to user2 about assign of new issue' do
66
        email = ActionMailer::Base.deliveries.last
67 68
        expect(email.to.first).to eq(user2.email)
        expect(email.subject).to include(issue.title)
69 70
      end

71
      it 'creates system note about issue reassign' do
72
        note = issue.notes.last
73
        expect(note.note).to include "closed"
74
      end
75

76 77
      it 'marks todos as done' do
        expect(todo.reload).to be_done
78
      end
79
    end
80

81 82 83 84 85
    context 'when issue is not confidential' do
      it 'executes issue hooks' do
        expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
        expect(project).to receive(:execute_services).with(an_instance_of(Hash), :issue_hooks)

86
        described_class.new(project, user).close_issue(issue)
87 88 89
      end
    end

90
    context 'when issue is confidential' do
91
      it 'executes confidential issue hooks' do
92 93
        issue = create(:issue, :confidential, project: project)

94 95
        expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :confidential_issue_hooks)
        expect(project).to receive(:execute_services).with(an_instance_of(Hash), :confidential_issue_hooks)
96

97
        described_class.new(project, user).close_issue(issue)
98 99 100
      end
    end

101
    context 'internal issues disabled' do
102
      before do
103 104
        project.issues_enabled = false
        project.save!
105 106
      end

107
      it 'does not close the issue' do
108 109 110 111
        expect(issue).to be_valid
        expect(issue).to be_opened
        expect(todo.reload).to be_pending
      end
112
    end
113 114
  end
end