factory_bot icon indicating copy to clipboard operation
factory_bot copied to clipboard

Add per model automatically_define_enum_traits option

Open mikespokefire opened this issue 1 year ago • 1 comments

Currently you can only specify whether to automatically define enum traits at a global level, through FactoryBot.automatically_define_enum_traits. This means that an entire codebase has to either opt-in, or opt-out from automatically defining enum traits. If you are in a large, established codebase with lots of enum's, this is quite hard to change globally when you find that automatically defining them doesn't fit for your new use case.

If we could override this at a per-factory level, we could allow individual factories to override the global setting where appropriate, in order to do customise them where necessary.

Given FactoryBot.automatically_define_enum_traits being set to true, and a model called Task with the following enum definition:

class Task
  enum :confirmed_by, [:user, :organisation], prefix: true
end

You would be able to override disable this on a per-factory basis like so:

FactoryBot.define do
  factory :task, automatically_define_enum_traits: false do
    confirmed_by { :user }

    trait :org_confirmed do
      confirmed_by { :organisation }
    end
  end
end

If FactoryBot.automatically_define_enum_traits was instead set to false, then the same model with a factory override set to true you would end up with the following automatic traits:

FactoryBot.define do
  factory :task, automatically_define_enum_traits: true do
    # The :user and :organisation traits below would be automatically
    # defined in the following way:
    #
    # trait :user do
    #   confirmed_by { :user }
    # end

    # trait :organisation do
    #   confirmed_by { :organisation }
    # end
  end
end

Fixes: https://github.com/thoughtbot/factory_bot/issues/1597

mikespokefire avatar Nov 07 '23 18:11 mikespokefire

Hey @mike-burns, this has been sat for a while. I'm just bumping it, as I'm wondering if there is any interest in solving the underlying issue or not? It's something that would be really useful for our 15 year old code base :-)

mikespokefire avatar May 24 '24 10:05 mikespokefire