1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
# frozen_string_literal: true
module TestProf
# `before_all` helper configuration
module BeforeAll
class AdapterMissing < StandardError # :nodoc:
MSG = "Please, provide an adapter for `before_all` " \
"through `TestProf::BeforeAll.adapter = MyAdapter`"
def initialize
super(MSG)
end
end
class << self
attr_accessor :adapter
def begin_transaction
raise AdapterMissing if adapter.nil?
config.run_hooks(:begin) do
adapter.begin_transaction
end
yield
end
def rollback_transaction
raise AdapterMissing if adapter.nil?
config.run_hooks(:rollback) do
adapter.rollback_transaction
end
end
def config
@config ||= Configuration.new
end
def configure
yield config
end
end
class HooksChain # :nodoc:
attr_reader :type, :after, :before
def initialize(type)
@type = type
@before = []
@after = []
end
def run
before.each(&:call)
yield
after.each(&:call)
end
end
class Configuration
HOOKS = %i[begin rollback].freeze
def initialize
@hooks = Hash.new { |h, k| h[k] = HooksChain.new(k) }
end
# Add `before` hook for `begin` or
# `rollback` operation:
#
# config.before(:rollback) { ... }
def before(type, &block)
validate_hook_type!(type)
hooks[type].before << block if block_given?
end
# Add `after` hook for `begin` or
# `rollback` operation:
#
# config.after(:begin) { ... }
def after(type, &block)
validate_hook_type!(type)
hooks[type].after << block if block_given?
end
def run_hooks(type) # :nodoc:
validate_hook_type!(type)
hooks[type].run { yield }
end
private
def validate_hook_type!(type)
return if HOOKS.include?(type)
raise ArgumentError, "Unknown hook type: #{type}. Valid types: #{HOOKS.join(", ")}"
end
attr_reader :hooks
end
end
end
if defined?(::ActiveRecord::Base)
require "test_prof/before_all/adapters/active_record"
TestProf::BeforeAll.adapter = TestProf::BeforeAll::Adapters::ActiveRecord
end
if defined?(::Isolator)
require "test_prof/before_all/isolator"
end
|