summaryrefslogtreecommitdiff
path: root/rubocop/cop/rspec
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2017-10-11 13:25:40 +0200
committerRémy Coutable <remy@rymai.me>2017-10-18 18:42:09 +0200
commit8a31b0743753f080e0ba07c8d6d0da863a5c4726 (patch)
tree0a5d03d993597a3f68b4f233b4f7f1ebc0481fa2 /rubocop/cop/rspec
parent4774b6cfd2095974df4267e4e4871b38b274a956 (diff)
downloadgitlab-ce-8a31b0743753f080e0ba07c8d6d0da863a5c4726.tar.gz
Add a new RSpec::EnvAssignment cop to prevent assigning to ENV in specs18765-stub_env_in_specs
Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'rubocop/cop/rspec')
-rw-r--r--rubocop/cop/rspec/env_assignment.rb58
1 files changed, 58 insertions, 0 deletions
diff --git a/rubocop/cop/rspec/env_assignment.rb b/rubocop/cop/rspec/env_assignment.rb
new file mode 100644
index 00000000000..257454af0e1
--- /dev/null
+++ b/rubocop/cop/rspec/env_assignment.rb
@@ -0,0 +1,58 @@
+require 'rubocop-rspec'
+require_relative '../../spec_helpers'
+
+module RuboCop
+ module Cop
+ module RSpec
+ # This cop checks for ENV assignment in specs
+ #
+ # @example
+ #
+ # # bad
+ # before do
+ # ENV['FOO'] = 'bar'
+ # end
+ #
+ # # good
+ # before do
+ # stub_env('FOO', 'bar')
+ # end
+ class EnvAssignment < Cop
+ include SpecHelpers
+
+ MESSAGE = "Don't assign to ENV, use `stub_env` instead.".freeze
+
+ def_node_search :env_assignment?, <<~PATTERN
+ (send (const nil? :ENV) :[]= ...)
+ PATTERN
+
+ # Following is what node.children looks like on a match
+ # [s(:const, nil, :ENV), :[]=, s(:str, "key"), s(:str, "value")]
+ def on_send(node)
+ return unless in_spec?(node)
+ return unless env_assignment?(node)
+
+ add_offense(node, :expression, MESSAGE)
+ end
+
+ def autocorrect(node)
+ lambda do |corrector|
+ corrector.replace(node.loc.expression, stub_env(env_key(node), env_value(node)))
+ end
+ end
+
+ def env_key(node)
+ node.children[2].source
+ end
+
+ def env_value(node)
+ node.children[3].source
+ end
+
+ def stub_env(key, value)
+ "stub_env(#{key}, #{value})"
+ end
+ end
+ end
+ end
+end