From 6091092f7f24a8be7c282a12dc76c13b1d3ec023 Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Mon, 22 May 2017 14:20:14 -0500 Subject: [PATCH 1/8] Install dependency on factory_girl_rails --- Gemfile | 1 + Gemfile.lock | 6 ++++++ config/application.rb | 1 - 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 4d3099ae..59b27972 100644 --- a/Gemfile +++ b/Gemfile @@ -16,6 +16,7 @@ gem 'jbuilder', '~> 2.5' group :development, :test do gem 'rspec-rails', '~> 3.6.0' + gem 'factory_girl_rails', '~> 4.8.0' gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'capybara', '~> 2.13.0' gem 'selenium-webdriver' diff --git a/Gemfile.lock b/Gemfile.lock index 11dba813..8343ee66 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -79,6 +79,11 @@ GEM diff-lcs (1.3) erubi (1.6.0) execjs (2.7.0) + factory_girl (4.8.0) + activesupport (>= 3.0.0) + factory_girl_rails (4.8.0) + factory_girl (~> 4.8.0) + railties (>= 3.0.0) ffi (1.9.18) globalid (0.4.0) activesupport (>= 4.2.0) @@ -230,6 +235,7 @@ DEPENDENCIES capybara (~> 2.13.0) coffee-rails (~> 4.2) devise + factory_girl_rails (~> 4.8.0) gravatar_image_tag jbuilder (~> 2.5) jquery-rails diff --git a/config/application.rb b/config/application.rb index c0eaf707..12c65af0 100644 --- a/config/application.rb +++ b/config/application.rb @@ -17,7 +17,6 @@ class Application < Rails::Application config.generators do |g| g.test_framework :rspec, - fixtures: false, view_specs: false, helper_specs: false, routing_specs: false, From 8bda8b822678ec67f07a3df58ada329e8b4e6de7 Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Tue, 23 May 2017 21:30:41 -0500 Subject: [PATCH 2/8] Add initial factory examples for chapter 4 --- spec/factories/notes.rb | 7 +++++++ spec/factories/projects.rb | 8 ++++++++ spec/factories/users.rb | 8 ++++++++ spec/models/user_spec.rb | 34 +++++++++++++++------------------- 4 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 spec/factories/notes.rb create mode 100644 spec/factories/projects.rb create mode 100644 spec/factories/users.rb diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb new file mode 100644 index 00000000..8c5061e6 --- /dev/null +++ b/spec/factories/notes.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :note do + message "My important note." + association :project + association :user + end +end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb new file mode 100644 index 00000000..a9dec11c --- /dev/null +++ b/spec/factories/projects.rb @@ -0,0 +1,8 @@ +FactoryGirl.define do + factory :project do + sequence(:name) { |n| "Project #{n}" } + description "A test project." + due_on 1.week.from_now + association :owner + end +end diff --git a/spec/factories/users.rb b/spec/factories/users.rb new file mode 100644 index 00000000..b3eabf17 --- /dev/null +++ b/spec/factories/users.rb @@ -0,0 +1,8 @@ +FactoryGirl.define do + factory :user, aliases: [:owner] do + first_name "Aaron" + last_name "Sumner" + sequence(:email) { |n| "tester#{n}@example.com" } + password "dottle-nouveau-pavilion-tights-furze" + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 000470b7..71393a5e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' RSpec.describe User, type: :model do + it "has a valid factory" do + expect(FactoryGirl.build(:user)).to be_valid + end + it "is valid with a first name, last name and email, and password" do user = User.new( first_name: "Aaron", @@ -12,40 +16,32 @@ end it "is invalid without a first name" do - user = User.new(first_name: nil) + user = FactoryGirl.build(:user, first_name: nil) user.valid? expect(user.errors[:first_name]).to include("can't be blank") end it "is invalid without a last name" do - user = User.new(last_name: nil) + user = FactoryGirl.build(:user, last_name: nil) user.valid? expect(user.errors[:last_name]).to include("can't be blank") end + it "is invalid without an email address" do + user = FactoryGirl.build(:user, email: nil) + user.valid? + expect(user.errors[:email]).to include("can't be blank") + end + it "is invalid with a duplicate email address" do - User.create( - first_name: "Joe", - last_name: "Tester", - email: "tester@example.com", - password: "dottle-nouveau-pavilion-tights-furze", - ) - user = User.new( - first_name: "Jane", - last_name: "Tester", - email: "tester@example.com", - password: "dottle-nouveau-pavilion-tights-furze", - ) + FactoryGirl.create(:user, email: "aaron@example.com") + user = FactoryGirl.build(:user, email: "aaron@example.com") user.valid? expect(user.errors[:email]).to include("has already been taken") end it "returns a user's full name as a string" do - user = User.new( - first_name: "John", - last_name: "Doe", - email: "johndoe@example.com", - ) + user = FactoryGirl.build(:user, first_name: "John", last_name: "Doe") expect(user.name).to eq "John Doe" end end From 48b7a53d28156003c65a29a6ad38df2745020b4a Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Tue, 23 May 2017 21:34:55 -0500 Subject: [PATCH 3/8] Add factory inheritance example for chapter 4 --- spec/factories/projects.rb | 21 +++++++++++++++++++++ spec/models/project_spec.rb | 17 +++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index a9dec11c..29b2b9bb 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -5,4 +5,25 @@ due_on 1.week.from_now association :owner end + + factory :project_due_yesterday, class: Project do + sequence(:name) { |n| "Test Project #{n}" } + description "Sample project for testing purposes" + due_on 1.day.ago + association :owner + end + + factory :project_due_today, class: Project do + sequence(:name) { |n| "Test Project #{n}" } + description "Sample project for testing purposes" + due_on Date.today + association :owner + end + + factory :project_due_tomorrow, class: Project do + sequence(:name) { |n| "Test Project #{n}" } + description "Sample project for testing purposes" + due_on 1.day.from_now + association :owner + end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 13b610ee..f5a5fe57 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -46,4 +46,21 @@ expect(other_project).to be_valid end + + describe "late status" do + it "is late when the due date is past today" do + project = FactoryGirl.create(:project_due_yesterday) + expect(project).to be_late + end + + it "is on time when the due date is today" do + project = FactoryGirl.create(:project_due_today) + expect(project).to_not be_late + end + + it "is on time when the due date is in the future" do + project = FactoryGirl.create(:project_due_tomorrow) + expect(project).to_not be_late + end + end end From c2e9f9ff9d3d9a9c86b443ee6a333fa82fef101f Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Tue, 23 May 2017 21:43:51 -0500 Subject: [PATCH 4/8] Add factory inheritance examples for chapter 4 --- spec/factories/projects.rb | 50 ++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 29b2b9bb..33e89e76 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -4,26 +4,40 @@ description "A test project." due_on 1.week.from_now association :owner - end - factory :project_due_yesterday, class: Project do - sequence(:name) { |n| "Test Project #{n}" } - description "Sample project for testing purposes" - due_on 1.day.ago - association :owner - end + factory :project_due_yesterday do + due_on 1.day.ago + end - factory :project_due_today, class: Project do - sequence(:name) { |n| "Test Project #{n}" } - description "Sample project for testing purposes" - due_on Date.today - association :owner - end + factory :project_due_today do + due_on Date.today + end - factory :project_due_tomorrow, class: Project do - sequence(:name) { |n| "Test Project #{n}" } - description "Sample project for testing purposes" - due_on 1.day.from_now - association :owner + factory :project_due_tomorrow do + due_on 1.day.from_now + end end + + # Non-DRY versions ... + # + # factory :project_due_yesterday, class: Project do + # sequence(:name) { |n| "Test Project #{n}" } + # description "Sample project for testing purposes" + # due_on 1.day.ago + # association :owner + # end + # + # factory :project_due_today, class: Project do + # sequence(:name) { |n| "Test Project #{n}" } + # description "Sample project for testing purposes" + # due_on Date.today + # association :owner + # end + # + # factory :project_due_tomorrow, class: Project do + # sequence(:name) { |n| "Test Project #{n}" } + # description "Sample project for testing purposes" + # due_on 1.day.from_now + # association :owner + # end end From 034bfb93c46024327d5ffb4623a0ee278c6f629a Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Tue, 23 May 2017 21:46:15 -0500 Subject: [PATCH 5/8] Add factory trait examples for chapter 4 --- spec/factories/projects.rb | 20 +++++++++++++++++--- spec/models/project_spec.rb | 6 +++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 33e89e76..a6bbc83c 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -5,17 +5,31 @@ due_on 1.week.from_now association :owner - factory :project_due_yesterday do + trait :due_yesterday do due_on 1.day.ago end - factory :project_due_today do + trait :due_today do due_on Date.today end - factory :project_due_tomorrow do + trait :due_tomorrow do due_on 1.day.from_now end + + # Factory inheritance examples ... + # + # factory :project_due_yesterday do + # due_on 1.day.ago + # end + # + # factory :project_due_today do + # due_on Date.today + # end + # + # factory :project_due_tomorrow do + # due_on 1.day.from_now + # end end # Non-DRY versions ... diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index f5a5fe57..d69fda3f 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -49,17 +49,17 @@ describe "late status" do it "is late when the due date is past today" do - project = FactoryGirl.create(:project_due_yesterday) + project = FactoryGirl.create(:project, :due_yesterday) expect(project).to be_late end it "is on time when the due date is today" do - project = FactoryGirl.create(:project_due_today) + project = FactoryGirl.create(:project, :due_today) expect(project).to_not be_late end it "is on time when the due date is in the future" do - project = FactoryGirl.create(:project_due_tomorrow) + project = FactoryGirl.create(:project, :due_tomorrow) expect(project).to_not be_late end end From 1bc38f6ad6e8e438c8bc6a5884d2452fee9f0d64 Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Tue, 23 May 2017 21:49:11 -0500 Subject: [PATCH 6/8] Add factory callback example for chapter 4 --- spec/factories/notes.rb | 2 +- spec/factories/projects.rb | 4 ++++ spec/models/project_spec.rb | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb index 8c5061e6..aac16078 100644 --- a/spec/factories/notes.rb +++ b/spec/factories/notes.rb @@ -2,6 +2,6 @@ factory :note do message "My important note." association :project - association :user + user { project.owner } end end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index a6bbc83c..f202a6b0 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -5,6 +5,10 @@ due_on 1.week.from_now association :owner + trait :with_notes do + after(:create) { |project| create_list(:note, 5, project: project) } + end + trait :due_yesterday do due_on 1.day.ago end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index d69fda3f..964935b6 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -63,4 +63,9 @@ expect(project).to_not be_late end end + + it "can have many notes" do + project = FactoryGirl.create(:project, :with_notes) + expect(project.notes.length).to eq 5 + end end From 52a606f77a32f378bcadb7b261dabfcde0abe30b Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Wed, 9 Aug 2017 21:26:01 -0500 Subject: [PATCH 7/8] Include time zone in projects factory We run into issues with date comparisons when using the projects factory, due to time zones. Use Date.current.in_time_zone to make sure an appropriate timestamp gets created. --- spec/factories/projects.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index f202a6b0..08742bbe 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -14,7 +14,7 @@ end trait :due_today do - due_on Date.today + due_on Date.current.in_time_zone end trait :due_tomorrow do @@ -28,7 +28,7 @@ # end # # factory :project_due_today do - # due_on Date.today + # due_on Date.current.in_time_zone # end # # factory :project_due_tomorrow do From 7940227857f441265199b80755a235918df0cf03 Mon Sep 17 00:00:00 2001 From: Aaron Sumner Date: Mon, 4 Jun 2018 20:22:28 -0700 Subject: [PATCH 8/8] Replace FactoryGirl with FactoryBot --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- spec/factories/notes.rb | 2 +- spec/factories/projects.rb | 2 +- spec/factories/users.rb | 2 +- spec/models/project_spec.rb | 8 ++++---- spec/models/user_spec.rb | 14 +++++++------- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Gemfile b/Gemfile index f1043c23..68460d1a 100644 --- a/Gemfile +++ b/Gemfile @@ -16,7 +16,7 @@ gem 'jbuilder', '~> 2.5' group :development, :test do gem 'rspec-rails', '~> 3.6.0' - gem 'factory_girl_rails', '~> 4.8.0' + gem 'factory_bot_rails', '~> 4.10.0' gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'capybara', '~> 2.13.0' gem 'selenium-webdriver' diff --git a/Gemfile.lock b/Gemfile.lock index 12cd42de..f3f36228 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -79,10 +79,10 @@ GEM diff-lcs (1.3) erubi (1.6.0) execjs (2.7.0) - factory_girl (4.8.0) + factory_bot (4.10.0) activesupport (>= 3.0.0) - factory_girl_rails (4.8.0) - factory_girl (~> 4.8.0) + factory_bot_rails (4.10.0) + factory_bot (~> 4.10.0) railties (>= 3.0.0) faker (1.7.3) i18n (~> 0.5) @@ -237,7 +237,7 @@ DEPENDENCIES capybara (~> 2.13.0) coffee-rails (~> 4.2) devise - factory_girl_rails (~> 4.8.0) + factory_bot_rails (~> 4.10.0) faker geocoder jbuilder (~> 2.5) diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb index aac16078..06d32ae4 100644 --- a/spec/factories/notes.rb +++ b/spec/factories/notes.rb @@ -1,4 +1,4 @@ -FactoryGirl.define do +FactoryBot.define do factory :note do message "My important note." association :project diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 08742bbe..aa7ce3c6 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -1,4 +1,4 @@ -FactoryGirl.define do +FactoryBot.define do factory :project do sequence(:name) { |n| "Project #{n}" } description "A test project." diff --git a/spec/factories/users.rb b/spec/factories/users.rb index b3eabf17..ff172d27 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -1,4 +1,4 @@ -FactoryGirl.define do +FactoryBot.define do factory :user, aliases: [:owner] do first_name "Aaron" last_name "Sumner" diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 964935b6..8adf092f 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -49,23 +49,23 @@ describe "late status" do it "is late when the due date is past today" do - project = FactoryGirl.create(:project, :due_yesterday) + project = FactoryBot.create(:project, :due_yesterday) expect(project).to be_late end it "is on time when the due date is today" do - project = FactoryGirl.create(:project, :due_today) + project = FactoryBot.create(:project, :due_today) expect(project).to_not be_late end it "is on time when the due date is in the future" do - project = FactoryGirl.create(:project, :due_tomorrow) + project = FactoryBot.create(:project, :due_tomorrow) expect(project).to_not be_late end end it "can have many notes" do - project = FactoryGirl.create(:project, :with_notes) + project = FactoryBot.create(:project, :with_notes) expect(project.notes.length).to eq 5 end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 71393a5e..4ce9e26e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2,7 +2,7 @@ RSpec.describe User, type: :model do it "has a valid factory" do - expect(FactoryGirl.build(:user)).to be_valid + expect(FactoryBot.build(:user)).to be_valid end it "is valid with a first name, last name and email, and password" do @@ -16,32 +16,32 @@ end it "is invalid without a first name" do - user = FactoryGirl.build(:user, first_name: nil) + user = FactoryBot.build(:user, first_name: nil) user.valid? expect(user.errors[:first_name]).to include("can't be blank") end it "is invalid without a last name" do - user = FactoryGirl.build(:user, last_name: nil) + user = FactoryBot.build(:user, last_name: nil) user.valid? expect(user.errors[:last_name]).to include("can't be blank") end it "is invalid without an email address" do - user = FactoryGirl.build(:user, email: nil) + user = FactoryBot.build(:user, email: nil) user.valid? expect(user.errors[:email]).to include("can't be blank") end it "is invalid with a duplicate email address" do - FactoryGirl.create(:user, email: "aaron@example.com") - user = FactoryGirl.build(:user, email: "aaron@example.com") + FactoryBot.create(:user, email: "aaron@example.com") + user = FactoryBot.build(:user, email: "aaron@example.com") user.valid? expect(user.errors[:email]).to include("has already been taken") end it "returns a user's full name as a string" do - user = FactoryGirl.build(:user, first_name: "John", last_name: "Doe") + user = FactoryBot.build(:user, first_name: "John", last_name: "Doe") expect(user.name).to eq "John Doe" end end