From a09983ae35713f5a2bbb100981116d31ce99826e Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 20 Jul 2020 12:26:25 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-2-stable-ee --- spec/controllers/every_controller_spec.rb | 82 +++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 spec/controllers/every_controller_spec.rb (limited to 'spec/controllers/every_controller_spec.rb') diff --git a/spec/controllers/every_controller_spec.rb b/spec/controllers/every_controller_spec.rb new file mode 100644 index 00000000000..4785ee9ed8f --- /dev/null +++ b/spec/controllers/every_controller_spec.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe "Every controller" do + context "feature categories" do + let_it_be(:feature_categories) do + YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).map(&:to_sym).to_set + end + + let_it_be(:controller_actions) do + # This will return tuples of all controller actions defined in the routes + # Only for controllers inheriting ApplicationController + # Excluding controllers from gems (OAuth, Sidekiq) + Rails.application.routes.routes + .map { |route| route.required_defaults.presence } + .compact + .select { |route| route[:controller].present? && route[:action].present? } + .map { |route| [constantize_controller(route[:controller]), route[:action]] } + .reject { |route| route.first.nil? || !route.first.include?(ControllerWithFeatureCategory) } + end + + let_it_be(:routes_without_category) do + controller_actions.map do |controller, action| + "#{controller}##{action}" unless controller.feature_category_for_action(action) + end.compact + end + + it "has feature categories" do + pending("We'll work on defining categories for all controllers: "\ + "https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/463") + + expect(routes_without_category).to be_empty, "#{routes_without_category.first(10)} did not have a category" + end + + it "completed controllers don't get new routes without categories" do + completed_controllers = [Projects::MergeRequestsController].map(&:to_s) + + newly_introduced_missing_category = routes_without_category.select do |route| + completed_controllers.any? { |controller| route.start_with?(controller) } + end + + expect(newly_introduced_missing_category).to be_empty + end + + it "recognizes the feature categories" do + routes_unknown_category = controller_actions.map do |controller, action| + used_category = controller.feature_category_for_action(action) + next unless used_category + next if used_category == :not_owned + + ["#{controller}##{action}", used_category] unless feature_categories.include?(used_category) + end.compact + + expect(routes_unknown_category).to be_empty, "#{routes_unknown_category.first(10)} had an unknown category" + end + + it "doesn't define or exclude categories on removed actions", :aggregate_failures do + controller_actions.group_by(&:first).each do |controller, controller_action| + existing_actions = controller_action.map(&:last) + used_actions = actions_defined_in_feature_category_config(controller) + non_existing_used_actions = used_actions - existing_actions + + expect(non_existing_used_actions).to be_empty, + "#{controller} used #{non_existing_used_actions} to define feature category, but the route does not exist" + end + end + end + + def constantize_controller(name) + "#{name.camelize}Controller".constantize + rescue NameError + nil # some controllers, like the omniauth ones are dynamic + end + + def actions_defined_in_feature_category_config(controller) + feature_category_configs = controller.send(:class_attributes)[:feature_category_config] + feature_category_configs.map do |config| + Array(config.send(:only)) + Array(config.send(:except)) + end.flatten.uniq.map(&:to_s) + end +end -- cgit v1.2.3