class PolicyAssertions::Test

Public Instance Methods

assert_not_permitted(user, record, *permissions)
Alias for: refute_permit
assert_permit(user, record, *permissions) click to toggle source
# File lib/policy_assertions.rb, line 18
def assert_permit(user, record, *permissions)
  get_permissions(permissions.flatten).each do |permission|
    policy = find_policy!(user, record)
    assert policy.public_send(permission),
           "Expected #{policy.class.name} to grant #{permission} "\
           "on #{record} for #{user} but it didn't"
  end
end
assert_strong_parameters(user, record, params_hash, allowed_params) click to toggle source
# File lib/policy_assertions.rb, line 37
def assert_strong_parameters(user, record, params_hash, allowed_params)
  policy = find_policy!(user, record)

  param_key = find_param_key(record)

  params = ActionController::Parameters.new(param_key => params_hash)

  strong_params = params.require(param_key)
                  .permit(*policy.permitted_attributes).keys

  strong_params.each do |param|
    assert_includes allowed_params, param.to_sym,
                    "User #{user} should not be permitted to "\
                    "update parameter [#{param}]"
  end
end
refute_permit(user, record, *permissions) click to toggle source
# File lib/policy_assertions.rb, line 27
def refute_permit(user, record, *permissions)
  get_permissions(permissions.flatten).each do |permission|
    policy = find_policy!(user, record)
    refute policy.public_send(permission),
           "Expected #{policy.class.name} not to grant #{permission} "\
           "on #{record} for #{user} but it did"
  end
end
Also aliased as: assert_not_permitted

Private Instance Methods

calling_method() click to toggle source
# File lib/policy_assertions.rb, line 79
def calling_method
  if PolicyAssertions.config.ruby_version > 1
    caller_locations(3, 1)[0].label
  else
    caller[2][/`.*'/][1..-2]
  end
end
find_param_key(record) click to toggle source

borrowed from Pundit::PolicyFinder

# File lib/policy_assertions.rb, line 57
def find_param_key(record)
  if record.respond_to?(:model_name)
    record.model_name.param_key.to_s
  elsif record.is_a?(Class)
    record.to_s.demodulize.underscore
  else
    record.class.to_s.demodulize.underscore
  end
end
find_policy!(user, record) click to toggle source
# File lib/policy_assertions.rb, line 87
def find_policy!(user, record)
  described_policy = self.respond_to?(:described_class) ? described_class : nil
  described_policy ? described_policy.new(user, record) : Pundit.policy!(user, record)
end
get_permissions(permissions) click to toggle source
# File lib/policy_assertions.rb, line 67
def get_permissions(permissions)
  return permissions if permissions.present?

  name = calling_method

  fail(MissingBlockParameters) if name.start_with?('block')

  # remove 'test_' and split
  # append ? to the permission
  name[5..-1].split(PolicyAssertions.config.separator).map { |a| "#{a}?" }
end