@@ -31,6 +31,30 @@ def audit_impl(cfn_model)
31
31
RULE
32
32
end
33
33
34
+ let ( :valid_rule_text2 ) do
35
+ <<~RULE
36
+ require 'cfn-nag/custom_rules/base'
37
+ require 'cfn-nag/violation'
38
+ class ValidCustom2Rule < BaseRule
39
+ def rule_text
40
+ 'this is fake rule text 2'
41
+ end
42
+
43
+ def rule_type
44
+ Violation::WARNING
45
+ end
46
+
47
+ def rule_id
48
+ 'W9934'
49
+ end
50
+
51
+ def audit_impl(cfn_model)
52
+ %w(hardwired1 hardwired2)
53
+ end
54
+ end
55
+ RULE
56
+ end
57
+
34
58
it 'includes external rule definition from absolute directories' do
35
59
Dir . mktmpdir ( %w[ custom_rule loader ] ) do |custom_rule_directory |
36
60
# Write out a valid rule
@@ -88,6 +112,50 @@ def audit_impl(cfn_model)
88
112
expect ( actual_rule_classes . include? ( expected_rule_classes ) ) . to be true
89
113
end
90
114
end
115
+
116
+ it 'includes external rule definitions from subdirectories' do
117
+ Dir . mktmpdir ( %w[ custom_rule loader ] , Dir . getwd ) do |custom_rule_directory |
118
+ # Write out a valid rule
119
+ File . write ( File . join ( custom_rule_directory , 'ValidCustomRule.rb' ) , valid_rule_text )
120
+ # Create a subdirectory for rules
121
+ rule_subdir = File . join ( custom_rule_directory , 'subdir' )
122
+ Dir . mkdir ( rule_subdir )
123
+ # Write a rule in a subdirectory
124
+ File . write ( File . join ( rule_subdir , 'ValidCustom2Rule.rb' ) , valid_rule_text2 )
125
+ # Write out a invalid rule
126
+ File . write ( File . join ( custom_rule_directory , 'InvalidRuleNotMatching.rb' ) , 'fake_rule' )
127
+
128
+ core_rules_registry = FileBasedRuleRepo . new ( nil ) . discover_rules
129
+ actual_rule_registry = FileBasedRuleRepo . new ( File . basename ( custom_rule_directory ) ,
130
+ rule_directory_recursive : true ) . discover_rules
131
+
132
+ # Expect one additional rule loaded
133
+ expect ( actual_rule_registry . rules . size ) . to eq ( core_rules_registry . rules . size +2 )
134
+
135
+ # Validate that the rule was loaded by id
136
+ expected_rule_definition = RuleDefinition . new id : 'W9933' ,
137
+ name : 'ValidCustomRule' ,
138
+ message : 'this is fake rule text' ,
139
+ type : RuleDefinition ::WARNING
140
+
141
+ actual_rule_definition = actual_rule_registry . by_id 'W9933'
142
+ expect ( actual_rule_definition ) . to eq expected_rule_definition
143
+
144
+ # Validate that the rule was loaded by id
145
+ expected_rule_definition = RuleDefinition . new id : 'W9934' ,
146
+ name : 'ValidCustom2Rule' ,
147
+ message : 'this is fake rule text 2' ,
148
+ type : RuleDefinition ::WARNING
149
+
150
+ actual_rule_definition = actual_rule_registry . by_id 'W9934'
151
+ expect ( actual_rule_definition ) . to eq expected_rule_definition
152
+
153
+ # Validate that the rule class was mapped correctly
154
+ actual_rule_classes = actual_rule_registry . rule_classes . map { |rule_class | rule_class . name }
155
+ expect ( actual_rule_classes . include? ( 'ValidCustomRule' ) ) . to be true
156
+ expect ( actual_rule_classes . include? ( 'ValidCustom2Rule' ) ) . to be true
157
+ end
158
+ end
91
159
end
92
160
end
93
161
end
0 commit comments