factory_bot-preload 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d64454e8c58e2b7f40bb5472cf74f235b2e491c2b68aaf1fce3f5ee93c81b54a
4
+ data.tar.gz: ef4f788ddac8b52519fa17b12fb5ea81ed775aa6cf2dca62d9c1e27afbfbef67
5
+ SHA512:
6
+ metadata.gz: f870dc3314015951864733fc07e81019d9cff2ab5fd29134e34b6fdf2ba2cd75a77e053b132a087b29870e6c35f7b1564c007953ddab71218d1984e8d3ead92d
7
+ data.tar.gz: 1d61cef6041938674909b6741df6b47acb8b47b123d0a6630efc311cc13f1a5475c2ecac0faf191711a50d4011eed8044cd2be49202ca2598ec908b1a318c9ee
@@ -0,0 +1,5 @@
1
+ .DS_Store
2
+ pkg
3
+ tmp
4
+ *.log
5
+ *.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
@@ -0,0 +1,203 @@
1
+ # factory_bot-preload
2
+
3
+ We all love Rails fixtures because they're fast, but we hate to deal with YAML/CSV/SQL files. Here enters [factory_bot](https://rubygems.org/gems/factory_bot) (FB).
4
+
5
+ Now, you can easily create records by using predefined factories. The problem is that hitting the database everytime to create records is pretty slow. And believe me, you'll feel the pain when you have lots of tests/specs.
6
+
7
+ So here enters Factory Bot Preload (FBP). You can define which factories will be preloaded, so you don't have to recreate it every time (that will work for 99.37% of the time, according to statistics I just made up).
8
+
9
+ ## Installation
10
+
11
+ gem install factory_bot-preload
12
+
13
+ ## Intructions
14
+
15
+ ### Installation
16
+
17
+ Add both FB and FBP to your Gemfile:
18
+
19
+ ```ruby
20
+ source "https://rubygems.org"
21
+
22
+ gem "rails"
23
+ gem "pg"
24
+
25
+ group :test, :development do
26
+ gem "factory_bot"
27
+ gem "factory_bot-preload"
28
+ end
29
+ ```
30
+
31
+ ### RSpec Setup
32
+
33
+ On your `spec/spec_helper.rb` file, make sure that transactional fixtures are enabled. Here's is my file without all those RSpec comments:
34
+
35
+ ```ruby
36
+ ENV["RAILS_ENV"] ||= "test"
37
+ require File.expand_path("../../config/environment", __FILE__)
38
+ require "rspec/rails"
39
+
40
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
41
+
42
+ RSpec.configure do |config|
43
+ config.use_transactional_fixtures = true
44
+ config.mock_with :rspec
45
+ end
46
+ ```
47
+
48
+ ### Minitest Setup
49
+
50
+ On your `test/test_helper.rb` file, make sure that transaction fixtures are enabled. Here's what your file may look like:
51
+
52
+ ```ruby
53
+ ENV["RAILS_ENV"] ||= "test"
54
+ require_relative "../config/environment"
55
+ require "rails/test_help"
56
+
57
+ module ActiveSupport
58
+ class TestCase
59
+ self.use_instantiated_fixtures = true
60
+ end
61
+ end
62
+
63
+ # First, load factory_bot/preload.
64
+ require "factory_bot/preload"
65
+
66
+ # Then load your factories.
67
+ Dir["./test/support/factories/**/*.rb"].each do |file|
68
+ require file
69
+ end
70
+
71
+ # Finally, setup minitest.
72
+ # Your factories won't behave correctly unless you
73
+ # call `FactoryBot::Preload.minitest` after loading them.
74
+ FactoryBot::Preload.minitest
75
+ ```
76
+
77
+ ### Usage
78
+
79
+ Create your factories and load it from your setup file (either `test/test_helper.rb` or `spec/spec_helper.rb`) You may have something like this:
80
+
81
+ ```ruby
82
+ FactoryBot.define do
83
+ factory :user do
84
+ name "John Doe"
85
+ sequence(:email) {|n| "john#{n}@example.org" }
86
+ sequence(:username) {|n| "john#{n}" }
87
+ password "test"
88
+ password_confirmation "test"
89
+ end
90
+
91
+ factory :projects do
92
+ name "My Project"
93
+ association :user
94
+ end
95
+ end
96
+ ```
97
+
98
+ To define your preloadable factories, just use the `preload` method:
99
+
100
+ ```ruby
101
+ FactoryBot.define do
102
+ factory :user do
103
+ name "John Doe"
104
+ sequence(:email) {|n| "john#{n}@example.org" }
105
+ sequence(:username) {|n| "john#{n}" }
106
+ password "test"
107
+ password_confirmation "test"
108
+ end
109
+
110
+ factory :projects do
111
+ name "My Project"
112
+ association :user
113
+ end
114
+
115
+ preload do
116
+ factory(:john) { create(:user) }
117
+ factory(:myapp) { create(:project, user: users(:john)) }
118
+ end
119
+ end
120
+ ```
121
+
122
+ You can also use preloaded factories on factory definitions.
123
+
124
+ ```ruby
125
+ FactoryBot.define do
126
+ factory :user do
127
+ # ...
128
+ end
129
+
130
+ factory :projects do
131
+ name "My Project"
132
+ user { users(:john) }
133
+ end
134
+
135
+ preload do
136
+ factory(:john) { create(:user) }
137
+ factory(:myapp) { create(:project, user: users(:john)) }
138
+ end
139
+ end
140
+ ```
141
+
142
+ Like Rails fixtures, FBP will define methods for each model. You can use it on your examples and alike.
143
+
144
+ ```ruby
145
+ require "test_helper"
146
+
147
+ class UserTest < ActiveSupport::TestCase
148
+ test "returns john's record" do
149
+ assert_instance_of User, users(:john)
150
+ end
151
+
152
+ test "returns myapp's record" do
153
+ assert_equal users(:john), projects(:myapp).user
154
+ end
155
+ end
156
+ ```
157
+
158
+ Or if you're using RSpec:
159
+
160
+ ```ruby
161
+ require "spec_helper"
162
+
163
+ describe User do
164
+ let(:user) { users(:john) }
165
+
166
+ it "returns john's record" do
167
+ users(:john).should be_an(User)
168
+ end
169
+
170
+ it "returns myapp's record" do
171
+ projects(:myapp).user.should == users(:john)
172
+ end
173
+ end
174
+ ```
175
+
176
+ That's it!
177
+
178
+ ## Maintainer
179
+
180
+ * Nando Vieira (http://nandovieira.com)
181
+
182
+ ## License
183
+
184
+ (The MIT License)
185
+
186
+ Permission is hereby granted, free of charge, to any person obtaining
187
+ a copy of this software and associated documentation files (the
188
+ 'Software'), to deal in the Software without restriction, including
189
+ without limitation the rights to use, copy, modify, merge, publish,
190
+ distribute, sublicense, and/or sell copies of the Software, and to
191
+ permit persons to whom the Software is furnished to do so, subject to
192
+ the following conditions:
193
+
194
+ The above copyright notice and this permission notice shall be
195
+ included in all copies or substantial portions of the Software.
196
+
197
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
198
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
199
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
200
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
201
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
202
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
203
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,26 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ case ENV["TEST_FRAMEWORK"]
4
+ when "rspec"
5
+ require "rspec/core/rake_task"
6
+ RSpec::Core::RakeTask.new
7
+
8
+ task :default => :spec
9
+ when "minitest"
10
+ require "rake/testtask"
11
+
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.libs << "test"
14
+ t.libs << "lib"
15
+ t.test_files = FileList["test/**/*_test.rb"]
16
+ t.verbose = false
17
+ t.warning = false
18
+ end
19
+
20
+ task :default => :test
21
+ else
22
+ task :default do
23
+ system "TEST_FRAMEWORK=rspec bundle exec rake spec"
24
+ system "TEST_FRAMEWORK=minitest bundle exec rake test"
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ require "./lib/factory_bot/preload/version"
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "factory_bot-preload"
5
+ s.version = FactoryBot::Preload::Version::STRING
6
+ s.platform = Gem::Platform::RUBY
7
+ s.authors = ["Nando Vieira"]
8
+ s.email = ["fnando.vieira@gmail.com"]
9
+ s.homepage = "http://rubygems.org/gems/factory_bot-preload"
10
+ s.summary = "Preload factories (Factory Bot) just like fixtures. It will be easy and, probably, faster!"
11
+ s.description = s.summary
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_dependency "activerecord"
19
+ s.add_dependency "factory_bot"
20
+
21
+ s.add_development_dependency "bundler"
22
+ s.add_development_dependency "minitest-utils"
23
+ s.add_development_dependency "pry-meta"
24
+ s.add_development_dependency "rails"
25
+ s.add_development_dependency "rake"
26
+ s.add_development_dependency "rspec-rails"
27
+ s.add_development_dependency "sqlite3", "~> 1.3.6"
28
+ end
@@ -0,0 +1 @@
1
+ require "factory_bot/preload"
@@ -0,0 +1,84 @@
1
+ require "factory_bot"
2
+ require "active_record"
3
+
4
+ module FactoryBot
5
+ module Preload
6
+ require "factory_bot/preload/helpers"
7
+ require "factory_bot/preload/version"
8
+ require "factory_bot/preload/rspec" if defined?(RSpec)
9
+ require "factory_bot/preload/minitest" if defined?(Minitest)
10
+ require "factory_bot/preload/extension"
11
+
12
+ ActiveSupport.on_load(:after_initialize) do
13
+ ::FactoryBot::SyntaxRunner.include ::FactoryBot::Preload::Helpers
14
+ end
15
+
16
+ class << self
17
+ attr_accessor :preloaders
18
+ attr_accessor :factories
19
+ attr_accessor :record_ids
20
+ attr_accessor :clean_with
21
+ end
22
+
23
+ self.preloaders = []
24
+ self.factories = {}
25
+ self.record_ids = {}
26
+ self.clean_with = :truncation
27
+
28
+ def self.active_record
29
+ ActiveRecord::Base
30
+ end
31
+
32
+ def self.connection
33
+ active_record.connection
34
+ end
35
+
36
+ def self.run
37
+ helper = Object.new.extend(Helpers)
38
+
39
+ connection.transaction requires_new: true do
40
+ preloaders.each do |block|
41
+ helper.instance_eval(&block)
42
+ end
43
+ end
44
+ end
45
+
46
+ def self.clean(*names)
47
+ query = case clean_with
48
+ when :truncation
49
+ try_truncation_query
50
+ when :deletion
51
+ "DELETE FROM %s"
52
+ else
53
+ raise "Couldn't find #{clean_with} clean type"
54
+ end
55
+
56
+ names = active_record.descendants.select(&:table_exists?).map(&:table_name).uniq if names.empty?
57
+
58
+ connection.disable_referential_integrity do
59
+ names.each do |table|
60
+ connection.execute(query % connection.quote_table_name(table))
61
+ end
62
+ end
63
+ end
64
+
65
+ def self.reload_factories
66
+ factories.each do |class_name, group|
67
+ group.each do |name, _factory|
68
+ factories[class_name][name] = nil
69
+ end
70
+ end
71
+ end
72
+
73
+ def self.try_truncation_query
74
+ case connection.adapter_name
75
+ when "SQLite"
76
+ "DELETE FROM %s"
77
+ when "PostgreSQL"
78
+ "TRUNCATE TABLE %s RESTART IDENTITY CASCADE"
79
+ else
80
+ "TRUNCATE TABLE %s"
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,14 @@
1
+ require "rails/engine"
2
+
3
+ module FactoryBot
4
+ module Preload
5
+ class Engine < Rails::Engine
6
+ ActiveSupport.on_load(:after_initialize, yield: true) do
7
+ ::FactoryBot::SyntaxRunner.send(:include, Helpers)
8
+ end
9
+
10
+ initializer "factory_bot-preload" do
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module FactoryBot
2
+ def self.preload(&block)
3
+ Preload.preloaders << block
4
+ end
5
+
6
+ module Syntax
7
+ module Default
8
+ class DSL
9
+ def preload(&block)
10
+ ::FactoryBot.preload(&block)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,59 @@
1
+ module FactoryBot
2
+ module Preload
3
+ module Helpers
4
+ include ::FactoryBot::Syntax::Methods
5
+
6
+ def self.extended(base)
7
+ included(base)
8
+ end
9
+
10
+ def self.included(_base)
11
+ if defined?(Rails)
12
+ Dir[Rails.application.root.join("app/models/**/*.rb")].each do |file|
13
+ require_dependency file
14
+ end
15
+ end
16
+
17
+ ActiveRecord::Base.descendants.each do |model|
18
+ method_name = model.name.underscore.tr("/", "_").pluralize
19
+
20
+ define_method(method_name) do |name|
21
+ factory(name, model)
22
+ end
23
+ end
24
+ end
25
+
26
+ def factory(name, model = nil, &block)
27
+ if block_given?
28
+ factory_set(name, &block)
29
+ else
30
+ factory_get(name, model)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def factory_get(name, model)
37
+ factory = Preload.factories[model.name][name]
38
+
39
+ if factory.blank? && Preload.factories[model.name].key?(name)
40
+ factory = model.find(Preload.record_ids[model.name][name])
41
+ Preload.factories[model.name][name] = factory
42
+ end
43
+
44
+ raise "Couldn't find #{name.inspect} factory for #{model.name.inspect} model" unless factory
45
+
46
+ factory
47
+ end
48
+
49
+ def factory_set(name, &block)
50
+ record = instance_eval(&block)
51
+ Preload.factories[record.class.name] ||= {}
52
+ Preload.factories[record.class.name][name.to_sym] = record
53
+
54
+ Preload.record_ids[record.class.name] ||= {}
55
+ Preload.record_ids[record.class.name][name.to_sym] = record.id
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,21 @@
1
+ require "minitest"
2
+ require "factory_bot/syntax/methods"
3
+
4
+ module FactoryBot
5
+ module Preload
6
+ def self.minitest
7
+ FactoryBot::Preload.clean
8
+ FactoryBot::Preload.run
9
+ end
10
+
11
+ module MinitestSetup
12
+ def setup
13
+ FactoryBot::Preload.reload_factories
14
+ super
15
+ end
16
+ end
17
+
18
+ Minitest::Test.include Helpers
19
+ Minitest::Test.prepend MinitestSetup
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require "rspec/core"
2
+ require "factory_bot/syntax/methods"
3
+
4
+ RSpec.configure do |config|
5
+ config.include FactoryBot::Preload::Helpers
6
+
7
+ config.before(:suite) do
8
+ FactoryBot::Preload.clean
9
+ FactoryBot::Preload.run
10
+ end
11
+
12
+ config.before(:each) do
13
+ FactoryBot::Preload.reload_factories
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ module FactoryBot
2
+ module Preload
3
+ module Version
4
+ MAJOR = 0
5
+ MINOR = 1
6
+ PATCH = 0
7
+ STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,102 @@
1
+ require "spec_helper"
2
+
3
+ describe FactoryBot::Preload do
4
+ it "queues preloader block" do
5
+ block = proc {}
6
+ FactoryBot.preload(&block)
7
+ expect(FactoryBot::Preload.preloaders).to include(block)
8
+ end
9
+
10
+ it "should lazy load all factories, loading only when used" do
11
+ expect(FactoryBot::Preload.record_ids["User"][:john]).to eq(1)
12
+ expect(FactoryBot::Preload.factories["User"][:john]).to be_nil
13
+
14
+ user = users(:john)
15
+
16
+ expect(FactoryBot::Preload.factories["User"][:john]).to eq(user)
17
+ end
18
+
19
+ it "injects model methods" do
20
+ expect { users(:john) }.to_not raise_error
21
+ end
22
+
23
+ it "returns :john factory for User model" do
24
+ expect(users(:john)).to be_an(User)
25
+ end
26
+
27
+ it "returns :ruby factory for Skill model" do
28
+ expect(skills(:ruby)).to be_a(Skill)
29
+ end
30
+
31
+ it "returns :my factory for Preload model" do
32
+ expect(preloads(:my)).to be_a(Preload)
33
+ end
34
+
35
+ it "reuses existing factories" do
36
+ expect(skills(:ruby).user).to eq(users(:john))
37
+ end
38
+
39
+ it "raises error for missing factories" do
40
+ expect { users(:mary) }.to raise_error(%[Couldn't find :mary factory for "User" model])
41
+ end
42
+
43
+ it "raises error for missing clean type" do
44
+ FactoryBot::Preload.clean_with = :invalid
45
+ expect { FactoryBot::Preload.clean }.to raise_error(%[Couldn't find invalid clean type])
46
+ end
47
+
48
+ example "association uses preloaded record" do
49
+ expect(build(:skill).user).to eq(users(:john))
50
+ end
51
+
52
+ context "removes records" do
53
+ it "with deletion" do
54
+ expect(User.count).to eq(1)
55
+ FactoryBot::Preload.clean_with = :deletion
56
+ FactoryBot::Preload.clean
57
+ expect(User.count).to eq(0)
58
+ end
59
+
60
+ it "with truncation" do
61
+ expect(User.count).to eq(1)
62
+ FactoryBot::Preload.clean_with = :truncation
63
+ FactoryBot::Preload.clean
64
+ expect(User.count).to eq(0)
65
+ end
66
+ end
67
+
68
+ context "reloadable factories" do
69
+ before :all do
70
+ FactoryBot::Preload.clean
71
+ FactoryBot::Preload.run
72
+ end
73
+
74
+ before :each do
75
+ FactoryBot::Preload.reload_factories
76
+ end
77
+
78
+ it "freezes object" do
79
+ users(:john).destroy
80
+ expect(users(:john)).to be_frozen
81
+ end
82
+
83
+ it "updates invitation count" do
84
+ users(:john).increment(:invitations)
85
+ users(:john).save
86
+ expect(users(:john).invitations).to eq(1)
87
+ end
88
+
89
+ it "reloads factory" do
90
+ expect(users(:john).invitations).to eq(0)
91
+ expect(users(:john)).not_to be_frozen
92
+ end
93
+ end
94
+
95
+ it "includes factory_bot helpers" do
96
+ expect(self.class.included_modules).to include(FactoryBot::Syntax::Methods)
97
+ end
98
+
99
+ it "includes helpers into factory_bot" do
100
+ expect(FactoryBot::SyntaxRunner.included_modules).to include(FactoryBot::Preload::Helpers)
101
+ end
102
+ end
@@ -0,0 +1,28 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ ENV["BUNDLE_GEMFILE"] = File.dirname(__FILE__) + "/../Gemfile"
3
+ ENV["DATABASE_URL"] = "sqlite3::memory:"
4
+
5
+ require "bundler/setup"
6
+ require "rails/all"
7
+
8
+ module RSpec
9
+ class Application < ::Rails::Application
10
+ config.root = File.dirname(__FILE__) + "/support/app"
11
+ config.active_support.deprecation = :log
12
+ config.eager_load = false
13
+ end
14
+ end
15
+
16
+ RSpec::Application.initialize!
17
+ ActiveRecord::Migration.verbose = true
18
+ ActiveRecord::Base.establish_connection ENV["DATABASE_URL"]
19
+ load File.dirname(__FILE__) + "/support/app/db/schema.rb"
20
+
21
+ require "rspec/rails"
22
+
23
+ RSpec.configure do |config|
24
+ config.use_transactional_fixtures = true
25
+ end
26
+
27
+ require "factory_bot/preload"
28
+ require File.dirname(__FILE__) + "/support/factories"
@@ -0,0 +1,3 @@
1
+ class Category < ActiveRecord::Base
2
+ has_and_belongs_to_many :users
3
+ end
@@ -0,0 +1,2 @@
1
+ class Preload < ActiveRecord::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ class Skill < ActiveRecord::Base
2
+ belongs_to :user
3
+ end
@@ -0,0 +1,4 @@
1
+ class User < ActiveRecord::Base
2
+ has_many :skills
3
+ has_and_belongs_to_many :categories
4
+ end
@@ -0,0 +1,34 @@
1
+ ActiveRecord::Schema.define(version: 0) do
2
+ begin
3
+ drop_table :users
4
+ drop_table :skills
5
+ drop_table :preloads
6
+ drop_table :categories
7
+ drop_table :categories_users
8
+ rescue Exception => e
9
+ end
10
+
11
+ create_table :users do |t|
12
+ t.string :name, null: false
13
+ t.string :email, null: false
14
+ t.integer :invitations, null: false, default: 0
15
+ end
16
+
17
+ add_index :users, :email, unique: true
18
+
19
+ create_table :preloads do |t|
20
+ t.string :name
21
+ end
22
+
23
+ create_table :skills do |t|
24
+ t.references :user
25
+ end
26
+
27
+ create_table :categories do |t|
28
+ end
29
+
30
+ create_table :categories_users, id: false do |t|
31
+ t.references :category
32
+ t.references :user
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ FactoryBot.define do
2
+ sequence(:email) {|n| "john#{n}@doe.com" }
3
+
4
+ factory :user do
5
+ name { "John Doe" }
6
+ email { generate(:email) }
7
+ end
8
+
9
+ factory :skill do
10
+ user { users(:john) }
11
+ end
12
+
13
+ factory :preload do
14
+ name { "My Preload" }
15
+ end
16
+
17
+ preload do
18
+ factory(:john) { create(:user) }
19
+ factory(:ruby) { create(:skill, user: users(:john)) }
20
+ factory(:my) { create(:preload) }
21
+ end
22
+ end
@@ -0,0 +1,97 @@
1
+ require "test_helper"
2
+
3
+ class PreloadTest < ActiveSupport::TestCase
4
+ setup do
5
+ FactoryBot::Preload.clean_with = :truncation
6
+ end
7
+
8
+ test "queues preloader block" do
9
+ block = proc { }
10
+ FactoryBot.preload(&block)
11
+ assert_includes FactoryBot::Preload.preloaders, block
12
+ end
13
+
14
+ test "lazy load all factories, loading only when used" do
15
+ assert_equal 1, FactoryBot::Preload.record_ids["User"][:john]
16
+ assert_nil FactoryBot::Preload.factories["User"][:john]
17
+
18
+ user = users(:john)
19
+
20
+ assert_equal user, FactoryBot::Preload.factories["User"][:john]
21
+ end
22
+
23
+ test "injects model methods" do
24
+ # this shouldn't raise an exception
25
+ users(:john)
26
+ end
27
+
28
+ test "returns :john factory for User model" do
29
+ assert_instance_of User, users(:john)
30
+ end
31
+
32
+ test "returns :ruby factory for Skill model" do
33
+ assert_instance_of Skill, skills(:ruby)
34
+ end
35
+
36
+ test "returns :my factory for Preload model" do
37
+ assert_instance_of Preload, preloads(:my)
38
+ end
39
+
40
+ test "reuses existing factories" do
41
+ assert_equal users(:john), skills(:ruby).user
42
+ end
43
+
44
+ test "raises error for missing factories" do
45
+ assert_raises(%[Couldn't find :mary factory for "User" model]) do
46
+ users(:mary)
47
+ end
48
+ end
49
+
50
+ test "raises error for missing clean type" do
51
+ FactoryBot::Preload.clean_with = :invalid
52
+ assert_raises(%[Couldn't find invalid clean type]) { FactoryBot::Preload.clean }
53
+ end
54
+
55
+ test "association uses preloaded record" do
56
+ assert_equal users(:john), build(:skill).user
57
+ end
58
+
59
+ test "removes records with :deletion" do
60
+ assert_equal 1, User.count
61
+ FactoryBot::Preload.clean_with = :deletion
62
+ FactoryBot::Preload.clean
63
+ assert_equal 0, User.count
64
+ end
65
+
66
+ test "removes records with :truncation" do
67
+ assert_equal 1, User.count
68
+ FactoryBot::Preload.clean_with = :truncation
69
+ FactoryBot::Preload.clean
70
+ assert_equal 0, User.count
71
+ end
72
+
73
+ test "includes factory_bot helpers" do
74
+ assert_includes self.class.included_modules, FactoryBot::Syntax::Methods
75
+ end
76
+
77
+ test "includes helpers into factory_bot" do
78
+ assert_includes FactoryBot::SyntaxRunner.included_modules, FactoryBot::Preload::Helpers
79
+ end
80
+
81
+ test "freezes object" do
82
+ users(:john).destroy
83
+ assert users(:john).frozen?
84
+ end
85
+
86
+ test "updates invitation count" do
87
+ users(:john).increment(:invitations)
88
+ users(:john).save
89
+
90
+ assert_equal 1, users(:john).invitations
91
+ end
92
+
93
+ test "reloads factory" do
94
+ assert_equal 0, users(:john).invitations
95
+ refute users(:john).frozen?
96
+ end
97
+ end
@@ -0,0 +1,31 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ ENV["BUNDLE_GEMFILE"] = File.dirname(__FILE__) + "/../Gemfile"
3
+ ENV["DATABASE_URL"] = "sqlite3::memory:"
4
+
5
+ require "bundler/setup"
6
+ require "rails/all"
7
+ require "minitest/utils"
8
+
9
+ class SampleApplication < ::Rails::Application
10
+ config.root = __dir__ + "/../spec/support/app"
11
+ config.active_support.deprecation = :log
12
+ config.eager_load = false
13
+ end
14
+
15
+ SampleApplication.initialize!
16
+ require "rails/test_help"
17
+
18
+ ActiveRecord::Migration.verbose = true
19
+ ActiveRecord::Base.establish_connection ENV["DATABASE_URL"]
20
+ load __dir__ + "/../spec/support/app/db/schema.rb"
21
+
22
+ module ActiveSupport
23
+ class TestCase
24
+ self.use_instantiated_fixtures = true
25
+ end
26
+ end
27
+
28
+ require "factory_bot/preload"
29
+ require __dir__ + "/../spec/support/factories"
30
+
31
+ FactoryBot::Preload.minitest
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: factory_bot-preload
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nando Vieira
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: factory_bot
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-utils
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-meta
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sqlite3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.3.6
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.3.6
139
+ description: Preload factories (Factory Bot) just like fixtures. It will be easy and,
140
+ probably, faster!
141
+ email:
142
+ - fnando.vieira@gmail.com
143
+ executables: []
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - Gemfile
150
+ - README.md
151
+ - Rakefile
152
+ - factory_bot-preload.gemspec
153
+ - lib/factory_bot-preload.rb
154
+ - lib/factory_bot/preload.rb
155
+ - lib/factory_bot/preload/engine.rb
156
+ - lib/factory_bot/preload/extension.rb
157
+ - lib/factory_bot/preload/helpers.rb
158
+ - lib/factory_bot/preload/minitest.rb
159
+ - lib/factory_bot/preload/rspec.rb
160
+ - lib/factory_bot/preload/version.rb
161
+ - spec/factory_bot/preload_spec.rb
162
+ - spec/spec_helper.rb
163
+ - spec/support/app/app/models/category.rb
164
+ - spec/support/app/app/models/preload.rb
165
+ - spec/support/app/app/models/skill.rb
166
+ - spec/support/app/app/models/user.rb
167
+ - spec/support/app/db/schema.rb
168
+ - spec/support/factories.rb
169
+ - test/factory_bot/preload_test.rb
170
+ - test/test_helper.rb
171
+ homepage: http://rubygems.org/gems/factory_bot-preload
172
+ licenses: []
173
+ metadata: {}
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ requirements: []
189
+ rubygems_version: 3.0.1
190
+ signing_key:
191
+ specification_version: 4
192
+ summary: Preload factories (Factory Bot) just like fixtures. It will be easy and,
193
+ probably, faster!
194
+ test_files:
195
+ - spec/factory_bot/preload_spec.rb
196
+ - spec/spec_helper.rb
197
+ - spec/support/app/app/models/category.rb
198
+ - spec/support/app/app/models/preload.rb
199
+ - spec/support/app/app/models/skill.rb
200
+ - spec/support/app/app/models/user.rb
201
+ - spec/support/app/db/schema.rb
202
+ - spec/support/factories.rb
203
+ - test/factory_bot/preload_test.rb
204
+ - test/test_helper.rb