Class: Smartest::FixtureSet

Inherits:
Object
  • Object
show all
Defined in:
lib/smartest/fixture_set.rb

Instance Method Summary collapse

Constructor Details

#initialize(fixture_classes, context:, scope: :test, parent: nil) ⇒ FixtureSet

Returns a new instance of FixtureSet.



5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/smartest/fixture_set.rb', line 5

def initialize(fixture_classes, context:, scope: :test, parent: nil)
  @fixture_classes = fixture_classes.to_a
  @context = context
  @scope = normalize_scope(scope)
  @parent = parent
  @cache = {}
  @setup_errors = {}
  @cleanups = []
  @resolving = []

  build_fixture_index
end

Instance Method Details

#add_cleanup(&block) ⇒ Object

Raises:

  • (ArgumentError)


52
53
54
55
56
# File 'lib/smartest/fixture_set.rb', line 52

def add_cleanup(&block)
  raise ArgumentError, "cleanup block is required" unless block

  @cleanups << block
end

#resolve(name) ⇒ Object



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
# File 'lib/smartest/fixture_set.rb', line 25

def resolve(name)
  symbol_name = name.to_sym

  if @resolving.include?(symbol_name)
    cycle_start = @resolving.index(symbol_name)
    raise CircularFixtureDependencyError, @resolving[cycle_start..] + [symbol_name]
  end

  definition = @definitions[symbol_name]
  raise FixtureNotFoundError, symbol_name unless definition

  return resolve_from_parent(symbol_name, definition) unless definition.scope == @scope
  return @cache[symbol_name] if @cache.key?(symbol_name)
  raise @setup_errors[symbol_name] if @setup_errors.key?(symbol_name)

  @resolving << symbol_name
  dependencies = resolve_keywords(definition.dependencies)
  @cache[symbol_name] = @instances[symbol_name].instance_exec(**dependencies, &definition.block)
rescue Exception => error
  raise if Smartest.fatal_exception?(error)

  @setup_errors[symbol_name] = error if definition&.scope == @scope
  raise
ensure
  @resolving.pop if @resolving.last == symbol_name
end

#resolve_keywords(names) ⇒ Object



18
19
20
21
22
23
# File 'lib/smartest/fixture_set.rb', line 18

def resolve_keywords(names)
  names.to_h do |name|
    symbol_name = name.to_sym
    [symbol_name, resolve(symbol_name)]
  end
end

#run_cleanupsObject



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/smartest/fixture_set.rb', line 58

def run_cleanups
  errors = []

  @cleanups.reverse_each do |cleanup|
    cleanup.call
  rescue Exception => error
    raise if Smartest.fatal_exception?(error)

    errors << error
  end

  errors
end