BigW Consortium Gitlab

teamcity_service_spec.rb 6.68 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# == 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 TeamcityService, models: true do
24
  describe 'Associations' do
25 26 27 28
    it { is_expected.to belong_to :project }
    it { is_expected.to have_one :service_hook }
  end

29
  describe 'Validations' do
30
    subject { service }
31

32 33
    context 'when service is active' do
      before { subject.active = true }
34

35 36 37
      it { is_expected.to validate_presence_of(:build_type) }
      it { is_expected.to validate_presence_of(:teamcity_url) }
      it_behaves_like 'issue tracker service URL attribute', :teamcity_url
38

39 40 41
      describe '#username' do
        it 'does not validate the presence of username if password is nil' do
          subject.password = nil
42

43 44
          expect(subject).not_to validate_presence_of(:username)
        end
45

46 47
        it 'validates the presence of username if password is present' do
          subject.password = 'secret'
48

49 50
          expect(subject).to validate_presence_of(:username)
        end
51
      end
52

53 54 55
      describe '#password' do
        it 'does not validate the presence of password if username is nil' do
          subject.username = nil
56

57 58
          expect(subject).not_to validate_presence_of(:password)
        end
59

60 61
        it 'validates the presence of password if username is present' do
          subject.username = 'john'
62

63 64
          expect(subject).to validate_presence_of(:password)
        end
65
      end
66
    end
67

68 69
    context 'when service is inactive' do
      before { subject.active = false }
70

71 72 73 74
      it { is_expected.not_to validate_presence_of(:build_type) }
      it { is_expected.not_to validate_presence_of(:teamcity_url) }
      it { is_expected.not_to validate_presence_of(:username) }
      it { is_expected.not_to validate_presence_of(:password) }
75 76
    end
  end
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

  describe 'Callbacks' do
    describe 'before_update :reset_password' do
      context 'when a password was previously set' do
        it 'resets password if url changed' do
          teamcity_service = service

          teamcity_service.teamcity_url = 'http://gitlab1.com'
          teamcity_service.save

          expect(teamcity_service.password).to be_nil
        end

        it 'does not reset password if username changed' do
          teamcity_service = service

          teamcity_service.username = 'some_name'
          teamcity_service.save

          expect(teamcity_service.password).to eq('password')
        end

        it "does not reset password if new url is set together with password, even if it's the same password" do
          teamcity_service = service

          teamcity_service.teamcity_url = 'http://gitlab_edited.com'
          teamcity_service.password = 'password'
          teamcity_service.save

          expect(teamcity_service.password).to eq('password')
          expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com')
        end
      end

      it 'saves password if new url is set together with password when no password was previously set' do
        teamcity_service = service
        teamcity_service.password = nil

        teamcity_service.teamcity_url = 'http://gitlab_edited.com'
        teamcity_service.password = 'password'
        teamcity_service.save

        expect(teamcity_service.password).to eq('password')
        expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com')
      end
    end
  end

  describe '#build_page' do
    it 'returns a specific URL when status is 500' do
      stub_request(status: 500)

129
      expect(service.build_page('123', 'unused')).to eq('http://gitlab.com/teamcity/viewLog.html?buildTypeId=foo')
130 131 132 133 134
    end

    it 'returns a build URL when teamcity_url has no trailing slash' do
      stub_request(body: %Q({"build":{"id":"666"}}))

135
      expect(service(teamcity_url: 'http://gitlab.com/teamcity').build_page('123', 'unused')).to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo')
136 137 138 139 140
    end

    it 'returns a build URL when teamcity_url has a trailing slash' do
      stub_request(body: %Q({"build":{"id":"666"}}))

141
      expect(service(teamcity_url: 'http://gitlab.com/teamcity/').build_page('123', 'unused')).to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo')
142 143 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 170 171 172 173 174 175 176 177 178 179 180 181 182
    end
  end

  describe '#commit_status' do
    it 'sets commit status to :error when status is 500' do
      stub_request(status: 500)

      expect(service.commit_status('123', 'unused')).to eq(:error)
    end

    it 'sets commit status to "pending" when status is 404' do
      stub_request(status: 404)

      expect(service.commit_status('123', 'unused')).to eq('pending')
    end

    it 'sets commit status to "success" when build status contains SUCCESS' do
      stub_request(build_status: 'YAY SUCCESS!')

      expect(service.commit_status('123', 'unused')).to eq('success')
    end

    it 'sets commit status to "failed" when build status contains FAILURE' do
      stub_request(build_status: 'NO FAILURE!')

      expect(service.commit_status('123', 'unused')).to eq('failed')
    end

    it 'sets commit status to "pending" when build status contains Pending' do
      stub_request(build_status: 'NO Pending!')

      expect(service.commit_status('123', 'unused')).to eq('pending')
    end

    it 'sets commit status to :error when build status is unknown' do
      stub_request(build_status: 'FOO BAR!')

      expect(service.commit_status('123', 'unused')).to eq(:error)
    end
  end

183
  def service(teamcity_url: 'http://gitlab.com/teamcity')
184
    described_class.create(
185
      project: create(:empty_project),
186 187 188 189 190 191 192 193 194 195
      properties: {
        teamcity_url: teamcity_url,
        username: 'mic',
        password: 'password',
        build_type: 'foo'
      }
    )
  end

  def stub_request(status: 200, body: nil, build_status: 'success')
196
    teamcity_full_url = 'http://mic:password@gitlab.com/teamcity/httpAuth/app/rest/builds/branch:unspecified:any,number:123'
197 198 199 200 201 202 203 204
    body ||= %Q({"build":{"status":"#{build_status}","id":"666"}})

    WebMock.stub_request(:get, teamcity_full_url).to_return(
      status: status,
      headers: { 'Content-Type' => 'application/json' },
      body: body
    )
  end
205
end