BigW Consortium Gitlab

teamcity_service_spec.rb 6.44 KB
Newer Older
1 2
require 'spec_helper'

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
describe TeamcityService, models: true, caching: true do
  include ReactiveCachingHelpers

  let(:teamcity_url) { 'http://gitlab.com/teamcity' }

  subject(:service) do
    described_class.create(
      project: create(:empty_project),
      properties: {
        teamcity_url: teamcity_url,
        username: 'mic',
        password: 'password',
        build_type: 'foo'
      }
    )
  end

20
  describe 'Associations' do
21 22 23 24
    it { is_expected.to belong_to :project }
    it { is_expected.to have_one :service_hook }
  end

25
  describe 'Validations' do
26 27
    context 'when service is active' do
      before { subject.active = true }
28

29 30 31
      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
32

33 34 35
      describe '#username' do
        it 'does not validate the presence of username if password is nil' do
          subject.password = nil
36

37 38
          expect(subject).not_to validate_presence_of(:username)
        end
39

40 41
        it 'validates the presence of username if password is present' do
          subject.password = 'secret'
42

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

47 48 49
      describe '#password' do
        it 'does not validate the presence of password if username is nil' do
          subject.username = nil
50

51 52
          expect(subject).not_to validate_presence_of(:password)
        end
53

54 55
        it 'validates the presence of password if username is present' do
          subject.username = 'john'
56

57 58
          expect(subject).to validate_presence_of(:password)
        end
59
      end
60
    end
61

62 63
    context 'when service is inactive' do
      before { subject.active = false }
64

65 66 67 68
      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) }
69 70
    end
  end
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

  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
120 121
    it 'returns the contents of the reactive cache' do
      stub_reactive_cache(service, { build_page: 'foo' }, 'sha', 'ref')
122

123
      expect(service.build_page('sha', 'ref')).to eq('foo')
124
    end
125
  end
126

127 128 129
  describe '#commit_status' do
    it 'returns the contents of the reactive cache' do
      stub_reactive_cache(service, { commit_status: 'foo' }, 'sha', 'ref')
130

131
      expect(service.commit_status('sha', 'ref')).to eq('foo')
132
    end
133
  end
134

135 136 137
  describe '#calculate_reactive_cache' do
    context 'build_page' do
      subject { service.calculate_reactive_cache('123', 'unused')[:build_page] }
138

139 140
      it 'returns a specific URL when status is 500' do
        stub_request(status: 500)
141

142 143
        is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildTypeId=foo')
      end
144

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

148 149
        is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo')
      end
150

151 152
      context 'teamcity_url has trailing slash' do
        let(:teamcity_url) { 'http://gitlab.com/teamcity/' }
153

154 155
        it 'returns a build URL' do
          stub_request(body: %Q({"build":{"id":"666"}}))
156

157 158 159
          is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo')
        end
      end
160 161
    end

162 163
    context 'commit_status' do
      subject { service.calculate_reactive_cache('123', 'unused')[:commit_status] }
164

165 166
      it 'sets commit status to :error when status is 500' do
        stub_request(status: 500)
167

168 169
        is_expected.to eq(:error)
      end
170

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

174 175
        is_expected.to eq('pending')
      end
176

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

180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
        is_expected.to eq('success')
      end

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

        is_expected.to eq('failed')
      end

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

        is_expected.to eq('pending')
      end

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

        is_expected.to eq(:error)
      end
    end
201 202 203
  end

  def stub_request(status: 200, body: nil, build_status: 'success')
204
    teamcity_full_url = 'http://mic:password@gitlab.com/teamcity/httpAuth/app/rest/builds/branch:unspecified:any,number:123'
205 206 207 208 209 210 211 212
    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
213
end