fix: shopify and leadsquared specs in ci (#12926)

fix: shopify and leadsquared specs in ci
This commit is contained in:
Vishnu Narayanan
2025-11-21 17:01:03 +05:30
committed by GitHub
parent f5908b0f8a
commit a8e9acfae9
2 changed files with 47 additions and 29 deletions

View File

@@ -9,6 +9,13 @@ RSpec.describe Shopify::CallbacksController, type: :request do
let(:shopify_redirect_uri) { "#{frontend_url}/app/accounts/#{account.id}/settings/integrations/shopify" }
let(:oauth_client) { instance_double(OAuth2::Client) }
let(:auth_code_strategy) { instance_double(OAuth2::Strategy::AuthCode) }
let(:token_response) do
instance_double(
OAuth2::AccessToken,
response: instance_double(OAuth2::Response, parsed: response_body),
token: access_token
)
end
describe 'GET /shopify/callback' do
let(:access_token) { SecureRandom.hex(10) }
@@ -23,12 +30,24 @@ RSpec.describe Shopify::CallbacksController, type: :request do
stub_const('ENV', ENV.to_hash.merge('FRONTEND_URL' => frontend_url))
end
context 'when successful' do
shared_context 'with stubbed account' do
before do
controller = described_class.new
allow(controller).to receive(:verify_shopify_token).with(state).and_return(account.id)
allow(described_class).to receive(:new).and_return(controller)
allow(described_class).to receive(:new).and_wrap_original do |original, *args|
controller = original.call(*args)
allow(controller).to receive(:verify_shopify_token).and_return(account.id)
allow(controller).to receive(:oauth_client).and_return(oauth_client)
controller
end
allow(Account).to receive(:find).and_return(account)
allow(oauth_client).to receive(:auth_code).and_return(auth_code_strategy)
end
end
context 'when successful' do
include_context 'with stubbed account'
before do
allow(auth_code_strategy).to receive(:get_token).and_return(token_response)
stub_request(:post, "https://#{shop}/admin/oauth/access_token")
.to_return(
status: 200,
@@ -55,12 +74,11 @@ RSpec.describe Shopify::CallbacksController, type: :request do
end
context 'when the code is missing' do
include_context 'with stubbed account'
before do
controller = described_class.new
allow(controller).to receive(:verify_shopify_token).with(state).and_return(account.id)
allow(controller).to receive(:oauth_client).and_return(oauth_client)
allow(oauth_client).to receive(:auth_code).and_raise(StandardError)
allow(described_class).to receive(:new).and_return(controller)
allow(auth_code_strategy).to receive(:get_token).and_raise(StandardError)
stub_request(:post, "https://#{shop}/admin/oauth/access_token")
.to_return(status: 400, body: { error: 'invalid_grant' }.to_json)
end
it 'redirects to the shopify_redirect_uri with error' do
@@ -70,11 +88,8 @@ RSpec.describe Shopify::CallbacksController, type: :request do
end
context 'when the token is invalid' do
include_context 'with stubbed account'
before do
controller = described_class.new
allow(controller).to receive(:verify_shopify_token).with(state).and_return(account.id)
allow(controller).to receive(:oauth_client).and_return(oauth_client)
allow(oauth_client).to receive(:auth_code).and_return(auth_code_strategy)
allow(auth_code_strategy).to receive(:get_token).and_raise(
OAuth2::Error.new(
OpenStruct.new(
@@ -83,7 +98,9 @@ RSpec.describe Shopify::CallbacksController, type: :request do
)
)
)
allow(described_class).to receive(:new).and_return(controller)
stub_request(:post, "https://#{shop}/admin/oauth/access_token")
.to_return(status: 400, body: { error: 'invalid_grant' }.to_json)
end
it 'redirects to the shopify_redirect_uri with error' do
@@ -94,10 +111,11 @@ RSpec.describe Shopify::CallbacksController, type: :request do
context 'when state parameter is invalid' do
before do
controller = described_class.new
allow(controller).to receive(:verify_shopify_token).with(state).and_return(nil)
allow(controller).to receive(:account).and_return(nil)
allow(described_class).to receive(:new).and_return(controller)
# rubocop:disable RSpec/AnyInstance, RSpec/DescribedClass
# Explicit class name and any_instance required for parallel CI stability
allow_any_instance_of(Shopify::CallbacksController).to receive(:verify_shopify_token).and_return(nil)
allow_any_instance_of(Shopify::CallbacksController).to receive(:account).and_return(nil)
# rubocop:enable RSpec/AnyInstance, RSpec/DescribedClass
end
it 'redirects to the frontend URL with error' do

View File

@@ -63,10 +63,10 @@ RSpec.describe Crm::Leadsquared::Api::BaseClient do
end
it 'raises ApiError with error message' do
expect { client.get(path, params) }.to raise_error(
Crm::Leadsquared::Api::BaseClient::ApiError,
'Invalid lead ID'
)
expect { client.get(path, params) }.to raise_error do |error|
expect(error.class.name).to eq(described_class::ApiError.name)
expect(error.message).to eq('Invalid lead ID')
end
end
end
@@ -82,7 +82,7 @@ RSpec.describe Crm::Leadsquared::Api::BaseClient do
it 'raises ApiError with status code' do
expect { client.get(path, params) }.to raise_error do |error|
expect(error).to be_a(Crm::Leadsquared::Api::BaseClient::ApiError)
expect(error.class.name).to eq(described_class::ApiError.name)
expect(error.message).to include('Not Found')
expect(error.code).to eq(404)
end
@@ -134,10 +134,10 @@ RSpec.describe Crm::Leadsquared::Api::BaseClient do
end
it 'raises ApiError with error message' do
expect { client.post(path, params, body) }.to raise_error(
Crm::Leadsquared::Api::BaseClient::ApiError,
'Invalid data'
)
expect { client.post(path, params, body) }.to raise_error do |error|
expect(error.class.name).to eq(described_class::ApiError.name)
expect(error.message).to eq('Invalid data')
end
end
end
@@ -158,7 +158,7 @@ RSpec.describe Crm::Leadsquared::Api::BaseClient do
it 'raises ApiError for invalid JSON' do
expect { client.post(path, params, body) }.to raise_error do |error|
expect(error).to be_a(Crm::Leadsquared::Api::BaseClient::ApiError)
expect(error.class.name).to eq(described_class::ApiError.name)
expect(error.message).to include('Failed to parse')
end
end
@@ -177,7 +177,7 @@ RSpec.describe Crm::Leadsquared::Api::BaseClient do
it 'raises ApiError with status code' do
expect { client.post(path, params, body) }.to raise_error do |error|
expect(error).to be_a(Crm::Leadsquared::Api::BaseClient::ApiError)
expect(error.class.name).to eq(described_class::ApiError.name)
expect(error.message).to include('Internal Server Error')
expect(error.code).to eq(500)
end