summaryrefslogtreecommitdiff
path: root/spec/models/project_services/asana_service_spec.rb
blob: f3d15f3c1ea7095a9e0648c0a49512d7c3b490b8 (plain)
1
2
3
4
5
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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
120
121
122
123
124
125
126
127
128
129
130
131
# == Schema Information
#
# Table name: services
#
#  id                    :integer          not null, primary key
#  type                  :string(255)
#  title                 :string(255)
#  project_id            :integer
#  created_at            :datetime
#  updated_at            :datetime
#  active                :boolean          default(FALSE), not null
#  properties            :text
#  template              :boolean          default(FALSE)
#  push_events           :boolean          default(TRUE)
#  issues_events         :boolean          default(TRUE)
#  merge_requests_events :boolean          default(TRUE)
#  tag_push_events       :boolean          default(TRUE)
#  note_events           :boolean          default(TRUE), not null
#

require 'spec_helper'

describe AsanaService, models: true do
  describe 'Associations' do
    it { is_expected.to belong_to :project }
    it { is_expected.to have_one :service_hook }
  end

  describe 'Validations' do
    context 'active' do
      before do
        subject.active = true
      end

      it { is_expected.to validate_presence_of :api_key }
    end
  end

  describe 'Execute' do
    let(:user) { create(:user) }
    let(:project) { create(:project) }

    def create_data_for_commits(*messages)
      {
        object_kind: 'push',
        ref: 'master',
        user_name: user.name,
        commits: messages.map do |m|
          {
            message: m,
            url: 'https://gitlab.com/',
          }
        end
      }
    end

    before do
      @asana = AsanaService.new
      allow(@asana).to receive_messages(
        project: project,
        project_id: project.id,
        service_hook: true,
        api_key: 'verySecret',
        restrict_to_branch: 'master'
      )
    end

    it 'should call Asana service to create a story' do
      data = create_data_for_commits('Message from commit. related to #123456')
      expected_message = "#{data[:user_name]} pushed to branch #{data[:ref]} of #{project.name_with_namespace} ( #{data[:commits][0][:url]} ): #{data[:commits][0][:message]}"

      d1 = double('Asana::Task')
      expect(d1).to receive(:add_comment).with(text: expected_message)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '123456').once.and_return(d1)

      @asana.execute(data)
    end

    it 'should call Asana service to create a story and close a task' do
      data = create_data_for_commits('fix #456789')
      d1 = double('Asana::Task')
      expect(d1).to receive(:add_comment)
      expect(d1).to receive(:update).with(completed: true)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '456789').once.and_return(d1)

      @asana.execute(data)
    end

    it 'should be able to close via url' do
      data = create_data_for_commits('closes https://app.asana.com/19292/956299/42')
      d1 = double('Asana::Task')
      expect(d1).to receive(:add_comment)
      expect(d1).to receive(:update).with(completed: true)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '42').once.and_return(d1)

      @asana.execute(data)
    end

    it 'should allow multiple matches per line' do
      message = <<-EOF
      minor bigfix, refactoring, fixed #123 and Closes #456 work on #789
      ref https://app.asana.com/19292/956299/42 and closing https://app.asana.com/19292/956299/12
      EOF
      data = create_data_for_commits(message)
      d1 = double('Asana::Task')
      expect(d1).to receive(:add_comment)
      expect(d1).to receive(:update).with(completed: true)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '123').once.and_return(d1)

      d2 = double('Asana::Task')
      expect(d2).to receive(:add_comment)
      expect(d2).to receive(:update).with(completed: true)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '456').once.and_return(d2)

      d3 = double('Asana::Task')
      expect(d3).to receive(:add_comment)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '789').once.and_return(d3)

      d4 = double('Asana::Task')
      expect(d4).to receive(:add_comment)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '42').once.and_return(d4)

      d5 = double('Asana::Task')
      expect(d5).to receive(:add_comment)
      expect(d5).to receive(:update).with(completed: true)
      expect(Asana::Task).to receive(:find_by_id).with(anything, '12').once.and_return(d5)

      @asana.execute(data)
    end
  end
end