thoughtbot / factory_bot

A library for setting up Ruby objects as test data.

Home Page:https://thoughtbot.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Configurable ID factory for build_stubbed

olivier-thatch opened this issue · comments

Problem this feature will solve

We use a slightly unconventional ID scheme in our DB. Rather than the usual auto-incrementing IDs or UUIDs, we use string IDs like those found in Stripe's API. (Basically our IDs look like <prefix>_<uuid> where prefix is unique to each model class, but that's not relevant to the request.)

Today, FactoryBot only supports auto-incrementing IDs or UUIDs when building stubbed models.

Desired solution

It would be great if there was a way to provide a callable to FactoryBot to be used to generate IDs for stubbed models. What I had in mind was something like this:

FactoryBot.build_stubbed_id_factory = lambda do |result_instance|
  if funky_model_has_custom_id_generator?(result_instance)
    generate_custom_id(result_instance)
  end

FactoryBot would use the ID factory if it's defined and returns a non-nil result, or fall back to the current behavior otherwise.

Alternatives considered

Right now we're directly patching FactoryBot, but that's obviously not great.

Here's our patch FWIW:

module FactoryBot
  module Strategy
    class Stub
      orig_next_id = instance_method(:next_id)
      define_method(:next_id) do |result_instance|
        if result_instance.class.respond_to?(:generate_id)
          result_instance.class.generate_id
        else
          orig_next_id.bind_call(self, result_instance)
        end
      end
      private :next_id
    end
  end
end

Additional context

I'm happy to submit a PR for this feature if you think it would be a nice addition to the gem.