parse_decision 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +71 -0
- data/bin/parse_decision +126 -0
- data/lib/parse_decision/config.rb +90 -0
- data/lib/parse_decision/controller.rb +142 -0
- data/lib/parse_decision/parsedecisiontask.rb +31 -0
- data/lib/parse_decision/parser.rb +194 -0
- data/lib/parse_decision/pd_context.rb +148 -0
- data/lib/parse_decision/plugin/application.rb +48 -0
- data/lib/parse_decision/plugin/plugin.rb +56 -0
- data/lib/parse_decision/plugin/ppm_xpath.rb +70 -0
- data/lib/parse_decision/plugin/pre_decision_guideline.rb +177 -0
- data/lib/parse_decision/plugin/product.rb +176 -0
- data/lib/parse_decision/plugin/product_xpath.rb +52 -0
- data/lib/parse_decision/plugin/web_product.rb +179 -0
- data/lib/parse_decision/plugin.rb +50 -0
- data/lib/parse_decision/version.rb +5 -0
- data/lib/parse_decision.rb +59 -0
- data/parse_decision.gemspec +27 -0
- data/rakefile.rb +58 -0
- data/spec/context_spec.rb +21 -0
- data/spec/data/multiproduct.decision.txt +1481 -0
- data/spec/data/prod.decision.txt +3957 -0
- data/spec/data/reference/multiproduct/001-APP.xml +1 -0
- data/spec/data/reference/multiproduct/001-Mod-Forbear-PRODUCT.xml +357 -0
- data/spec/data/reference/multiproduct/001-Mod-Forgive-PRODUCT.xml +361 -0
- data/spec/data/reference/multiproduct/001-Mod-RateTerm-PRODUCT.xml +353 -0
- data/spec/data/reference/multiproduct/001-Mod-SAM-PRODUCT.xml +365 -0
- data/spec/data/reference/product/001-APP.xml +1 -0
- data/spec/data/reference/product/001-Validation-Rules.xml +536 -0
- data/spec/data/reference/product/002-APP.xml +1 -0
- data/spec/data/reference/product/002-FAPIILoanModification-PRODUCT.xml +1770 -0
- data/spec/data/reference/web/001-APP.xml +1 -0
- data/spec/data/reference/web/001-Product01-PRODUCT.xml +1088 -0
- data/spec/data/reference/web/002-APP.xml +1 -0
- data/spec/data/reference/web/002-Product01-PRODUCT.xml +15 -0
- data/spec/data/reference/workflow/001-APP.xml +1 -0
- data/spec/data/reference/workflow/001-WF-DataClearing-Pre-Rules.xml +37 -0
- data/spec/data/reference/workflow-2/001-APP.xml +1 -0
- data/spec/data/reference/workflow-2/001-WF-ProdSel-Post-Rules.xml +699 -0
- data/spec/data/test.rb +13 -0
- data/spec/data/validation.decision.txt +1199 -0
- data/spec/data/web.decision.txt +1128 -0
- data/spec/data/wf.decision.txt +43 -0
- data/spec/data/wf2.decision.txt +705 -0
- data/spec/parser_spec.rb +308 -0
- data/spec/plugin_app_spec.rb +40 -0
- data/spec/plugin_ppmxpath_spec.rb +74 -0
- data/spec/plugin_predecision_spec.rb +81 -0
- data/spec/plugin_product_spec.rb +117 -0
- data/spec/plugin_productxpath_spec.rb +76 -0
- data/spec/plugin_spec.rb +54 -0
- data/spec/spec_helper.rb +81 -0
- data/test/data/2.2.decision-multiple.txt +1391 -0
- data/test/data/2.2.decision.txt +1128 -0
- data/test/data/2.decision.txt +1481 -0
- data/test/plugins/test_plugin_predecisionguideline.rb +120 -0
- data/test/plugins/test_plugin_product.rb +120 -0
- data/test/test_config.rb +90 -0
- data/test/test_context.rb +103 -0
- data/test/test_parse_webdecision.rb +121 -0
- data/test/test_parser.rb +69 -0
- data/test/test_parser_parse.rb +110 -0
- metadata +225 -0
data/spec/parser_spec.rb
ADDED
@@ -0,0 +1,308 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ParseDecision::Parser do
|
4
|
+
|
5
|
+
let(:parser) { ParseDecision::Parser.new }
|
6
|
+
let(:outdir) { 'tmp/spec/parser' }
|
7
|
+
let(:wfsrc_log) { 'spec/data/wf.decision.txt' }
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
out = Pathname.new outdir
|
11
|
+
out.rmtree if out.exist? && out.directory?
|
12
|
+
end
|
13
|
+
|
14
|
+
it "raises an error if an output dir is not set" do
|
15
|
+
expect { parser.parseFile(wfsrc_log) }.to raise_error("outdir missing")
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:wfrules_output) { outdir+'/001-WF-DataClearing-Pre-Rules.xml' }
|
19
|
+
let(:wfapp_output) { outdir+'/001-APP.xml' }
|
20
|
+
let(:wflog_output) { outdir+'/wf.decision.txt' }
|
21
|
+
|
22
|
+
let(:wfrules_file) { Pathname.new wfrules_output }
|
23
|
+
let(:wfapp_file) { Pathname.new wfapp_output }
|
24
|
+
let(:wfsource_file) { Pathname.new wflog_output }
|
25
|
+
|
26
|
+
it "parses a file" do
|
27
|
+
parser.parse wfsrc_log, outdir
|
28
|
+
|
29
|
+
wfrules_file.exist?.should be_truthy
|
30
|
+
wfapp_file.exist?.should be_truthy
|
31
|
+
wfsource_file.exist?.should be_truthy
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "parsed workflow decisions" do
|
35
|
+
|
36
|
+
# Reference files
|
37
|
+
let(:wfapp_reference) { 'spec/data/reference/workflow/001-APP.xml' }
|
38
|
+
let(:wfrules_reference) { 'spec/data/reference/workflow/001-WF-DataClearing-Pre-Rules.xml' }
|
39
|
+
|
40
|
+
let(:wfrules_result) { file_to_array( wfrules_output ) }
|
41
|
+
let(:wfapp_result) { file_to_array( wfapp_output ) }
|
42
|
+
let(:wf_ref_file) { file_to_array( wfrules_reference ) }
|
43
|
+
let(:wfapp_ref_file) { file_to_array( wfapp_reference ) }
|
44
|
+
|
45
|
+
it "contain rules" do
|
46
|
+
parser.parse wfsrc_log, outdir
|
47
|
+
|
48
|
+
wfrules_result.should include 'CURRENT LOAN STAGE'
|
49
|
+
wfrules_result.should include '<Rule Name='
|
50
|
+
end
|
51
|
+
|
52
|
+
it "match reference output files" do
|
53
|
+
parser.parse wfsrc_log, outdir
|
54
|
+
|
55
|
+
wfrules_result.should eq wf_ref_file
|
56
|
+
wfapp_result.should eq wfapp_ref_file
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "parsed product decisions" do
|
61
|
+
|
62
|
+
let(:src_log) { 'spec/data/prod.decision.txt' }
|
63
|
+
|
64
|
+
let(:log_output) { outdir+'/prod.decision.txt' }
|
65
|
+
let(:app_output) { outdir+'/002-APP.xml' }
|
66
|
+
let(:rules_output) { outdir+'/002-FAPIILoanModification-PRODUCT.xml' }
|
67
|
+
|
68
|
+
# Reference files
|
69
|
+
let(:app_reference) { 'spec/data/reference/product/002-APP.xml' }
|
70
|
+
let(:rules_reference) { 'spec/data/reference/product/002-FAPIILoanModification-PRODUCT.xml' }
|
71
|
+
|
72
|
+
let(:app_result) { file_to_array( app_output ) }
|
73
|
+
let(:rules_result) { file_to_array( rules_output ) }
|
74
|
+
let(:app_ref_file) { file_to_array( app_reference ) }
|
75
|
+
let(:rules_ref_file) { file_to_array( rules_reference ) }
|
76
|
+
|
77
|
+
it "contain rules" do
|
78
|
+
parser.parse src_log, outdir
|
79
|
+
|
80
|
+
app_result.should include '<DECISION_REQUEST>'
|
81
|
+
rules_result.should include '<Rule Name='
|
82
|
+
end
|
83
|
+
|
84
|
+
it "match reference output files" do
|
85
|
+
parser.parse src_log, outdir
|
86
|
+
|
87
|
+
app_result.should eq app_ref_file
|
88
|
+
rules_result.should eq rules_ref_file
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "parsed validation decisions" do
|
94
|
+
|
95
|
+
let(:src_log) { 'spec/data/prod.decision.txt' }
|
96
|
+
|
97
|
+
let(:log_output) { outdir+'/prod.decision.txt' }
|
98
|
+
let(:app_output) { outdir+'/001-APP.xml' }
|
99
|
+
let(:rules_output) { outdir+'/001-Validation-Rules.xml' }
|
100
|
+
|
101
|
+
# Reference files
|
102
|
+
let(:app_reference) { 'spec/data/reference/product/001-APP.xml' }
|
103
|
+
let(:rules_reference) { 'spec/data/reference/product/001-Validation-Rules.xml' }
|
104
|
+
|
105
|
+
let(:app_result) { file_to_array( app_output ) }
|
106
|
+
let(:rules_result) { file_to_array( rules_output ) }
|
107
|
+
let(:app_ref_file) { file_to_array( app_reference ) }
|
108
|
+
let(:rules_ref_file) { file_to_array( rules_reference ) }
|
109
|
+
|
110
|
+
it "contain rules" do
|
111
|
+
parser.parse src_log, outdir
|
112
|
+
|
113
|
+
app_result.should include '<DECISION_REQUEST>'
|
114
|
+
rules_result.should include '<Rule Name='
|
115
|
+
end
|
116
|
+
|
117
|
+
it "match reference output files" do
|
118
|
+
parser.parse src_log, outdir
|
119
|
+
|
120
|
+
app_result.should eq app_ref_file
|
121
|
+
rules_result.should eq rules_ref_file
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "parsed validation decisions with discard data" do
|
127
|
+
|
128
|
+
let(:src_log) { 'spec/data/validation.decision.txt' }
|
129
|
+
|
130
|
+
let(:log_output) { outdir+'/validation.decision.txt' }
|
131
|
+
let(:app_output) { outdir+'/001-APP.xml' }
|
132
|
+
let(:rules_output) { outdir+'/001-Validation-Rules.xml' }
|
133
|
+
|
134
|
+
# Reference files
|
135
|
+
let(:app_reference) { 'spec/data/reference/validation/001-APP.xml' }
|
136
|
+
let(:rules_reference) { 'spec/data/reference/validation/001-Validation-Rules.xml' }
|
137
|
+
|
138
|
+
let(:app_result) { file_to_array( app_output ) }
|
139
|
+
let(:rules_result) { file_to_array( rules_output ) }
|
140
|
+
let(:app_ref_file) { file_to_array( app_reference ) }
|
141
|
+
let(:rules_ref_file) { file_to_array( rules_reference ) }
|
142
|
+
|
143
|
+
it "contain request XML" do
|
144
|
+
parser.parse src_log, outdir
|
145
|
+
|
146
|
+
app_result.should include '<DECISION_REQUEST>'
|
147
|
+
end
|
148
|
+
|
149
|
+
it "contain Decision open tag element" do
|
150
|
+
parser.parse src_log, outdir
|
151
|
+
|
152
|
+
rules_result.should include '<Decision GuidelineId="39"'
|
153
|
+
end
|
154
|
+
|
155
|
+
it "contain Rules open tag" do
|
156
|
+
parser.parse src_log, outdir
|
157
|
+
|
158
|
+
rules_result.should include '<Rules>'
|
159
|
+
end
|
160
|
+
|
161
|
+
it "contain at least one rule tag" do
|
162
|
+
parser.parse src_log, outdir
|
163
|
+
|
164
|
+
app_result.should include '<DECISION_REQUEST>'
|
165
|
+
rules_result.should include '<Decision GuidelineId="39"'
|
166
|
+
rules_result.should include '<Rules>'
|
167
|
+
rules_result.should include '<Rule Name='
|
168
|
+
end
|
169
|
+
|
170
|
+
it "match reference output files" do
|
171
|
+
parser.parse src_log, outdir
|
172
|
+
|
173
|
+
app_result.should eq app_ref_file
|
174
|
+
rules_result.should eq rules_ref_file
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "parsed workflow2 decisions" do
|
180
|
+
|
181
|
+
let(:src_log) { 'spec/data/wf2.decision.txt' }
|
182
|
+
|
183
|
+
let(:log_output) { outdir+'/wf2.decision.txt' }
|
184
|
+
let(:app_output) { outdir+'/001-APP.xml' }
|
185
|
+
let(:rules_output) { outdir+'/001-WF-ProdSel-Post-Rules.xml' }
|
186
|
+
|
187
|
+
# Reference files
|
188
|
+
let(:app_reference) { 'spec/data/reference/workflow-2/001-APP.xml' }
|
189
|
+
let(:rules_reference) { 'spec/data/reference/workflow-2/001-WF-ProdSel-Post-Rules.xml' }
|
190
|
+
|
191
|
+
let(:app_result) { file_to_array( app_output ) }
|
192
|
+
let(:rules_result) { file_to_array( rules_output ) }
|
193
|
+
let(:app_ref_file) { file_to_array( app_reference ) }
|
194
|
+
let(:rules_ref_file) { file_to_array( rules_reference ) }
|
195
|
+
|
196
|
+
it "contain rules" do
|
197
|
+
parser.parse src_log, outdir
|
198
|
+
|
199
|
+
app_result.should include '<DECISION_REQUEST>'
|
200
|
+
rules_result.should include '<Rule Name='
|
201
|
+
end
|
202
|
+
|
203
|
+
it "match reference output files" do
|
204
|
+
parser.parse src_log, outdir
|
205
|
+
|
206
|
+
app_result.should eq app_ref_file
|
207
|
+
rules_result.should eq rules_ref_file
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "parsed multi-product decisions" do
|
213
|
+
|
214
|
+
let(:src_log) { 'spec/data/multiproduct.decision.txt' }
|
215
|
+
|
216
|
+
let(:app_output) { outdir+'/001-APP.xml' }
|
217
|
+
let(:rules_output1) { outdir+'/001-Mod-Forbear-PRODUCT.xml' }
|
218
|
+
let(:rules_output2) { outdir+'/001-Mod-Forgive-PRODUCT.xml' }
|
219
|
+
let(:rules_output3) { outdir+'/001-Mod-RateTerm-PRODUCT.xml' }
|
220
|
+
let(:rules_output4) { outdir+'/001-Mod-SAM-PRODUCT.xml' }
|
221
|
+
let(:log_output) { outdir+'/multiproduct.decision.txt' }
|
222
|
+
|
223
|
+
# Reference files
|
224
|
+
let(:app_reference) { 'spec/data/reference/multiproduct/001-APP.xml' }
|
225
|
+
let(:rules_reference1) { 'spec/data/reference/multiproduct/001-Mod-Forbear-PRODUCT.xml' }
|
226
|
+
let(:rules_reference2) { 'spec/data/reference/multiproduct/001-Mod-Forgive-PRODUCT.xml' }
|
227
|
+
let(:rules_reference3) { 'spec/data/reference/multiproduct/001-Mod-RateTerm-PRODUCT.xml' }
|
228
|
+
let(:rules_reference4) { 'spec/data/reference/multiproduct/001-Mod-SAM-PRODUCT.xml' }
|
229
|
+
|
230
|
+
let(:app_result) { file_to_array( app_output ) }
|
231
|
+
let(:rules_result1) { file_to_array( rules_output1 ) }
|
232
|
+
let(:rules_result2) { file_to_array( rules_output2 ) }
|
233
|
+
let(:rules_result3) { file_to_array( rules_output3 ) }
|
234
|
+
let(:rules_result4) { file_to_array( rules_output4 ) }
|
235
|
+
let(:app_ref_file) { file_to_array( app_reference ) }
|
236
|
+
let(:rules_ref_file1) { file_to_array( rules_reference1 ) }
|
237
|
+
let(:rules_ref_file2) { file_to_array( rules_reference2 ) }
|
238
|
+
let(:rules_ref_file3) { file_to_array( rules_reference3 ) }
|
239
|
+
let(:rules_ref_file4) { file_to_array( rules_reference4 ) }
|
240
|
+
|
241
|
+
it "contain rules" do
|
242
|
+
parser.parse src_log, outdir
|
243
|
+
|
244
|
+
app_result.should include '<DECISION_REQUEST>'
|
245
|
+
rules_result1.should include '<Rule Name='
|
246
|
+
rules_result2.should include '<Rule Name='
|
247
|
+
rules_result3.should include '<Rule Name='
|
248
|
+
rules_result4.should include '<Rule Name='
|
249
|
+
end
|
250
|
+
|
251
|
+
it "match reference output files" do
|
252
|
+
parser.parse src_log, outdir
|
253
|
+
|
254
|
+
app_result.should eq app_ref_file
|
255
|
+
rules_result1.should eq rules_ref_file1
|
256
|
+
rules_result2.should eq rules_ref_file2
|
257
|
+
rules_result3.should eq rules_ref_file3
|
258
|
+
rules_result4.should eq rules_ref_file4
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
describe "parsed web decisions" do
|
264
|
+
|
265
|
+
let(:src_log) { 'spec/data/web.decision.txt' }
|
266
|
+
|
267
|
+
let(:app_output1) { outdir+'/001-APP.xml' }
|
268
|
+
let(:app_output2) { outdir+'/002-APP.xml' }
|
269
|
+
let(:rules_output1) { outdir+'/001-Product01-PRODUCT.xml' }
|
270
|
+
let(:rules_output2) { outdir+'/002-Product01-PRODUCT.xml' }
|
271
|
+
let(:log_output) { outdir+'/web.decision.txt' }
|
272
|
+
|
273
|
+
# Reference files
|
274
|
+
let(:app_reference1) { 'spec/data/reference/web/001-APP.xml' }
|
275
|
+
let(:app_reference2) { 'spec/data/reference/web/002-APP.xml' }
|
276
|
+
let(:rules_reference1) { 'spec/data/reference/web/001-Product01-PRODUCT.xml' }
|
277
|
+
let(:rules_reference2) { 'spec/data/reference/web/002-Product01-PRODUCT.xml' }
|
278
|
+
|
279
|
+
let(:app_result1) { file_to_array( app_output1 ) }
|
280
|
+
let(:app_result2) { file_to_array( app_output2 ) }
|
281
|
+
let(:rules_result1) { file_to_array( rules_output1 ) }
|
282
|
+
let(:rules_result2) { file_to_array( rules_output2 ) }
|
283
|
+
let(:app_ref_file1) { file_to_array( app_reference1 ) }
|
284
|
+
let(:app_ref_file2) { file_to_array( app_reference2 ) }
|
285
|
+
let(:rules_ref_file1) { file_to_array( rules_reference1 ) }
|
286
|
+
let(:rules_ref_file2) { file_to_array( rules_reference2 ) }
|
287
|
+
|
288
|
+
it "contain rules" do
|
289
|
+
parser.parse src_log, outdir
|
290
|
+
|
291
|
+
app_result1.should include '<DECISION_REQUEST>'
|
292
|
+
app_result2.should include '<DECISION_REQUEST>'
|
293
|
+
rules_result1.should include '<Rule Name='
|
294
|
+
rules_result2.should include '<Rule Name='
|
295
|
+
end
|
296
|
+
|
297
|
+
it "match reference output files" do
|
298
|
+
parser.parse src_log, outdir
|
299
|
+
|
300
|
+
app_result1.should eq app_ref_file1
|
301
|
+
app_result2.should eq app_ref_file2
|
302
|
+
rules_result1.should eq rules_ref_file1
|
303
|
+
rules_result2.should eq rules_ref_file2
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Plugin::Application" do
|
4
|
+
|
5
|
+
def a_context
|
6
|
+
ctx = ParseDecision::PDContext.new
|
7
|
+
ctx.outdir = 'tmp/spec'
|
8
|
+
ctx
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when #execute is called" do
|
12
|
+
|
13
|
+
Given (:context) { a_context }
|
14
|
+
Given (:plug) { ParseDecision::Plugin::Application.new }
|
15
|
+
Given (:line) { '<DECISION_REQUEST><APPLICATION Blah="bleh"/></DECISION_REQUEST>' }
|
16
|
+
|
17
|
+
context "with line containing '<APPLICATION '" do
|
18
|
+
When (:result) { plug.execute( context, line ) }
|
19
|
+
|
20
|
+
Then { result.should eq true }
|
21
|
+
|
22
|
+
context "and context state will change" do
|
23
|
+
Then { context.state.should eq :app }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Given(:another_line) { '<Guideline Name="Blargh" />' }
|
28
|
+
|
29
|
+
context "with line that does not contain '<APPLICATION '" do
|
30
|
+
When(:result) { plug.execute( context, another_line ) }
|
31
|
+
|
32
|
+
Then { result.should eq false }
|
33
|
+
|
34
|
+
context "and context state will not change" do
|
35
|
+
Then { context.state.should eq nil }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Plugin::PpmXpath" do
|
4
|
+
|
5
|
+
def a_context( _state=nil )
|
6
|
+
ctx = ParseDecision::PDContext.new
|
7
|
+
ctx.outdir = 'tmp/spec'
|
8
|
+
ctx.state = _state
|
9
|
+
ctx
|
10
|
+
end
|
11
|
+
|
12
|
+
start_string = '*APP XPATH xml*'
|
13
|
+
end_string = '<PPXPATH>'
|
14
|
+
|
15
|
+
context "when #execute is called" do
|
16
|
+
|
17
|
+
Given (:context) { a_context }
|
18
|
+
Given (:plug) { ParseDecision::Plugin::PpmXpath.new }
|
19
|
+
|
20
|
+
context "with a current state of :app" do
|
21
|
+
Given (:context) { a_context( :app ) }
|
22
|
+
|
23
|
+
context "with line containing '#{start_string}'" do
|
24
|
+
Given (:line) { start_string }
|
25
|
+
|
26
|
+
When (:result) { plug.execute( context, line ) }
|
27
|
+
|
28
|
+
Then { result.should eq true }
|
29
|
+
|
30
|
+
context "and context state will change" do
|
31
|
+
Then { context.state.should eq :appPpmXpath }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "any other lines are refused" do
|
36
|
+
Given (:line) { "anything other than start_string" }
|
37
|
+
Given! (:start_state) { context.state }
|
38
|
+
|
39
|
+
When (:result) { plug.execute( context, line ) }
|
40
|
+
|
41
|
+
Then { result.should eq false }
|
42
|
+
|
43
|
+
context "and context state will not change" do
|
44
|
+
Then { context.state.should eq start_state }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "with a current state of :appPpmXpath" do
|
50
|
+
Given (:context) { a_context( :appPpmXpath ) }
|
51
|
+
|
52
|
+
context "accept any line without #{end_string}" do
|
53
|
+
Given (:line) { "anything" }
|
54
|
+
|
55
|
+
When (:result) { plug.execute( context, line ) }
|
56
|
+
|
57
|
+
Then { result.should eq true }
|
58
|
+
end
|
59
|
+
|
60
|
+
context "stop accepting lines after #{end_string} received" do
|
61
|
+
Given (:line) { end_string }
|
62
|
+
|
63
|
+
When (:result) { plug.execute( context, line ) }
|
64
|
+
|
65
|
+
Then { result.should eq true }
|
66
|
+
|
67
|
+
context "and context state will change to :app" do
|
68
|
+
Then { context.state.should eq :app }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
def start_decision_element(name)
|
4
|
+
'<Decision GuidelineId="123" GuidelineName="'+name+'"'
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "Plugin::PreDecisionGuideline" do
|
8
|
+
|
9
|
+
ppms_string = '<PARAMS><_DATA_SET'
|
10
|
+
gdl_string = '<Guideline '
|
11
|
+
end_string = '</Decision>'
|
12
|
+
|
13
|
+
context "when #execute is called" do
|
14
|
+
|
15
|
+
Given (:context) { create_context }
|
16
|
+
Given (:plug) { ParseDecision::Plugin::PreDecisionGuideline.new }
|
17
|
+
|
18
|
+
context "with a current state of :app" do
|
19
|
+
Given (:context) { create_context( :app ) }
|
20
|
+
Given! (:start_state) { context.state }
|
21
|
+
|
22
|
+
context "with line containing '#{ppms_string}'" do
|
23
|
+
Given (:line) { ppms_string }
|
24
|
+
|
25
|
+
When (:result) { plug.execute( context, line ) }
|
26
|
+
|
27
|
+
Then { result.should eq true }
|
28
|
+
|
29
|
+
context "and context state will not change" do
|
30
|
+
Then { context.state.should eq start_state }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with line containing '#{gdl_string}'" do
|
35
|
+
Given (:line) { "#{gdl_string}blahblahblah" }
|
36
|
+
|
37
|
+
When (:result) { plug.execute( context, line ) }
|
38
|
+
|
39
|
+
Then { result.should eq true }
|
40
|
+
|
41
|
+
context "and context state will change to :preDecisionGdl" do
|
42
|
+
Then { context.state.should eq :preDecisionGdl }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with a current state of :preDecisionGdl" do
|
48
|
+
Given (:context) { create_context( :preDecisionGdl ) }
|
49
|
+
|
50
|
+
context "accept any line" do
|
51
|
+
Given (:line) { "anything" }
|
52
|
+
|
53
|
+
When (:result) { plug.execute( context, line ) }
|
54
|
+
|
55
|
+
Then { result.should eq true }
|
56
|
+
end
|
57
|
+
|
58
|
+
context "creates filename from Decision element's GuidelineName attribute" do
|
59
|
+
Given (:line) { "#{start_decision_element('TestGdl')} blahblahblah" }
|
60
|
+
|
61
|
+
When (:result) { plug.execute( context, line ) }
|
62
|
+
|
63
|
+
Then { result.should eq true }
|
64
|
+
Then { plug.outfile.should eq "000-TestGdl-Rules.xml" }
|
65
|
+
end
|
66
|
+
|
67
|
+
context "stop accepting lines after #{end_string} received" do
|
68
|
+
Given (:line) { end_string }
|
69
|
+
|
70
|
+
When (:result) { plug.execute( context, line ) }
|
71
|
+
|
72
|
+
Then { result.should eq true }
|
73
|
+
|
74
|
+
context "and context state will change to :app" do
|
75
|
+
Then { context.state.should eq :app }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
def start_product_element(name)
|
4
|
+
'<PRODUCTS><PRODUCT Name="'+name+'"'
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "Plugin::Product" do
|
8
|
+
|
9
|
+
ppm_start_string = "<PARAMS><_DATA_SET"
|
10
|
+
rule_start_string = "<Rules>"
|
11
|
+
rule_end_string = "</Decision>"
|
12
|
+
end_string = '</Decision>'
|
13
|
+
|
14
|
+
context "when #execute is called" do
|
15
|
+
|
16
|
+
# Can't use #let here. We want the same plugin to be used so it's
|
17
|
+
# updated as we move through the flow.
|
18
|
+
plug = ParseDecision::Plugin::Product.new
|
19
|
+
|
20
|
+
context "with a current state of :app" do
|
21
|
+
# Can't use #let here. We want the same context to be used so it's
|
22
|
+
# updated as we move through the flow.
|
23
|
+
ctx = create_context( :app )
|
24
|
+
|
25
|
+
context "with line containing '#{start_product_element('Test')}'" do
|
26
|
+
let (:line) { start_product_element('Test') }
|
27
|
+
|
28
|
+
it "returns true and state should change to :productXml" do
|
29
|
+
|
30
|
+
result = plug.execute( ctx, line )
|
31
|
+
|
32
|
+
result.should eq true
|
33
|
+
ctx.state.should eq :productXml
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with a current state of :productXml" do
|
37
|
+
|
38
|
+
context "with line containing '#{ppm_start_string}'" do
|
39
|
+
let (:line) { ppm_start_string }
|
40
|
+
|
41
|
+
it "returns true and state should change to :productPpms" do
|
42
|
+
result = plug.execute( ctx, line )
|
43
|
+
|
44
|
+
result.should eq true
|
45
|
+
ctx.state.should eq :productPpms
|
46
|
+
end
|
47
|
+
|
48
|
+
context "with a current state of :productPpms" do
|
49
|
+
|
50
|
+
context "with line containing '#{rule_start_string}'" do
|
51
|
+
let (:line) { rule_start_string }
|
52
|
+
|
53
|
+
it "returns true and state should change to :productRules" do
|
54
|
+
result = plug.execute( ctx, line )
|
55
|
+
|
56
|
+
result.should eq true
|
57
|
+
ctx.state.should eq :productRules
|
58
|
+
end
|
59
|
+
|
60
|
+
context "then plugin will accept all lines" do
|
61
|
+
let (:line) { "any old line" }
|
62
|
+
|
63
|
+
it "returns true and state should not change" do
|
64
|
+
result = plug.execute( ctx, line )
|
65
|
+
|
66
|
+
result.should eq true
|
67
|
+
ctx.state.should eq :productRules
|
68
|
+
end # it "returns true and state should not change"
|
69
|
+
|
70
|
+
context "until it receives '#{rule_end_string}'" do
|
71
|
+
let (:line) { rule_end_string }
|
72
|
+
|
73
|
+
it "returns true and state should change to :app" do
|
74
|
+
result = plug.execute( ctx, line )
|
75
|
+
|
76
|
+
result.should eq true
|
77
|
+
ctx.state.should eq :app
|
78
|
+
end # it "returns true and state should change to :app"
|
79
|
+
end # context "until it receives '#{rule_end_string}'"
|
80
|
+
end # context "then plugin will accept all lines"
|
81
|
+
end # context "with line containing '#{rule_start_string}'"
|
82
|
+
end # context "with a current state of :productPpms"
|
83
|
+
end # context "with line containing '#{ppm_start_string}'"
|
84
|
+
end # context "with a current state of :productXml"
|
85
|
+
end # context "with line containing '#{start_product_element('Test')}'"
|
86
|
+
|
87
|
+
context "with line containing anything else" do
|
88
|
+
ctx = create_context( :app )
|
89
|
+
let (:line) { "blahblahblah" }
|
90
|
+
|
91
|
+
it "should return false and not change state" do
|
92
|
+
result = plug.execute( ctx, line )
|
93
|
+
|
94
|
+
result.should eq false
|
95
|
+
ctx.state.should eq :app
|
96
|
+
end
|
97
|
+
end # context "with line containing anything else"
|
98
|
+
end # context "with a current state of :app"
|
99
|
+
end # context "when #execute is called"
|
100
|
+
|
101
|
+
=begin
|
102
|
+
context "with line containing '#{end_string}'" do
|
103
|
+
Given (:line) { "#{end_string}blahblahblah" }
|
104
|
+
|
105
|
+
When (:result) { plug.execute( ctx, line ) }
|
106
|
+
|
107
|
+
Then { result.should eq true }
|
108
|
+
|
109
|
+
context "and context state will change to :app" do
|
110
|
+
Then { ctx.state.should eq :app }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
=end
|
116
|
+
end # describe "Plugin::Product"
|
117
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
def start_decision_element(name)
|
4
|
+
'<Decision GuidelineId="123" GuidelineName="'+name+'"'
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "Plugin::ProductXpath" do
|
8
|
+
|
9
|
+
start_string = '*PRODUCT XPATH xml*'
|
10
|
+
end_string = '<PPXPATH>'
|
11
|
+
|
12
|
+
context "when #execute is called" do
|
13
|
+
|
14
|
+
Given (:context) { create_context }
|
15
|
+
Given (:plug) { ParseDecision::Plugin::ProductXpath.new }
|
16
|
+
|
17
|
+
context "with a current state of :app" do
|
18
|
+
Given (:context) { create_context( :app ) }
|
19
|
+
Given! (:start_state) { context.state }
|
20
|
+
|
21
|
+
context "with line containing '#{start_string}'" do
|
22
|
+
Given (:line) { start_string }
|
23
|
+
|
24
|
+
When (:result) { plug.execute( context, line ) }
|
25
|
+
|
26
|
+
Then { result.should eq true }
|
27
|
+
|
28
|
+
context "and context state will change to :productXpath" do
|
29
|
+
Then { context.state.should eq :productXpath }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with line containing anything else" do
|
34
|
+
Given (:line) { "blahblahblah" }
|
35
|
+
|
36
|
+
When (:result) { plug.execute( context, line ) }
|
37
|
+
|
38
|
+
Then { result.should eq false }
|
39
|
+
|
40
|
+
context "and context state will not change" do
|
41
|
+
Then { context.state.should eq start_state }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with a current state of :productXpath" do
|
47
|
+
Given (:context) { create_context( :productXpath ) }
|
48
|
+
Given! (:start_state) { context.state }
|
49
|
+
|
50
|
+
context "accept any line" do
|
51
|
+
Given (:line) { "anything" }
|
52
|
+
|
53
|
+
When (:result) { plug.execute( context, line ) }
|
54
|
+
|
55
|
+
Then { result.should eq true }
|
56
|
+
|
57
|
+
context "and context state will not change" do
|
58
|
+
Then { context.state.should eq start_state }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "with line containing '#{end_string}'" do
|
63
|
+
Given (:line) { "#{end_string}blahblahblah" }
|
64
|
+
|
65
|
+
When (:result) { plug.execute( context, line ) }
|
66
|
+
|
67
|
+
Then { result.should eq true }
|
68
|
+
|
69
|
+
context "and context state will change to :app" do
|
70
|
+
Then { context.state.should eq :app }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|