bamboo_service_spec.rb 6.3 KB
Newer Older
1 2 3
require 'spec_helper'

describe BambooService, models: true do
4
  describe 'Associations' do
5 6 7 8
    it { is_expected.to belong_to :project }
    it { is_expected.to have_one :service_hook }
  end

9
  describe 'Validations' do
10
    subject { service }
11

12 13
    context 'when service is active' do
      before { subject.active = true }
14

15 16 17
      it { is_expected.to validate_presence_of(:build_key) }
      it { is_expected.to validate_presence_of(:bamboo_url) }
      it_behaves_like 'issue tracker service URL attribute', :bamboo_url
18

19 20 21
      describe '#username' do
        it 'does not validate the presence of username if password is nil' do
          subject.password = nil
22

23 24
          expect(subject).not_to validate_presence_of(:username)
        end
25

26 27
        it 'validates the presence of username if password is present' do
          subject.password = 'secret'
28

29 30
          expect(subject).to validate_presence_of(:username)
        end
31 32
      end

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

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

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

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

48 49
    context 'when service is inactive' do
      before { subject.active = false }
50

51 52 53 54
      it { is_expected.not_to validate_presence_of(:build_key) }
      it { is_expected.not_to validate_presence_of(:bamboo_url) }
      it { is_expected.not_to validate_presence_of(:username) }
      it { is_expected.not_to validate_presence_of(:password) }
55
    end
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
  end

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

          bamboo_service.bamboo_url = 'http://gitlab1.com'
          bamboo_service.save

          expect(bamboo_service.password).to be_nil
        end

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

          bamboo_service.username = 'some_name'
          bamboo_service.save

          expect(bamboo_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
          bamboo_service = service

          bamboo_service.bamboo_url = 'http://gitlab_edited.com'
          bamboo_service.password = 'password'
          bamboo_service.save

          expect(bamboo_service.password).to eq('password')
          expect(bamboo_service.bamboo_url).to eq('http://gitlab_edited.com')
        end
89 90
      end

91 92 93 94 95 96 97 98 99 100
      it 'saves password if new url is set together with password when no password was previously set' do
        bamboo_service = service
        bamboo_service.password = nil

        bamboo_service.bamboo_url = 'http://gitlab_edited.com'
        bamboo_service.password = 'password'
        bamboo_service.save

        expect(bamboo_service.password).to eq('password')
        expect(bamboo_service.bamboo_url).to eq('http://gitlab_edited.com')
101
      end
102 103 104 105 106 107 108
    end
  end

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

109
      expect(service.build_page('123', 'unused')).to eq('http://gitlab.com/bamboo/browse/foo')
110 111 112 113 114
    end

    it 'returns a specific URL when response has no results' do
      stub_request(body: %Q({"results":{"results":{"size":"0"}}}))

115
      expect(service.build_page('123', 'unused')).to eq('http://gitlab.com/bamboo/browse/foo')
116 117 118 119 120
    end

    it 'returns a build URL when bamboo_url has no trailing slash' do
      stub_request(body: %Q({"results":{"results":{"result":{"planResultKey":{"key":"42"}}}}}))

121
      expect(service(bamboo_url: 'http://gitlab.com/bamboo').build_page('123', 'unused')).to eq('http://gitlab.com/bamboo/browse/42')
122 123 124 125 126
    end

    it 'returns a build URL when bamboo_url has a trailing slash' do
      stub_request(body: %Q({"results":{"results":{"result":{"planResultKey":{"key":"42"}}}}}))

127
      expect(service(bamboo_url: 'http://gitlab.com/bamboo/').build_page('123', 'unused')).to eq('http://gitlab.com/bamboo/browse/42')
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
    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 "pending" when response has no results' do
      stub_request(body: %Q({"results":{"results":{"size":"0"}}}))

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

    it 'sets commit status to "success" when build state contains Success' do
      stub_request(build_state: 'YAY Success!')
152

153
      expect(service.commit_status('123', 'unused')).to eq('success')
154
    end
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174

    it 'sets commit status to "failed" when build state contains Failed' do
      stub_request(build_state: 'NO Failed!')

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

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

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

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

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

175
  def service(bamboo_url: 'http://gitlab.com/bamboo')
176
    described_class.create(
177
      project: create(:empty_project),
178 179 180 181 182 183 184 185 186 187
      properties: {
        bamboo_url: bamboo_url,
        username: 'mic',
        password: 'password',
        build_key: 'foo'
      }
    )
  end

  def stub_request(status: 200, body: nil, build_state: 'success')
188
    bamboo_full_url = 'http://mic:password@gitlab.com/bamboo/rest/api/latest/result?label=123&os_authType=basic'
189 190 191 192 193 194 195
    body ||= %Q({"results":{"results":{"result":{"buildState":"#{build_state}"}}}})

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