-
-
Notifications
You must be signed in to change notification settings - Fork 147
/
factory_default.rb
68 lines (54 loc) · 1.81 KB
/
factory_default.rb
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
# frozen_string_literal: true
require "test_prof/factory_bot"
require "test_prof/factory_default/factory_bot_patch"
module TestProf
# FactoryDefault allows use to re-use associated objects
# in factories implicilty
module FactoryDefault
module DefaultSyntax # :nodoc:
def create_default(name, *args, &block)
options = args.extract_options!
preserve = options.delete(:preserve_traits)
obj = TestProf::FactoryBot.create(name, *args, options, &block)
set_factory_default(name, obj, preserve_traits: preserve)
end
def set_factory_default(name, obj, preserve_traits: nil)
FactoryDefault.register(name, obj, preserve_traits: preserve_traits)
end
end
class << self
attr_accessor :preserve_traits
def init
TestProf::FactoryBot::Syntax::Methods.include DefaultSyntax
TestProf::FactoryBot.extend DefaultSyntax
TestProf::FactoryBot::Strategy::Create.prepend StrategyExt
TestProf::FactoryBot::Strategy::Build.prepend StrategyExt
TestProf::FactoryBot::Strategy::Stub.prepend StrategyExt
@store = {}
# default is false to retain backward compatibility
@preserve_traits = false
end
def register(name, obj, **options)
options[:preserve_traits] = true if FactoryDefault.preserve_traits
store[name] = { object: obj, **options }
obj
end
def get(name, traits = nil)
record = store[name]
return unless record
if traits && !traits.empty?
return if FactoryDefault.preserve_traits || record[:preserve_traits]
end
record[:object]
end
def remove(name)
store.delete(name)
end
def reset
@store.clear
end
private
attr_reader :store
end
end
end