spec/spec_helper.rb (149 lines of code) (raw):
# frozen_string_literal: true
require 'simplecov-cobertura'
require 'tzinfo'
require 'tmpdir'
require 'tempfile'
require 'webmock/rspec'
SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new([
SimpleCov::Formatter::SimpleFormatter,
SimpleCov::Formatter::HTMLFormatter,
SimpleCov::Formatter::CoberturaFormatter
])
SimpleCov.start
require_relative '../lib/gdk_src'
require_relative '../lib/gdk'
require_relative '../lib/gdk/task_helpers'
require 'rake'
require "active_support/concern"
# Autoload helpers
autoload :MeasureHelper, 'helpers/measure_helper'
autoload :ShelloutHelper, 'helpers/shellout_helper'
# Load spec support code
Dir['spec/spec_support/**/*.rb'].each { |f| load f }
RSpec.configure do |config|
# Allow running `:focus` examples locally, run everything on CI.
config.filter_run_when_matching :focus unless ENV['CI']
config.example_status_persistence_file_path = 'spec/examples.txt'
config.disable_monkey_patching!
config.order = :random
Kernel.srand config.seed
config.before(:suite) do
temp_path.glob('*').each(&:rmtree)
end
config.before do |example|
if example.metadata[:hide_stdout]
allow(GDK::Output).to receive(:print)
allow(GDK::Output).to receive(:puts)
end
if example.metadata[:hide_output]
allow(GDK::Output).to receive(:print)
allow(GDK::Output).to receive(:puts)
allow(GDK::Output).to receive(:info)
allow(GDK::Output).to receive(:warn)
allow(GDK::Output).to receive(:error)
allow(GDK::Output).to receive(:abort)
allow(GDK::Output).to receive(:success)
end
unless example.metadata[:gdk_root]
# isolate configs for the testing environment
stub_const('GDK::Config::GDK_ROOT', Pathname.new('/home/git/gdk'))
stub_const('GDK::Config::FILE', 'gdk.example.yml')
gdk_root_tmp_path = temp_path
real_tool_versions_file = Pathname.new('.tool-versions').expand_path
allow(gdk_root_tmp_path).to receive(:join).and_call_original
allow(gdk_root_tmp_path).to receive(:join).with('.tool-versions').and_return(real_tool_versions_file)
allow(gdk_root_tmp_path).to receive(:glob).with('{.tool-versions,{*,*/*}/.tool-versions}').and_return([real_tool_versions_file])
allow(GDK).to receive(:root).and_return(gdk_root_tmp_path)
stub_gdk_yaml({})
allow(Utils).to receive(:find_executable).and_return(nil)
end
unless example.metadata[:with_telemetry]
allow(GDK::Telemetry).to receive(:with_telemetry).and_wrap_original do |_method, *_args, &block|
block.call
end
allow(GDK::Telemetry).to receive(:capture_exception).with(anything)
allow(GDK::Telemetry).to receive(:send_telemetry)
allow(GDK::Telemetry).to receive(:flush_events)
end
end
end
def utc_now
TZInfo::Timezone.get('UTC').now
end
def freeze_time(&blk)
travel_to(&blk)
end
def travel_to(now = utc_now)
# Copied from https://github.com/rails/rails/blob/v6.1.3/activesupport/lib/active_support/testing/time_helpers.rb#L163-L165
#
allow(Time).to receive(:now).and_return(now)
allow(Date).to receive(:today).and_return(Date.jd(now.to_date.jd))
allow(DateTime).to receive(:now).and_return(DateTime.jd(now.to_date.jd, now.hour, now.min, now.sec, Rational(now.utc_offset, 86400)))
yield
allow(Time).to receive(:now).and_call_original
allow(Date).to receive(:today).and_call_original
allow(DateTime).to receive(:now).and_call_original
end
def fixture_path
GDK::SRC.join('spec').join('fixtures')
end
def temp_path
GDK::SRC.join('tmp')
end
def stub_env(var, return_value)
stub_const('ENV', ENV.to_hash.merge(var => return_value))
end
def stub_gdk_yaml(yaml)
yaml = YAML.safe_load(yaml) if yaml.is_a?(String)
config = GDK::Config.new(yaml: yaml)
allow(GDK).to receive(:config) { config }
end
def stub_persisted_gdk_yaml(yaml)
config = GDK::Config.load_from_file
config.instance_variable_set(:@yaml, yaml)
allow(GDK).to receive(:config) { config }
end
def stub_raw_gdk_yaml(raw_yaml)
allow(File).to receive(:read).and_call_original
allow(File).to receive(:read).with(GDK::Config::FILE).and_return(raw_yaml)
allow(GDK).to receive(:config).and_call_original
end
def stub_pg_bindir
allow_any_instance_of(GDK::PostgresqlUpgrader).to receive(:bin_path).and_return('/usr/local/bin')
end
def stub_tty(state)
allow($stdin).to receive(:isatty).and_return(state)
end
def stub_no_color_env(res)
stub_tty(true)
# res needs to be of type String as we're simulating what's coming from
# the shell command line.
stub_env('NO_COLOR', res)
end
def stub_backup
instance_spy(GDK::Backup).tap do |b|
allow(GDK::Backup).to receive(:new).and_return(b)
end
end
def stub_gdk_debug(state)
gdk_settings = double('GDK::ConfigSettings', debug?: state, __debug?: state) # rubocop:todo RSpec/VerifiedDoubles
allow_any_instance_of(GDK::Config).to receive(:gdk).and_return(gdk_settings)
end
def stub_prompt(response, message = 'Are you sure? [y/N]')
allow(GDK::Output).to receive(:interactive?).and_return(true)
allow(GDK::Output).to receive(:prompt).with(message).and_return(response)
end
def stub_tool_versions
pg_version = instance_double(Asdf::ToolVersion, name: 'postgres', version: '16.8')
pg_tool = instance_double(Asdf::Tool, name: pg_version.name, default_tool_version: pg_version)
tools = {
pg_version.name => pg_tool
}
allow_any_instance_of(Asdf::ToolVersions).to receive(:tool_versions).and_return(tools)
end
def stub_find_executable(name, path)
allow(Utils).to receive(:find_executable).with(name).and_return(path)
end
def unstub_find_executable
allow(Utils).to receive(:find_executable).and_call_original
end
def expect_no_error_report
expect(GDK::Telemetry).not_to have_received(:capture_exception)
end
def create_dummy_executable(name)
path = File.join(tmp_path, name)
FileUtils.touch(path)
File.chmod(0o755, path)
path
end