Skip to content

Commit

Permalink
Use full path when loading file rules (#525)
Browse files Browse the repository at this point in the history
Resolves #520
  • Loading branch information
arothian committed Apr 12, 2021
1 parent e060043 commit be9415a
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 38 deletions.
2 changes: 1 addition & 1 deletion lib/cfn-nag/rule_repos/file_based_rule_repo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def discover_rule_classes(rule_directory)

rule_filenames = discover_rule_filenames(rule_directory)
rule_filenames.each do |rule_filename|
require(rule_filename)
require(File.absolute_path(rule_filename))
rule_classname = File.basename(rule_filename, '.rb')

rule_classes << Object.const_get(rule_classname)
Expand Down
107 changes: 70 additions & 37 deletions spec/rules_repos/file_base_rule_repo_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,52 +6,85 @@
describe FileBasedRuleRepo do
describe '#discover_rules' do
context 'external rule directory' do
before(:each) do
fake_rule = <<RULE
require 'cfn-nag/custom_rules/base'
require 'cfn-nag/violation'
class FakeRule < BaseRule
def rule_text
'this is fake rule text'
end

def rule_type
Violation::WARNING
end
let(:valid_rule_text) do
<<~RULE
require 'cfn-nag/custom_rules/base'
require 'cfn-nag/violation'
class ValidCustomRule < BaseRule
def rule_text
'this is fake rule text'
end
def rule_id
'W9933'
end
def rule_type
Violation::WARNING
end
def audit_impl(cfn_model)
%w(hardwired1 hardwired2)
end
end
RULE
@custom_rule_directory = Dir.mktmpdir(%w[custom_rule loader])
File.open(File.join(@custom_rule_directory,
'FakeRule.rb'),
'w+') { |file| file.write fake_rule }
@file_base_rule_repo = FileBasedRuleRepo.new(@custom_rule_directory)
def rule_id
'W9933'
end
def audit_impl(cfn_model)
%w(hardwired1 hardwired2)
end
end
RULE
end

after(:each) do
FileUtils.rm_rf @custom_rule_directory
it 'includes external rule definition from absolute directories' do
Dir.mktmpdir(%w[custom_rule loader]) do |custom_rule_directory|
# Write out a valid rule
File.write(File.join(custom_rule_directory, 'ValidCustomRule.rb'), valid_rule_text)
# Write out a invalid rule
File.write(File.join(custom_rule_directory, 'InvalidRuleNotMatching.rb'), 'fake_rule')

core_rules_registry = FileBasedRuleRepo.new(nil).discover_rules
actual_rule_registry = FileBasedRuleRepo.new(custom_rule_directory).discover_rules

# Expect one additional rule loaded
expect(actual_rule_registry.rules.size).to eq(core_rules_registry.rules.size+1)

# Validate that the rule was loaded by id
expected_rule_definition = RuleDefinition.new id: 'W9933',
message: 'this is fake rule text',
type: RuleDefinition::WARNING

actual_rule_definition = actual_rule_registry.by_id 'W9933'
expect(actual_rule_definition).to eq expected_rule_definition

# Validate that the rule class was mapped correctly
expected_rule_classes = 'ValidCustomRule'
actual_rule_classes = actual_rule_registry.rule_classes.map { |rule_class| rule_class.name }
expect(actual_rule_classes.include?(expected_rule_classes)).to be true
end
end

it 'includes external rule definition' do
actual_rule_registry = @file_base_rule_repo.discover_rules
expected_rule_definition = RuleDefinition.new id: 'W9933',
message: 'this is fake rule text',
type: RuleDefinition::WARNING
it 'includes external rule definition from relative' do
Dir.mktmpdir(%w[custom_rule loader], Dir.getwd) do |custom_rule_directory|
# Write out a valid rule
File.write(File.join(custom_rule_directory, 'ValidCustomRule.rb'), valid_rule_text)
# Write out a invalid rule
File.write(File.join(custom_rule_directory, 'InvalidRuleNotMatching.rb'), 'fake_rule')

core_rules_registry = FileBasedRuleRepo.new(nil).discover_rules
actual_rule_registry = FileBasedRuleRepo.new(File.basename(custom_rule_directory)).discover_rules

# Expect one additional rule loaded
expect(actual_rule_registry.rules.size).to eq(core_rules_registry.rules.size+1)

# Validate that the rule was loaded by id
expected_rule_definition = RuleDefinition.new id: 'W9933',
message: 'this is fake rule text',
type: RuleDefinition::WARNING

actual_rule_definition = actual_rule_registry.by_id 'W9933'
expect(actual_rule_definition).to eq expected_rule_definition
actual_rule_definition = actual_rule_registry.by_id 'W9933'
expect(actual_rule_definition).to eq expected_rule_definition

expected_rule_classes = 'FakeRule'
actual_rule_classes = actual_rule_registry.rule_classes.map { |rule_class| rule_class.name }
expect(actual_rule_classes.include?(expected_rule_classes)).to be true
# Validate that the rule class was mapped correctly
expected_rule_classes = 'ValidCustomRule'
actual_rule_classes = actual_rule_registry.rule_classes.map { |rule_class| rule_class.name }
expect(actual_rule_classes.include?(expected_rule_classes)).to be true
end
end
end
end
Expand Down

0 comments on commit be9415a

Please sign in to comment.