Welcome to mirror list, hosted at ThFree Co, Russian Federation.

fabricate_usage.rb « qa « cop « rubocop - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1787df0e7dfe0781ee68e729b6da3dbc8bf67ac2 (plain)
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