Sha256: 2a2fc0fd9e734b4308c4d178294e4e46cd99d8ed14417b26fcebda99a68911ba

Contents?: true

Size: 1.76 KB

Versions: 2

Compression:

Stored size: 1.76 KB

Contents

# frozen_string_literal: true

require_relative 'base_matcher'

module Pundit
  module Matchers
    # This is the base action matcher class. Matchers related to actions should inherit from this class.
    class ActionsMatcher < BaseMatcher
      # Error message when actions are not implemented in a policy.
      ACTIONS_NOT_IMPLEMENTED_ERROR = "'%<policy>s' does not implement %<actions>s"
      # Error message when at least one action must be specified.
      ARGUMENTS_REQUIRED_ERROR = 'At least one action must be specified'
      # Error message when only one action may be specified.
      ONE_ARGUMENT_REQUIRED_ERROR = 'Only one action may be specified'

      # Initializes a new instance of the ActionsMatcher class.
      #
      # @param expected_actions [Array<String, Symbol>] The expected actions to be checked.
      #
      # @raise [ArgumentError] If no actions are specified.
      def initialize(*expected_actions)
        raise ArgumentError, ARGUMENTS_REQUIRED_ERROR if expected_actions.empty?

        super()
        @expected_actions = expected_actions.flatten.map(&:to_sym).sort
      end

      # Ensures that only one action is specified.
      #
      # @raise [ArgumentError] If more than one action is specified.
      #
      # @return [ActionsMatcher] The object itself.
      def ensure_single_action!
        raise ArgumentError, ONE_ARGUMENT_REQUIRED_ERROR if expected_actions.size > 1

        self
      end

      private

      attr_reader :expected_actions

      def check_actions!
        missing_actions = expected_actions - policy_info.actions
        return if missing_actions.empty?

        raise ArgumentError, format(
          ACTIONS_NOT_IMPLEMENTED_ERROR,
          policy: policy_info, actions: missing_actions
        )
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pundit-matchers-3.0.0 lib/pundit/matchers/actions_matcher.rb
pundit-matchers-3.0.0.beta4 lib/pundit/matchers/actions_matcher.rb