BigW Consortium Gitlab

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

3
describe TeamcityService, :use_clean_rails_memory_store_caching do
4 5 6 7 8 9
  include ReactiveCachingHelpers

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

  subject(:service) do
    described_class.create(
10
      project: create(:project),
11 12 13 14 15 16 17 18 19
      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
    context 'when service is active' do
27 28 29
      before do
        subject.active = true
      end
30

31 32 33
      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
34

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

39 40
          expect(subject).not_to validate_presence_of(:username)
        end
41

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

45 46
          expect(subject).to validate_presence_of(:username)
        end
47
      end
48

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

53 54
          expect(subject).not_to validate_presence_of(:password)
        end
55

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

59 60
          expect(subject).to validate_presence_of(:password)
        end
61
      end
62
    end
63

64
    context 'when service is inactive' do
65 66 67
      before do
        subject.active = false
      end
68

69 70 71 72
      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) }
73 74
    end
  end
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

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

127
      expect(service.build_page('sha', 'ref')).to eq('foo')
128
    end
129
  end
130

131 132 133
  describe '#commit_status' do
    it 'returns the contents of the reactive cache' do
      stub_reactive_cache(service, { commit_status: 'foo' }, 'sha', 'ref')
134

135
      expect(service.commit_status('sha', 'ref')).to eq('foo')
136
    end
137
  end
138

139 140 141
  describe '#calculate_reactive_cache' do
    context 'build_page' do
      subject { service.calculate_reactive_cache('123', 'unused')[:build_page] }
142

143 144
      it 'returns a specific URL when status is 500' do
        stub_request(status: 500)
145

146 147
        is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildTypeId=foo')
      end
148

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

152 153
        is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo')
      end
154

155 156
      context 'teamcity_url has trailing slash' do
        let(:teamcity_url) { 'http://gitlab.com/teamcity/' }
157

158
        it 'returns a build URL' do
159
          stub_request(body: %q({"build":{"id":"666"}}))
160

161 162 163
          is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo')
        end
      end
164 165
    end

166 167
    context 'commit_status' do
      subject { service.calculate_reactive_cache('123', 'unused')[:commit_status] }
168

169 170
      it 'sets commit status to :error when status is 500' do
        stub_request(status: 500)
171

172 173
        is_expected.to eq(:error)
      end
174

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

178 179
        is_expected.to eq('pending')
      end
180

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

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
        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
205 206 207
  end

  def stub_request(status: 200, body: nil, build_status: 'success')
208 209 210
    teamcity_full_url = 'http://gitlab.com/teamcity/httpAuth/app/rest/builds/branch:unspecified:any,number:123'
    auth = %w(mic password)

211
    body ||= %Q({"build":{"status":"#{build_status}","id":"666"}})
212

213
    WebMock.stub_request(:get, teamcity_full_url).with(basic_auth: auth).to_return(
214 215 216 217 218
      status: status,
      headers: { 'Content-Type' => 'application/json' },
      body: body
    )
  end
219
end