Search code examples
ruby-on-railsrspecmockingrspec-rails

Rspec ignore allow block?


I want to test a rails job which call an endpoint of hubspot API (GET /crm/v3/owners/{ownerId}) and update a record with infos of the request result.

The problem is that I use this gem as an API wrapper and my before block seems like ignored because the result shows that the API call can't give me an owner object with this owner_id (the one given as parameter of attributes is obviously fake). A before block is supposed to override the "normal" response of the controller isn't it ?

I really don't know what I am doing wrong ..

For more context:

My job code

module Hubspots
  module Contracts
    class UpdateJob < BaseJob
      queue_as :high_priority

      def perform(attributes)
        contract = Contract.find_by(hubspot_sales_deal_id: attributes[:hubspot_sales_deal_id])
        return if contract.nil?

        deal_owner = client.crm.owners.owners_api.get_by_id(owner_id: attributes[:hubspot_tailor_deal_owner],
                                                            id_property: 'id', archived: false)

        attributes[:hubspot_tailor_deal_owner] = get_owner_name(deal_owner)

        contract.update!(attributes)
      end

      private

      def get_owner_name(hubspot_owner_object)
        "#{hubspot_owner_object.last_name.upcase} #{hubspot_owner_object.first_name.capitalize}"
      end
    end
  end
end

My test code

RSpec.describe Hubspots::Contracts::UpdateJob, type: :job do
  let!(:job) { described_class.new }
  let(:perform) { job.perform(attributes) }
  let!(:contract) { create(:contract, hubspot_sales_deal_id: 123) }
  let!(:attributes) do
    { hubspot_tailor_deal_id: 456, hubspot_tailor_deal_owner: 876, hubspot_sales_deal_id: 123 }
  end
  let!(:deal_owner_api) { Hubspot::Client.new(access_token: ENV['HUBSPOT_ACCESS_TOKEN']).crm.owners.owners_api }
  let!(:deal_owner_properties) { { last_name: 'Doe', first_name: 'John' } }

  before do
    allow(deal_owner_api).to receive(:get_by_id).and_return(deal_owner_properties)
  end

  describe '#perform' do
    it 'updates contract' do
      expect { perform }.to change { contract.reload.hubspot_tailor_deal_owner }.from(nil)
                                                                                .to('DOE John')
    end
  end
end

Test result enter image description here

I try to rtfm on google but I didn't find the solution yet (I'm always bad for rtfm btw)


Solution

  • Ok my CTO finaly gave me the solution by using the Webmock gem

    The code snippet :

    before do
        stub_request(:get, 'https://api.hubapi.com/crm/v3/owners/876?archived=false&idProperty=id')
          .with(headers: { 'Authorization' => "Bearer #{ENV['HUBSPOT_ACCESS_TOKEN']}" }).to_return(status: 200, body: {
            firstName: 'John',
            lastName: 'Doe'
          }.to_json, headers: {})
      end
    
      describe '#perform' do
        it 'updates contract' do
          expect { perform }.to change { contract.reload.hubspot_tailor_deal_owner }.from(nil)
                                                                                    .to('DOE John')
        end
      end