File: factory_bot_patch.rb

package info (click to toggle)
ruby-test-prof 1.5.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 660 kB
  • sloc: ruby: 6,064; makefile: 4
file content (70 lines) | stat: -rw-r--r-- 2,353 bytes parent folder | download
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
# frozen_string_literal: true

require "test_prof/factory_bot"

module TestProf
  module FactoryDefault # :nodoc: all
    module FactoryBotPatch
      if defined?(TestProf::FactoryBot::FactoryRunner)
        module RunnerExt
          refine TestProf::FactoryBot::FactoryRunner do
            attr_reader :name, :traits, :overrides
          end
        end

        using RunnerExt
      end

      module StrategyExt
        def association(runner)
          FactoryDefault.get(runner.name, runner.traits, runner.overrides, **{}) ||
            FactoryDefault.profiler.instrument(runner.name, runner.traits, runner.overrides) { super }
        end
      end

      module SyntaxExt
        def create_default(name, *args, &block)
          options = args.extract_options!
          default_options = {}
          default_options[:preserve_traits] = options.delete(:preserve_traits) if options.key?(:preserve_traits)
          default_options[:preserve_attributes] = options.delete(:preserve_attributes) if options.key?(:preserve_attributes)

          obj = TestProf::FactoryBot.create(name, *args, options, &block)

          # Factory with traits
          name = [name, *args] if args.any?

          set_factory_default(name, obj, **default_options)
        end

        def set_factory_default(*name, obj, preserve_traits: FactoryDefault.config.preserve_traits, preserve_attributes: FactoryDefault.config.preserve_attributes, **other)
          name = name.first if name.size == 1
          FactoryDefault.register(
            name, obj,
            preserve_traits: preserve_traits,
            preserve_attributes: preserve_attributes,
            **other
          )
        end

        def get_factory_default(name, *traits, **overrides)
          FactoryDefault.get(name, traits, overrides, skip_stats: true)
        end

        def skip_factory_default(&block)
          FactoryDefault.disable!(&block)
        end
      end

      def self.patch
        return unless defined?(TestProf::FactoryBot)

        TestProf::FactoryBot::Syntax::Methods.include SyntaxExt
        TestProf::FactoryBot.extend SyntaxExt
        TestProf::FactoryBot::Strategy::Create.prepend StrategyExt
        TestProf::FactoryBot::Strategy::Build.prepend StrategyExt
        TestProf::FactoryBot::Strategy::Stub.prepend StrategyExt
      end
    end
  end
end