Commit 4af9d592 authored by Rémy Coutable's avatar Rémy Coutable

Replace factory_girl_rails with factory_bot_rails

I've followed the [upgrade guide](https://github.com/thoughtbot/factory_bot/blob/4-9-0-stable/UPGRADE_FROM_FACTORY_GIRL.md) and ran these two commands:

```
grep -e FactoryGirl **/*.rake **/*.rb -s -l | xargs sed -i "" "s|FactoryGirl|FactoryBot|"
grep -e factory_girl **/*.rake **/*.rb -s -l | xargs sed -i "" "s|factory_girl|factory_bot|"
```
Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent f5114187
......@@ -311,7 +311,7 @@ group :development, :test do
gem 'fuubar', '~> 2.2.0'
gem 'database_cleaner', '~> 1.5.0'
gem 'factory_girl_rails', '~> 4.7.0'
gem 'factory_bot_rails', '~> 4.8.2'
gem 'rspec-rails', '~> 3.6.0'
gem 'rspec-retry', '~> 0.4.5'
gem 'spinach-rails', '~> 0.2.1'
......
......@@ -195,10 +195,10 @@ GEM
excon (0.57.1)
execjs (2.6.0)
expression_parser (0.9.0)
factory_girl (4.7.0)
factory_bot (4.8.2)
activesupport (>= 3.0.0)
factory_girl_rails (4.7.0)
factory_girl (~> 4.7.0)
factory_bot_rails (4.8.2)
factory_bot (~> 4.8.2)
railties (>= 3.0.0)
faraday (0.12.2)
multipart-post (>= 1.2, < 3)
......@@ -1017,7 +1017,7 @@ DEPENDENCIES
dropzonejs-rails (~> 0.7.1)
email_reply_trimmer (~> 0.1)
email_spec (~> 1.6.0)
factory_girl_rails (~> 4.7.0)
factory_bot_rails (~> 4.8.2)
faraday (~> 0.12)
ffaker (~> 2.4)
flay (~> 2.8.0)
......
......@@ -11,7 +11,7 @@ class Projects::NotesController < Projects::ApplicationController
# Controller actions are returned from AbstractController::Base and methods of parent classes are
# excluded in order to return only specific controller related methods.
# That is ok for the app (no :create method in ancestors)
# but fails for tests because there is a :create method on FactoryGirl (one of the ancestors)
# but fails for tests because there is a :create method on FactoryBot (one of the ancestors)
#
# see https://github.com/rails/rails/blob/v4.2.7/actionpack/lib/abstract_controller/base.rb#L78
#
......
......@@ -159,7 +159,7 @@ module Gitlab
config.middleware.insert_after ActionDispatch::Flash, 'Gitlab::Middleware::ReadOnly'
config.generators do |g|
g.factory_girl false
g.factory_bot false
end
config.after_initialize do
......
......@@ -140,8 +140,8 @@ class Gitlab::Seeder::CycleAnalytics
issue.update(milestone: @project.milestones.sample)
else
label_name = "#{FFaker::Product.brand}-#{FFaker::Product.brand}-#{rand(1000)}"
list_label = FactoryGirl.create(:label, title: label_name, project: issue.project)
FactoryGirl.create(:list, board: FactoryGirl.create(:board, project: issue.project), label: list_label)
list_label = FactoryBot.create(:label, title: label_name, project: issue.project)
FactoryBot.create(:list, board: FactoryBot.create(:board, project: issue.project), label: list_label)
issue.update(labels: [list_label])
end
......
......@@ -8,7 +8,7 @@ might encounter or should avoid during development of GitLab CE and EE.
Consider the following factory:
```ruby
FactoryGirl.define do
FactoryBot.define do
factory :label do
sequence(:title) { |n| "label#{n}" }
end
......@@ -53,7 +53,7 @@ When run, this spec doesn't do what we might expect:
(compared using ==)
```
That's because FactoryGirl sequences are not reseted for each example.
That's because FactoryBot sequences are not reseted for each example.
Please remember that sequence-generated values exist only to avoid having to
explicitly set attributes that have a uniqueness constraint when using a factory.
......
......@@ -8,8 +8,8 @@ and effective _as well as_ fast.
Here are some things to keep in mind regarding test performance:
- `double` and `spy` are faster than `FactoryGirl.build(...)`
- `FactoryGirl.build(...)` and `.build_stubbed` are faster than `.create`.
- `double` and `spy` are faster than `FactoryBot.build(...)`
- `FactoryBot.build(...)` and `.build_stubbed` are faster than `.create`.
- Don't `create` an object when `build`, `build_stubbed`, `attributes_for`,
`spy`, or `double` will do. Database persistence is slow!
- Don't mark a feature as requiring JavaScript (through `@javascript` in
......@@ -254,13 +254,13 @@ end
### Factories
GitLab uses [factory_girl] as a test fixture replacement.
GitLab uses [factory_bot] as a test fixture replacement.
- Factory definitions live in `spec/factories/`, named using the pluralization
of their corresponding model (`User` factories are defined in `users.rb`).
- There should be only one top-level factory definition per file.
- FactoryGirl methods are mixed in to all RSpec groups. This means you can (and
should) call `create(...)` instead of `FactoryGirl.create(...)`.
- FactoryBot methods are mixed in to all RSpec groups. This means you can (and
should) call `create(...)` instead of `FactoryBot.create(...)`.
- Make use of [traits] to clean up definitions and usages.
- When defining a factory, don't define attributes that are not required for the
resulting record to pass validation.
......@@ -269,8 +269,8 @@ GitLab uses [factory_girl] as a test fixture replacement.
- Factories don't have to be limited to `ActiveRecord` objects.
[See example](https://gitlab.com/gitlab-org/gitlab-ce/commit/0b8cefd3b2385a21cfed779bd659978c0402766d).
[factory_girl]: https://github.com/thoughtbot/factory_girl
[traits]: http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Traits
[factory_bot]: https://github.com/thoughtbot/factory_bot
[traits]: http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Traits
### Fixtures
......
......@@ -33,7 +33,7 @@ changes should be tested.
## [Testing best practices](best_practices.md)
Everything you should know about how to write good tests: RSpec, FactoryGirl,
Everything you should know about how to write good tests: RSpec, FactoryBot,
system tests, parameterized tests etc.
---
......
......@@ -27,7 +27,7 @@ Spinach.hooks.before_run do
# web editor and merge
TestEnv.disable_pre_receive
include FactoryGirl::Syntax::Methods
include FactoryBot::Syntax::Methods
include GitlabRoutingHelper
end
......
FactoryGirl.define do
FactoryBot.define do
factory :abuse_report do
reporter factory: :user
user
......
# Read about factories at https://github.com/thoughtbot/factory_girl
# Read about factories at https://github.com/thoughtbot/factory_bot
FactoryGirl.define do
FactoryBot.define do
factory :appearance do
title "MepMep"
description "This is my Community Edition instance"
......
FactoryGirl.define do
FactoryBot.define do
factory :application_setting do
end
end
FactoryGirl.define do
FactoryBot.define do
factory :award_emoji do
name "thumbsup"
user
......
FactoryGirl.define do
FactoryBot.define do
factory :board do
project
......
FactoryGirl.define do
FactoryBot.define do
factory :broadcast_message do
message "MyText"
starts_at 1.day.ago
......
FactoryGirl.define do
FactoryBot.define do
factory :chat_name, class: ChatName do
user factory: :user
service factory: :service
......
FactoryGirl.define do
FactoryBot.define do
factory :chat_team, class: ChatTeam do
sequence(:team_id) { |n| "abcdefghijklm#{n}" }
namespace factory: :group
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_build_trace_section_name, class: Ci::BuildTraceSectionName do
sequence(:name) { |n| "section_#{n}" }
project factory: :project
......
include ActionDispatch::TestProcess
FactoryGirl.define do
FactoryBot.define do
factory :ci_build, class: Ci::Build do
name 'test'
stage 'test'
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_group_variable, class: Ci::GroupVariable do
sequence(:key) { |n| "VARIABLE_#{n}" }
value 'VARIABLE_VALUE'
......
include ActionDispatch::TestProcess
FactoryGirl.define do
FactoryBot.define do
factory :ci_job_artifact, class: Ci::JobArtifact do
job factory: :ci_build
file_type :archive
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_pipeline_schedule, class: Ci::PipelineSchedule do
cron '0 1 * * *'
cron_timezone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_pipeline_schedule_variable, class: Ci::PipelineScheduleVariable do
sequence(:key) { |n| "VARIABLE_#{n}" }
value 'VARIABLE_VALUE'
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_pipeline_variable, class: Ci::PipelineVariable do
sequence(:key) { |n| "VARIABLE_#{n}" }
value 'VARIABLE_VALUE'
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_empty_pipeline, class: Ci::Pipeline do
source :push
ref 'master'
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_runner_project, class: Ci::RunnerProject do
runner factory: :ci_runner
project
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_runner, class: Ci::Runner do
sequence(:description) { |n| "My runner#{n}" }
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_stage, class: Ci::LegacyStage do
skip_create
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_trigger_request, class: Ci::TriggerRequest do
trigger factory: :ci_trigger
end
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_trigger_without_token, class: Ci::Trigger do
owner
......
FactoryGirl.define do
FactoryBot.define do
factory :ci_variable, class: Ci::Variable do
sequence(:key) { |n| "VARIABLE_#{n}" }
value 'VARIABLE_VALUE'
......
FactoryGirl.define do
FactoryBot.define do
factory :cluster_applications_helm, class: Clusters::Applications::Helm do
cluster factory: %i(cluster provided_by_gcp)
......
FactoryGirl.define do
FactoryBot.define do
factory :cluster_applications_ingress, class: Clusters::Applications::Ingress do
cluster factory: %i(cluster provided_by_gcp)
......
FactoryGirl.define do
FactoryBot.define do
factory :cluster, class: Clusters::Cluster do
user
name 'test-cluster'
......
FactoryGirl.define do
FactoryBot.define do
factory :cluster_platform_kubernetes, class: Clusters::Platforms::Kubernetes do
cluster
namespace nil
......
FactoryGirl.define do
FactoryBot.define do
factory :cluster_provider_gcp, class: Clusters::Providers::Gcp do
cluster
gcp_project_id 'test-gcp-project'
......
FactoryGirl.define do
FactoryBot.define do
factory :commit_status, class: CommitStatus do
name 'default'
stage 'test'
......
require_relative '../support/repo_helpers'
FactoryGirl.define do
FactoryBot.define do
factory :commit do
transient do
author nil
......
FactoryGirl.define do
FactoryBot.define do
factory :container_repository do
name 'test_container_image'
project
......
FactoryGirl.define do
FactoryBot.define do
factory :conversational_development_index_metric, class: ConversationalDevelopmentIndex::Metric do
leader_issues 9.256
instance_issues 1.234
......
FactoryGirl.define do
FactoryBot.define do
factory :deploy_keys_project do
deploy_key
project
......
FactoryGirl.define do
FactoryBot.define do
factory :deployment, class: Deployment do
sha '97de212e80737a608d939f648d959671fb0a0142'
ref 'master'
......
FactoryGirl.define do
FactoryBot.define do
factory :email do
user
email { generate(:email_alias) }
......
FactoryGirl.define do
FactoryBot.define do
factory :environment, class: Environment do
sequence(:name) { |n| "environment#{n}" }
......
FactoryGirl.define do
FactoryBot.define do
factory :event do
project
author factory: :user
......
FactoryGirl.define do
FactoryBot.define do
factory :file_uploader do
skip_create
......
FactoryGirl.define do
FactoryBot.define do
factory :fork_network_member do
association :project
association :fork_network
......
FactoryGirl.define do
FactoryBot.define do
factory :fork_network do
association :root_project, factory: :project
end
......
FactoryGirl.define do
FactoryBot.define do
factory :forked_project_link do
association :forked_to_project, factory: [:project, :repository]
association :forked_from_project, factory: [:project, :repository]
......
FactoryGirl.define do
FactoryBot.define do
sequence(:gitaly_commit_id) { Digest::SHA1.hexdigest(Time.now.to_f.to_s) }
factory :gitaly_commit, class: Gitaly::GitCommit do
......
FactoryGirl.define do
FactoryBot.define do
factory :gitaly_commit_author, class: Gitaly::CommitAuthor do
skip_create
......
require_relative '../support/gpg_helpers'
FactoryGirl.define do
FactoryBot.define do
factory :gpg_key_subkey do
gpg_key
......
require_relative '../support/gpg_helpers'
FactoryGirl.define do
FactoryBot.define do
factory :gpg_key do
key GpgHelpers::User1.public_key
user
......
require_relative '../support/gpg_helpers'
FactoryGirl.define do
FactoryBot.define do
factory :gpg_signature do
commit_sha { Digest::SHA1.hexdigest(SecureRandom.hex) }
project
......
FactoryGirl.define do
FactoryBot.define do
factory :group_custom_attribute do
group
sequence(:key) { |n| "key#{n}" }
......
FactoryGirl.define do
FactoryBot.define do
factory :group_member do
access_level { GroupMember::OWNER }
group
......
FactoryGirl.define do
FactoryBot.define do
factory :group, class: Group, parent: :namespace do
sequence(:name) { |n| "group#{n}" }
path { name.downcase.gsub(/\s/, '_') }
......
FactoryGirl.define do
FactoryBot.define do
factory :identity do
provider 'ldapmain'
extern_uid 'my-ldap-id'
......
FactoryGirl.define do
FactoryBot.define do
factory :instance_configuration do
skip_create
end
......
FactoryGirl.define do
FactoryBot.define do
factory :issue do
title { generate(:title) }
author
......
require_relative '../support/helpers/key_generator_helper'
FactoryGirl.define do
FactoryBot.define do
factory :key do
title
key { Spec::Support::Helpers::KeyGeneratorHelper.new(1024).generate + ' dummy@gitlab.com' }
......
FactoryGirl.define do
FactoryBot.define do
factory :label_link do
label
target factory: :issue
......
FactoryGirl.define do
FactoryBot.define do
factory :label_priority do
project
label
......
FactoryGirl.define do
FactoryBot.define do
trait :base_label do
title { generate(:label_title) }
color "#990000"
......
include ActionDispatch::TestProcess
FactoryGirl.define do
FactoryBot.define do
factory :lfs_object do
sequence(:oid) { |n| "b68143e6463773b1b6c6fd009a76c32aeec041faff32ba2ed42fd7f708a%05x" % n }
size 499013
......
FactoryGirl.define do
FactoryBot.define do
factory :lfs_objects_project do
lfs_object
project
......
FactoryGirl.define do
FactoryBot.define do
factory :list do
board
label
......
FactoryGirl.define do
FactoryBot.define do
factory :merge_request do
title { generate(:title) }
author
......
FactoryGirl.define do
FactoryBot.define do
factory :merge_requests_closing_issues do
issue
merge_request
......
FactoryGirl.define do
FactoryBot.define do
factory :milestone do
title
......
FactoryGirl.define do
FactoryBot.define do
factory :namespace do
sequence(:name) { |n| "namespace#{n}" }
path { name.downcase.gsub(/\s/, '_') }
......
......@@ -2,7 +2,7 @@ require_relative '../support/repo_helpers'
include ActionDispatch::TestProcess
FactoryGirl.define do
FactoryBot.define do
factory :note do
project
note { generate(:title) }
......
FactoryGirl.define do
FactoryBot.define do
factory :notification_setting do
source factory: :project
user
......
FactoryGirl.define do
FactoryBot.define do
factory :oauth_access_grant do
resource_owner_id { create(:user).id }
application
......
FactoryGirl.define do
FactoryBot.define do
factory :oauth_access_token do
resource_owner
application
......
FactoryGirl.define do
FactoryBot.define do
factory :oauth_application, class: 'Doorkeeper::Application', aliases: [:application] do
sequence(:name) { |n| "OAuth App #{n}" }
uid { Doorkeeper::OAuth::Helpers::UniqueToken.generate }
......
FactoryGirl.define do
FactoryBot.define do
factory :pages_domain, class: 'PagesDomain' do
domain 'my.domain.com'
......
FactoryGirl.define do
FactoryBot.define do
factory :personal_access_token do
user
token { SecureRandom.hex(50) }
......
FactoryGirl.define do
FactoryBot.define do
factory :project_auto_devops do
project
enabled true
......
FactoryGirl.define do
FactoryBot.define do
factory :project_custom_attribute do
project
sequence(:key) { |n| "key#{n}" }
......
FactoryGirl.define do
FactoryBot.define do
factory :project_group_link do
project
group
......
FactoryGirl.define do
FactoryBot.define do
factory :project_hook do
url { generate(:url) }
enable_ssl_verification false
......
FactoryGirl.define do
FactoryBot.define do
factory :project_member do
user
project
......
FactoryGirl.define do
FactoryBot.define do
factory :project_statistics do
project
......
FactoryGirl.define do
FactoryBot.define do
factory :project_wiki do
skip_create
......
require_relative '../support/test_env'
FactoryGirl.define do
FactoryBot.define do
# Project without repository
#
# Project does not have bare repository.
......
FactoryGirl.define do
FactoryBot.define do
factory :protected_branch do
name
project
......
FactoryGirl.define do
FactoryBot.define do
factory :protected_tag do
name
project
......
FactoryGirl.define do
FactoryBot.define do
factory :release do
tag "v1.1.0"
description "Awesome release"
......
FactoryGirl.define do
FactoryBot.define do
factory :sent_notification do
project
recipient factory: :user
......
FactoryGirl.define do
FactoryBot.define do
sequence(:username) { |n| "user#{n}" }
sequence(:name) { |n| "John Doe#{n}" }
sequence(:email) { |n| "user#{n}@example.org" }
......
FactoryGirl.define do
FactoryBot.define do
factory :service_hook do
url { generate(:url) }
service
......
FactoryGirl.define do
FactoryBot.define do
factory :service do
project
type 'Service'
......
FactoryGirl.define do
FactoryBot.define do
factory :snippet do
author
title { generate(:title) }
......
FactoryGirl.define do
FactoryBot.define do
factory :spam_log do
user
sequence(:source_ip) { |n| "42.42.42.#{n % 255}" }
......
FactoryGirl.define do
FactoryBot.define do
factory :subscription do
user
project
......
FactoryGirl.define do
FactoryBot.define do
factory :system_hook do
url { generate(:url) }
end
......
FactoryGirl.define do
FactoryBot.define do
factory :system_note_metadata do
note
action 'merge'
......
# Read about factories at https://github.com/thoughtbot/factory_girl
# Read about factories at https://github.com/thoughtbot/factory_bot
FactoryGirl.define do
FactoryBot.define do
factory :timelog do
time_spent 3600
user
......
FactoryGirl.define do
FactoryBot.define do
factory :todo do
project
author
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment