1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# frozen_string_literal: true
require_relative '../../qa_helpers'
module RuboCop
module Cop
module QA
# This cop checks for the usages of API fabrications and suggests using
# the corresponding QA factories instead.
# @example
# Good:
# create(:project)
# Bad:
# Resource::Project.fabricate_via_api!
# @example
# Good:
# create(:group)
# Bad:
# Resource::Group.fabricate_via_api!
# @example
# Good:
# create(:user, username: 'username', password: 'password')
# Bad:
# Resource::User.fabricate_via_api! do |user|
# user.username = 'username'
# user.password = 'password'
# end
class FabricateUsage < RuboCop::Cop::Base
MESSAGE = "Prefer create(:%{factory}[, ...]) here."
RESOURCES_TO_CHECK = {
'Resource::Project' => :project,
'Resource::Group' => :group,
'Resource::Issue' => :issue,
'Resource::User' => :user,
'Resource::Pipeline' => :pipeline,
'Resource::Job' => :job,
'Resource::File' => :file,
'Resource::GroupAccessToken' => :group_access_token,
'Resource::ProjectAccessToken' => :project_access_token,
'Resource::GroupLabel' => :group_label,
'Resource::ProjectLabel' => :project_label,
'Resource::GroupRunner' => :group_runner,
'Resource::ProjectRunner' => :project_runner,
'Resource::GroupMilestone' => :group_milestone,
'Resource::ProjectMilestone' => :project_milestone,
'Resource::Snippet' => :snippet,
'Resource::ProjectSnippet' => :project_snippet
}.freeze
RESTRICT_ON_SEND = %i[fabricate_via_api!].freeze
def_node_matcher :const_receiver, <<~PATTERN
(send $const ...)
PATTERN
def on_send(node)
factory = RESOURCES_TO_CHECK[const_receiver(node)&.const_name]
return unless factory
add_offense(node, message: format(MESSAGE, factory: factory))
end
end
end
end
end
|