From 4e730548cb0a07a5134c9a7ae121521fedf88d4b Mon Sep 17 00:00:00 2001 From: Daniel Colson Date: Sun, 9 Sep 2018 21:44:34 -0400 Subject: [PATCH] Introduce definition file path configuration Fixes #165 and closes #166 Currently the only way to customize the factory definition file paths is to do it in an initializer right after the "factory_bot.set_factory_paths" initializer. With this commit, we can customize factory definition file paths by setting `config.factory_bot.definition_file_paths` in config/application.rb or the appropriate environment file. Once we update the documentation to include this new configuration, we should be able to close #149 and #180 as well, since using this configuration can replace the initializer solution for sharing factories in an engine (the initializer solution will still work, but with the new configuration you don't need to know anything about the fbr railtie). This will also allow us to close #192, since we can use this configuration with an empty array to disable automatic loading of factories in development. --- features/load_definitions.feature | 65 ++++++++++++++++++++++++++++++- lib/factory_bot_rails/railtie.rb | 16 +++++--- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/features/load_definitions.feature b/features/load_definitions.feature index 2a21163..21c49e0 100644 --- a/features/load_definitions.feature +++ b/features/load_definitions.feature @@ -1,4 +1,4 @@ -Feature: automatically load step definitions +Feature: automatically load factory definitions Background: When I successfully run `bundle exec rails new testapp` @@ -53,7 +53,34 @@ Feature: automatically load step definitions When I run `bundle exec rake test` with a clean environment Then the output should contain "1 assertions, 0 failures, 0 errors" - Scenario: use factories advertised by railties/engines/3rd-party gems + Scenario: use custom definition file paths + When I configure the factories as: + """ + config.factory_bot.definition_file_paths = ["custom_factories_path"] + """ + When I write to "custom_factories_path.rb" with: + """ + FactoryBot.define do + factory :user do + name { "Frank" } + end + end + """ + When I write to "test/unit/user_test.rb" with: + """ + require 'test_helper' + + class UserTest < ActiveSupport::TestCase + test "use factory" do + user = FactoryBot.create(:user) + assert_equal 'Frank', user.name + end + end + """ + When I run `bundle exec rake test` with a clean environment + Then the output should contain "1 assertions, 0 failures, 0 errors" + + Scenario: use 3rd-party factories with configured definition file paths When I append to "config/application.rb" with: """ require File.expand_path('../../lib/some_railtie/railties.rb', __FILE__) @@ -62,7 +89,41 @@ Feature: automatically load step definitions """ module SomeRailtie class Railtie < ::Rails::Engine + config.factory_bot.definition_file_paths << File.expand_path('../factories', __FILE__) + end + end + """ + When I write to "lib/some_railtie/factories.rb" with: + """ + FactoryBot.define do + factory :factory_from_some_railtie, class: 'User' do + name { 'Artem' } + end + end + """ + When I write to "test/unit/user_test.rb" with: + """ + require 'test_helper' + class UserTest < ActiveSupport::TestCase + test "use factory of some_railtie" do + user = FactoryBot.create(:factory_from_some_railtie) + assert_equal 'Artem', user.name + end + end + """ + When I run `bundle exec rake test` with a clean environment + Then the output should contain "1 assertions, 0 failures, 0 errors" + + Scenario: use 3rd-party factories with an initializer + When I append to "config/application.rb" with: + """ + require File.expand_path('../../lib/some_railtie/railties.rb', __FILE__) + """ + When I write to "lib/some_railtie/railties.rb" with: + """ + module SomeRailtie + class Railtie < ::Rails::Engine initializer "some_railtie.factories", :after => "factory_bot.set_factory_paths" do FactoryBot.definition_file_paths << File.expand_path('../factories', __FILE__) end diff --git a/lib/factory_bot_rails/railtie.rb b/lib/factory_bot_rails/railtie.rb index bd39882..6ccfcc2 100644 --- a/lib/factory_bot_rails/railtie.rb +++ b/lib/factory_bot_rails/railtie.rb @@ -7,17 +7,15 @@ require "rails" module FactoryBotRails class Railtie < Rails::Railtie + config.factory_bot = ActiveSupport::OrderedOptions.new + config.factory_bot.definition_file_paths = FactoryBot.definition_file_paths initializer "factory_bot.set_fixture_replacement" do Generator.new(config).run end initializer "factory_bot.set_factory_paths" do - FactoryBot.definition_file_paths = [ - Rails.root.join("factories"), - Rails.root.join("test", "factories"), - Rails.root.join("spec", "factories"), - ] + FactoryBot.definition_file_paths = definition_file_paths end initializer "factory_bot.register_reloader" do |app| @@ -27,5 +25,13 @@ module FactoryBotRails config.after_initialize do FactoryBot.find_definitions end + + private + + def definition_file_paths + config.factory_bot.definition_file_paths.map do |path| + Rails.root.join(path) + end + end end end