spec/lib/gdk_spec.rb (132 lines of code) (raw):
# frozen_string_literal: true
RSpec.describe GDK do
before do
allow(Utils).to receive(:executable_exist?).with('brew').and_return(true)
end
describe '.config' do
it 'returns memoized config' do
stub_gdk_yaml({})
config = described_class.config
expect(described_class.config).to eql(config)
end
end
describe '.main' do
it 'calls setup_rake and delegates ARGV to Command.run' do
expect(described_class).to receive(:preload_team_member_info)
expect(described_class).to receive(:setup_rake)
args = ['args']
stub_const('ARGV', args)
expect(GDK::Command).to receive(:run).with(args)
described_class.main
end
end
describe '.pwd' do
it 'returns the current working directory' do
expect(Dir).to receive(:pwd).and_return('/foo')
expect(described_class.pwd).to eq('/foo')
end
context 'while executing GDK.main' do
it 'returns the user\'s working directory' do
allow(described_class).to receive(:preload_team_member_info)
allow(described_class).to receive(:setup_rake)
allow(Dir).to receive(:chdir)
args = ['args']
stub_const('ARGV', args)
allow(GDK::Command).to receive(:run).with(args) do
expect(described_class.pwd).to eq(Dir.pwd)
end
described_class.main
end
end
end
describe '.setup_rake' do
it 'initializes rake' do
expect(Rake.application).to receive(:init)
.with('rake', %W[--rakefile #{described_class.root}/Rakefile])
expect(Rake.application).to receive(:load_rakefile)
described_class.setup_rake
end
end
describe '.set_mac_env_vars' do
before do
stub_const('RUBY_PLATFORM', platform)
stub_env('PKG_CONFIG_PATH', nil)
stub_env('LDFLAGS', nil)
stub_env('CPPFLAGS', nil)
stub_env('BUNDLE_BUILD__PG_QUERY', nil)
stub_env('MACOSX_DEPLOYMENT_TARGET', nil)
allow(described_class).to receive(:`).with('brew --prefix icu4c').and_return('')
allow(described_class).to receive(:`).with('brew --prefix openssl').and_return('')
allow(described_class).to receive(:`).with('sw_vers --productVersion').and_return('15.3.2')
end
context 'on non-darwin platforms' do
let(:platform) { 'x86_64-linux' }
it 'does not set icu4c paths' do
described_class.set_mac_env_vars
expect(ENV.fetch('PKG_CONFIG_PATH', nil)).to be_nil
expect(ENV.fetch('LDFLAGS', nil)).to be_nil
expect(ENV.fetch('CPPFLAGS', nil)).to be_nil
end
end
context 'on darwin platforms' do
let(:platform) { 'arm64-darwin' }
let(:icu4c_prefix) { '/opt/homebrew/opt/icu4c' }
let(:openssl_prefix) { '/opt/homebrew/opt/openssl' }
context 'when homebrew is available' do
before do
allow(Utils).to receive(:executable_exist?).with('brew').and_return(true)
allow(described_class).to receive(:`).with('brew --prefix icu4c').and_return("#{icu4c_prefix}\n")
allow(described_class).to receive(:`).with('brew --prefix openssl').and_return("#{openssl_prefix}\n")
end
it 'sets successfully sets all required environment variables' do
described_class.set_mac_env_vars
expected_pkg_config_path = "#{openssl_prefix}/lib/pkgconfig:#{icu4c_prefix}/lib/pkgconfig"
expect(ENV.fetch('PKG_CONFIG_PATH', nil)).to eq(expected_pkg_config_path)
expect(ENV.fetch('LDFLAGS', nil)).to eq("-L#{icu4c_prefix}/lib")
expect(ENV.fetch('CPPFLAGS', nil)).to eq("-I#{icu4c_prefix}/include")
expect(ENV.fetch('BUNDLE_BUILD__PG_QUERY', nil)).to eq('--with-cflags=-DHAVE_STRCHRNUL')
expect(ENV.fetch('MACOSX_DEPLOYMENT_TARGET', nil)).to eq('15.3.2')
end
end
context 'when homebrew is not found' do
before do
allow(Utils).to receive(:executable_exist?).with('brew').and_return(false)
allow(GDK::Output).to receive(:error)
allow(described_class).to receive(:exit).and_throw(:exit)
end
it 'outputs an error and exits' do
expect { described_class.set_mac_env_vars }.to throw_symbol(:exit)
expect(GDK::Output).to have_received(:error).with('ERROR: Homebrew is required but cannot be found.')
expect(described_class).to have_received(:exit).with(-1)
end
end
context 'when icu4c is not found' do
before do
allow(Utils).to receive(:executable_exist?).with('brew').and_return(true)
allow(described_class).to receive(:`).with('brew --prefix icu4c').and_return('')
allow(described_class).to receive(:`).with('brew --prefix openssl').and_return("#{openssl_prefix}\n")
allow(GDK::Output).to receive(:error)
allow(described_class).to receive(:exit).and_throw(:exit)
end
it 'outputs an error and exits' do
expect { described_class.set_mac_env_vars }.to throw_symbol(:exit)
expect(GDK::Output).to have_received(:error).with('ERROR: icu4c is required but cannot be found.')
expect(described_class).to have_received(:exit).with(-1)
end
end
context 'when openssl is not found' do
before do
allow(Utils).to receive(:executable_exist?).with('brew').and_return(true)
allow(described_class).to receive(:`).with('brew --prefix icu4c').and_return("#{icu4c_prefix}\n")
allow(described_class).to receive(:`).with('brew --prefix openssl').and_return('')
allow(GDK::Output).to receive(:error)
allow(described_class).to receive(:exit).and_throw(:exit)
end
it 'outputs an error and exits' do
expect { described_class.set_mac_env_vars }.to throw_symbol(:exit)
expect(GDK::Output).to have_received(:error).with('ERROR: openssl is required but cannot be found.')
expect(described_class).to have_received(:exit).with(-1)
end
end
end
end
end