pivotaltracker_service_spec.rb 2.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
require 'spec_helper'

describe PivotaltrackerService, 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 'when service is active' do
11 12 13
      before do
        subject.active = true
      end
14 15 16 17 18

      it { is_expected.to validate_presence_of(:token) }
    end

    context 'when service is inactive' do
19 20 21
      before do
        subject.active = false
      end
22 23 24 25

      it { is_expected.not_to validate_presence_of(:token) }
    end
  end
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

  describe 'Execute' do
    let(:service) do
      PivotaltrackerService.new.tap do |service|
        service.token = 'secret_api_token'
      end
    end

    let(:url) { PivotaltrackerService::API_ENDPOINT }

    def push_data(branch: 'master')
      {
        object_kind: 'push',
        ref: "refs/heads/#{branch}",
        commits: [
          {
            id: '21c12ea',
            author: {
              name: 'Some User'
            },
            url: 'https://example.com/commit',
47
            message: 'commit message'
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
          }
        ]
      }
    end

    before do
      WebMock.stub_request(:post, url)
    end

    it 'should post correct message' do
      service.execute(push_data)
      expect(WebMock).to have_requested(:post, url).with(
        body: {
          'source_commit' => {
            'commit_id' => '21c12ea',
            'author' => 'Some User',
            'url' => 'https://example.com/commit',
            'message' => 'commit message'
          }
        },
        headers: {
          'Content-Type' => 'application/json',
          'X-TrackerToken' => 'secret_api_token'
        }
      ).once
    end

    context 'when allowed branches is specified' do
      let(:service) do
        super().tap do |service|
          service.restrict_to_branch = 'master,v10'
        end
      end

      it 'should post message if branch is in the list' do
        service.execute(push_data(branch: 'master'))
        service.execute(push_data(branch: 'v10'))

        expect(WebMock).to have_requested(:post, url).twice
      end

      it 'should not post message if branch is not in the list' do
        service.execute(push_data(branch: 'mas'))
        service.execute(push_data(branch: 'v11'))

        expect(WebMock).not_to have_requested(:post, url)
      end
    end
  end
97
end