summaryrefslogtreecommitdiff
path: root/rubocop
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-11-10 18:11:08 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-11-10 18:11:08 +0000
commit4e50b9ed316f3c99693a41274babcd67c63ee640 (patch)
tree21f0f3a7f73a7dd51b06ba62ad9cfa3eaab85c9f /rubocop
parent609943de5e2ee6c3bf0f09d3fb1d5fc38ed5a4ed (diff)
downloadgitlab-ce-4e50b9ed316f3c99693a41274babcd67c63ee640.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'rubocop')
-rw-r--r--rubocop/cop/rspec/factory_bot/strategy_in_callback.rb45
1 files changed, 45 insertions, 0 deletions
diff --git a/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb b/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb
new file mode 100644
index 00000000000..3153d54887e
--- /dev/null
+++ b/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'rubocop-rspec'
+
+module RuboCop
+ module Cop
+ module RSpec
+ module FactoryBot
+ class StrategyInCallback < RuboCop::Cop::Base
+ include RuboCop::RSpec::FactoryBot::Language
+
+ MSG = 'Prefer inline `association` over `%{type}`. ' \
+ 'See https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#factories'
+
+ FORBIDDEN_METHODS = %i[build build_list build_stubbed build_stubbed_list create create_list].freeze
+
+ def_node_matcher :forbidden_factory_usage, <<~PATTERN
+ (block
+ (send nil? { :after :before } (sym _strategy))
+ _args
+ ` # in all descandents
+ (send
+ { nil? #factory_bot? }
+ ${ #{FORBIDDEN_METHODS.map(&:inspect).join(' ')} }
+ (sym _factory_name)
+ ...
+ )
+ )
+ PATTERN
+
+ RESTRICT_ON_SEND = FORBIDDEN_METHODS
+
+ def on_send(node)
+ parent = node.each_ancestor(:block).first
+
+ strategy = forbidden_factory_usage(parent)
+ return unless strategy
+
+ add_offense(node, message: format(MSG, type: strategy))
+ end
+ end
+ end
+ end
+ end
+end