theotokos 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.travis.yml +6 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE +20 -0
  4. data/README.md +16 -0
  5. data/Rakefile +30 -0
  6. data/bin/theotokos +20 -0
  7. data/html/Chart.min.js +10 -0
  8. data/html/bootstrap-collapse.js +167 -0
  9. data/html/bootstrap.min.css +9 -0
  10. data/html/jquery.min.js +2 -0
  11. data/lib/assertion/test_assertion.rb +44 -0
  12. data/lib/config/app_config_params.rb +40 -0
  13. data/lib/config/app_logger.rb +48 -0
  14. data/lib/engine/execution_initializer.rb +115 -0
  15. data/lib/engine/executor.rb +128 -0
  16. data/lib/engine/parser.rb +39 -0
  17. data/lib/engine/soap_executor.rb +101 -0
  18. data/lib/helper/app_helper.rb +99 -0
  19. data/lib/helper/hook_helper.rb +49 -0
  20. data/lib/helper/html_helper.rb +633 -0
  21. data/lib/model/execution.rb +16 -0
  22. data/lib/model/test.rb +79 -0
  23. data/lib/model/test_app_result.rb +91 -0
  24. data/lib/model/test_result.rb +22 -0
  25. data/lib/model/test_status.rb +68 -0
  26. data/lib/model/test_suite.rb +80 -0
  27. data/lib/model/test_suite_result.rb +54 -0
  28. data/lib/model/text_operator.rb +34 -0
  29. data/lib/model/ws_config.rb +48 -0
  30. data/lib/net/soap_net.rb +58 -0
  31. data/lib/report/chart_factory.rb +68 -0
  32. data/lib/report/console.rb +94 -0
  33. data/lib/report/default_locale +64 -0
  34. data/lib/report/html.rb +55 -0
  35. data/lib/report/json.rb +19 -0
  36. data/lib/report/reporter.rb +76 -0
  37. data/lib/requires.rb +43 -0
  38. data/lib/theotokos.rb +56 -0
  39. data/lib/version.rb +8 -0
  40. data/test/app-cfg.yml +10 -0
  41. data/test/config/ws-config.yml +8 -0
  42. data/test/unit/assertion/test_test_assertion.rb +72 -0
  43. data/test/unit/config/test_app_config_params.rb +35 -0
  44. data/test/unit/engine/test_execution_initializer.rb +22 -0
  45. data/test/unit/engine/test_parser.rb +35 -0
  46. data/test/unit/model/test_execution.rb +29 -0
  47. data/test/unit/model/test_test.rb +42 -0
  48. data/test/unit/model/test_test_app_result.rb +115 -0
  49. data/test/unit/model/test_test_status.rb +66 -0
  50. data/test/unit/model/test_test_suite.rb +92 -0
  51. data/test/unit/model/test_test_suite_result.rb +77 -0
  52. data/test/unit/model/test_text_operator.rb +40 -0
  53. data/test/unit/model/test_ws_config.rb +31 -0
  54. data/test/unit/report/test_json.rb +42 -0
  55. data/test/ws-test-models/do_something.yml +9 -0
  56. data/test/ws-test-models/project1/look_for_stuff.yml +4 -0
  57. data/theotokos.gemspec +25 -0
  58. metadata +155 -0
@@ -0,0 +1,633 @@
1
+ module Theotokos
2
+ module Helper
3
+
4
+ class << self
5
+
6
+ def build_index_page(app, locale, ws_config, tags)
7
+ builder = Nokogiri::HTML::Builder.new do |doc|
8
+ doc.html {
9
+ doc.head { _index_head locale, doc }
10
+ doc.body { _index_body app, locale, ws_config, tags, doc }
11
+ }
12
+ end
13
+
14
+ builder.to_html
15
+ end
16
+
17
+ def build_suite_page(app, locale, suite)
18
+ builder = Nokogiri::HTML::Builder.new do |doc|
19
+ doc.html {
20
+ doc.head { _suite_head locale, doc }
21
+ doc.body {
22
+ _suite_body app, locale, suite, doc
23
+ doc.script(:src => "js/jquery.min.js", :type => "text/javascript")
24
+ doc.script(:src => "js/bootstrap-collapse.js", :type => "text/javascript")
25
+ }
26
+ }
27
+ end
28
+
29
+ builder.to_html
30
+ end
31
+
32
+ private
33
+ def _index_head(locale, doc)
34
+ doc.meta 'http-equiv' => "Content-Type", :content => "text/html; charset=utf-8"
35
+ doc.title locale['index.page.title']
36
+ doc.link :href => "css/bootstrap.min.css", :media => "screen", :rel => "stylesheet", :type => "text/css"
37
+ doc.script :src => 'js/Chart.min.js'
38
+
39
+ end
40
+
41
+ def _index_body(app, locale, ws_config, tags, doc)
42
+ doc.div(:class => 'container') {
43
+ doc.div(:id => "div_capa", :class => "well", :align => "center") {
44
+ doc.h2 locale['index.title']
45
+ doc.text locale['index.subtitle'].to_s.sub(/<%\s*report_date\s*%>/, app.date_report.strftime(locale['date.pattern']))
46
+ }
47
+ _index_div_result app, locale, doc
48
+ _index_div_introduction app, locale, doc
49
+ _index_div_metadata locale, ws_config, tags, doc
50
+ _index_div_report app, locale, doc
51
+ }
52
+ end
53
+
54
+ def _index_div_result(app, locale, doc)
55
+ if app.success?
56
+ doc.div(:class => "alert alert-success") {
57
+ doc.h3 locale['index.success.message']
58
+ }
59
+ else
60
+ doc.div(:class => "alert alert-error") {
61
+ doc.h3 locale['index.error.message'].to_s.sub(/<%\s*total_failures\s*%>/, app.total_failures.to_s)
62
+ }
63
+ end
64
+ end
65
+
66
+ def _index_div_introduction(app, locale, doc)
67
+ doc.div(:id => "div_introduction") {
68
+ doc.h3 "1 - #{locale['index.overview.title']}"
69
+ doc.text locale['index.overview.summary'].to_s
70
+ .sub(/<%\s*total_test_suites\s*%>/, app.suites.size.to_s)
71
+ .sub(/<%\s*total_test_cases\s*%>/, app.total_test_cases.to_s)
72
+ }
73
+ end
74
+
75
+ def _index_div_metadata(locale, ws_config, tags, doc)
76
+ doc.div(:id => "div_meta-data") {
77
+ doc.h3 "2 - #{locale['index.metadata.title']}"
78
+ doc.h4 "2.1 - #{locale['index.metadata.ws_config.title']}"
79
+ doc.div(:id => "div_ws_config") {
80
+ WsConfig.ws_attributes.each do |p|
81
+ doc.div(:class => "row") {
82
+ doc.div(:class => "span3") {
83
+ doc.text "#{p}:"
84
+ }
85
+ doc.div(:class => "span6") {
86
+ doc.text ws_config.instance_eval p
87
+ }
88
+ }
89
+ end
90
+ }
91
+ doc.h4 "2.2 - #{locale['index.metadata.tags.title']}"
92
+ doc.div(:id => "div_tags") {
93
+ doc.div(:class => 'row') {
94
+ doc.div(:class => 'span9') {
95
+ doc.h5 { doc.text ((tags.nil? || tags.empty?) ? '-' : "<< #{tags.join(', ')} >>") }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ end
101
+
102
+ def _index_div_report(app, locale, doc)
103
+ doc.div(:id => "div_report") {
104
+ doc.h3 "3 - #{locale['index.report.title']}"
105
+ doc.h4 "3.1 - #{locale['index.report.agregated_data.title']}"
106
+ doc.table(:class => "table table-bordered table-hover") {
107
+ doc.theader {
108
+ doc.tr {
109
+ doc.th(:rowspan => "2") { doc.text locale['index.test_suites.label'] }
110
+ doc.th(:colspan => "3") { doc.text locale['index.test_cases.label'] }
111
+ }
112
+ doc.tr {
113
+ doc.th locale['index.success.label']
114
+ doc.th locale['index.failures.label']
115
+ doc.th locale['index.total.label']
116
+ }
117
+ }
118
+ doc.tbody {
119
+ app.suites.each do |suite|
120
+ doc.tr {
121
+ doc.td {
122
+ doc.a(:href => "#{suite.model.name}.html") { doc.text suite.model.name }
123
+ }
124
+ doc.td {
125
+ doc.text suite.total_success
126
+ }
127
+ doc.td {
128
+ doc.text suite.total_failures
129
+ }
130
+ doc.td {
131
+ doc.text suite.test_results.size
132
+ }
133
+ }
134
+ end
135
+ }
136
+ doc.tfooter {
137
+ doc.tr {
138
+ doc.th app.total_suites
139
+ doc.th app.total_success
140
+ doc.th app.total_failures
141
+ doc.th app.total_test_cases
142
+ }
143
+ }
144
+ }
145
+
146
+ doc.h4 "3.2 - #{locale['index.statistics.title']}"
147
+ doc.h5 "3.2.1 - #{locale['index.statistics.success_failures.title']}"
148
+ doc.canvas(:id => "success_failures_chart", :width => "250", :height => "250")
149
+ doc.script {
150
+ doc.text ChartFactory.success_failure_chart(:id => 'success_failures_chart', :total_success => app.total_success, :total_failures => app.total_failures)
151
+ }
152
+
153
+ tags_stats = app.tags_stats
154
+ doc.h5 "3.2.2 - #{locale['index.statistics.total_tags.title']}"
155
+ doc.canvas(:id => "total_tags_chart", :width => "#{tags_stats.keys.size * 100}", :height => "300")
156
+ doc.script {
157
+ doc.text ChartFactory.totals_tags_chart(:id => 'total_tags_chart', :stats => tags_stats)
158
+ }
159
+
160
+ tags_stats = app.tags_stats
161
+ doc.h5 "3.2.3 - #{locale['index.statistics.stats_tags.title']}"
162
+ doc.canvas(:id => "stats_tags_chart", :width => "#{tags_stats.keys.size * 100}", :height => "300")
163
+ doc.script {
164
+ doc.text ChartFactory.stats_tags_chart(:id => 'stats_tags_chart', :stats => tags_stats)
165
+ }
166
+ }
167
+ end
168
+
169
+ def _suite_head(locale, doc)
170
+ doc.meta 'http-equiv' => "Content-Type", :content => "text/html; charset=utf-8"
171
+ doc.title locale['suite.page.title']
172
+ doc.link :href => "css/bootstrap.min.css", :media => "screen", :rel => "stylesheet", :type => "text/css"
173
+ end
174
+
175
+ def _suite_body(app, locale, suite, doc)
176
+ doc.div(:class => "container") {
177
+ doc.div(:id => "div_capa", :class => "well", :align => "center") {
178
+ doc.h2 locale['suite.title']
179
+ doc.text locale['suite.subtitle'].to_s.sub(/<%\s*report_date\s*%>/, app.date_report.strftime(locale['date.pattern']))
180
+ }
181
+
182
+ _suite_div_introduction locale, suite, doc
183
+ _suite_div_overview locale, suite, doc
184
+ _suite_div_tests locale, suite, doc
185
+
186
+ doc.a(:href => "index.html", :class => "btn btn-primary btn-large") { doc.text 'Voltar' }
187
+ }
188
+ end
189
+
190
+ def _suite_div_introduction(locale, suite, doc)
191
+ doc.div(:id => "div_introducao") {
192
+ doc.div(:class => "alert alert-#{((suite.success?) ? 'success' : 'error')}") {
193
+ doc.h3 locale['suite.source.label'].to_s
194
+ .sub(/<%\s*source\s*%>/, suite.model.source.sub(/^#{Regexp.new(ENV['ws.test.models.path'])}\/?/, ''))
195
+ }
196
+
197
+ doc.div(:class => "row") {
198
+ doc.div(:class => "span3") {
199
+ doc.text locale['suite.wsdl.label']
200
+ }
201
+ doc.div(:class => "span9") {
202
+ doc.text suite.model.wsdl
203
+ }
204
+ }
205
+
206
+ doc.div(:class => "row") {
207
+ doc.div(:class => "span3") {
208
+ doc.text locale['suite.service.label']
209
+ }
210
+ doc.div(:class => "span9") {
211
+ doc.text suite.model.service
212
+ }
213
+ }
214
+
215
+ doc.div(:class => "row") {
216
+ doc.div(:class => "span3") {
217
+ doc.text locale['suite.description.label']
218
+ }
219
+ doc.div(:class => "span9") {
220
+ doc.text suite.model.description
221
+ }
222
+ }
223
+
224
+ doc.div(:class => "row") {
225
+ doc.div(:class => "span3") {
226
+ doc.text locale['suite.tags.label']
227
+ }
228
+ doc.div(:class => "span9") {
229
+ tags = (suite.model.tags.nil? || suite.model.tags.empty?) ? '-' : suite.model.tags.join(', ')
230
+ doc.text tags
231
+ }
232
+ }
233
+ }
234
+ end
235
+
236
+ def _suite_div_overview(locale, suite, doc)
237
+ doc.div(:id => "div_overview") {
238
+ doc.h3 locale['suite.overview.title']
239
+ doc.div(:class => "row") {
240
+ doc.div(:class => 'span3') {
241
+ doc.text locale['suite.test_cases.label']
242
+ }
243
+ doc.div(:class => 'span9') {
244
+ doc.text suite.test_results.size
245
+ }
246
+ }
247
+
248
+ doc.div(:class => "row") {
249
+ doc.div(:class => "span3") {
250
+ doc.text locale['suite.success.label']
251
+ }
252
+ doc.div(:class => "span9") {
253
+ doc.text suite.total_success
254
+ }
255
+ }
256
+
257
+ doc.div(:class => "row") {
258
+ doc.div(:class => "span3") {
259
+ doc.text locale['suite.failures.label']
260
+ }
261
+ doc.div(:class => "span9") {
262
+ doc.text suite.total_failures
263
+ }
264
+ }
265
+ }
266
+ end
267
+
268
+ def _suite_div_tests(locale, suite, doc)
269
+ doc.div(:id => "div_tests") {
270
+ doc.h3 locale['suite.test_cases.title']
271
+ count = 0
272
+ suite.test_results.each do |test|
273
+ doc.div {
274
+ doc.div(:class => "row") {
275
+ css_class = (((test.status.nil?) ? 'info' : ((test.status.success?) ? 'success' : 'error')))
276
+ doc.div(:class => "alert alert-#{css_class}") {
277
+ text = "#{count += 1} - #{locale['suite.test.name.value'].to_s.sub(/<%\s*name\s*%>/, '#'+test.name.to_s)}"
278
+ doc.text text
279
+ }
280
+ }
281
+
282
+ doc.div(:class => "row") {
283
+ doc.div(:class => "span3") {
284
+ doc.text locale['suite.test.name.label']
285
+ }
286
+ doc.div(:class => "span9") {
287
+ doc.text test.name
288
+ }
289
+ }
290
+
291
+ doc.div(:class => "row") {
292
+ doc.div(:class => "span3") {
293
+ doc.text locale['suite.test.description.label']
294
+ }
295
+ doc.div(:class => "span9") {
296
+ doc.text test.description
297
+ }
298
+ }
299
+
300
+ doc.div(:class => "row") {
301
+ doc.div(:class => "span3") {
302
+ doc.text locale['suite.test.tags.label']
303
+ }
304
+ doc.div(:class => "span9") {
305
+ txt = ((test.tags.nil? || test.tags.empty?) ? '-' : test.tags.join(', '))
306
+ doc.text txt
307
+ }
308
+ }
309
+
310
+ doc.div(:class => "row") {
311
+ doc.div(:class => "span3") {
312
+ doc.text locale['suite.test.status.label']
313
+ }
314
+ doc.div(:class => "span9") {
315
+ if test.status.nil?
316
+ doc.text locale['suite.test.status.skipped']
317
+ else
318
+ doc.text ((test.status.success?) ? locale['suite.test.status.passed'] : locale['suite.test.status.failed'])
319
+ end
320
+ }
321
+ }
322
+ }
323
+
324
+ _suite_div_error locale, test, doc if (!test.status.nil? && test.status.error? && !test.error.nil?)
325
+ _suite_div_expectations locale, count, test, doc
326
+ _suite_div_expected_output locale, count, test, doc
327
+ end
328
+ }
329
+ end
330
+
331
+ def _suite_div_error(locale, test, doc)
332
+ doc.h4 locale['suite.test.error.title']
333
+ doc.div(:class => "row") {
334
+ doc.div(:class => "span3") {
335
+ doc.text locale['suite.test.error.message.label']
336
+ }
337
+ doc.div(:class => "span9") {
338
+ doc.text test.error[:message]
339
+ }
340
+ }
341
+
342
+ doc.div(:class => "row") {
343
+ doc.div(:class => "span3") {
344
+ doc.text locale['suite.test.error.backtrace.label']
345
+ }
346
+ doc.div(:class => "span9") {
347
+ doc.pre {
348
+ doc.text _backtrace test.error[:backtrace]
349
+ }
350
+ }
351
+ }
352
+ end
353
+
354
+ def _suite_div_expectations(locale, index, test, doc)
355
+ doc.h4 locale['suite.test.test_expectation.title']
356
+ _suite_div_file_expectation locale, index, test, doc
357
+ _suite_div_text_expectations locale, index, test, doc
358
+ end
359
+
360
+ def _suite_div_file_expectation(locale, index, test, doc)
361
+ if test.test_expectation && test.test_expectation['file']
362
+ doc.div(:class => "row") {
363
+ doc.div(:class => "span3") {
364
+ doc.text locale['suite.test.test_expectation.file.label']
365
+ }
366
+ doc.div(:class => "span9") {
367
+ doc.div(:class => "accordion", :id => "accordion_expectation_file_#{index}") {
368
+ doc.div(:class => "accordion-group") {
369
+ doc.div(:class => "accordion-heading") {
370
+ doc.a(:class => "accordion-toggle", 'data-toggle' => "collapse", 'data-parent' => "#accordion_expectation_file_#{index}", :href => "#collapse_expectation_file_#{index}") {
371
+ doc.text "#{locale['suite.data.expand']} / #{locale['suite.data.collapse']}"
372
+ }
373
+ }
374
+ doc.div(:id => "collapse_expectation_file_#{index}", :class => "accordion-body collapse") {
375
+ doc.div(:class => "accordion-inner") {
376
+ doc.pre {
377
+ doc.text _expected_file(test.test_expectation['file'])
378
+ }
379
+ }
380
+ }
381
+ }
382
+ }
383
+ }
384
+ }
385
+
386
+ doc.div(:class => "row") {
387
+ doc.div(:class => "span3") {
388
+ doc.text locale['suite.test.test_expectation.file.status.label']
389
+ }
390
+ doc.div(:class => "span9") {
391
+ doc.text test.status.test_file_status ? locale['suite.test.status.passed'].to_s : locale['suite.test.status.failed']
392
+ }
393
+ }
394
+
395
+ doc.br
396
+ end
397
+ end
398
+
399
+ def _suite_div_text_expectations(locale, index, test, doc)
400
+ if test.test_expectation && test.test_expectation['text']
401
+ _suite_div_text_expectations_equals locale, index, test, doc
402
+ _suite_div_text_expectations_contains locale, index, test, doc
403
+ _suite_div_text_expectations_not_contains locale, index, test, doc
404
+ _suite_div_text_expectations_regex locale, index, test, doc
405
+ end
406
+ end
407
+
408
+ def _suite_div_text_expectations_equals(locale, index, test, doc)
409
+ return unless test.test_expectation['text']['equals']
410
+
411
+ doc.div(:class => "row") {
412
+ doc.div(:class => "span3") {
413
+ doc.text locale['suite.test.test_expectation.text_equals.label']
414
+ }
415
+ doc.div(:class => "span9") {
416
+ doc.div(:class => "accordion", :id => "accordion_expectation_text_equals_#{index}") {
417
+ doc.div(:class => "accordion-group") {
418
+ doc.div(:class => "accordion-heading") {
419
+ doc.a(:class => "accordion-toggle", 'data-toggle' => "collapse", 'data-parent' => "#accordion_expectation_text_equals_#{index}", :href => "#collapse_expectation_text_equals_#{index}") {
420
+ doc.text "#{locale['suite.data.expand']} / #{locale['suite.data.collapse']}"
421
+ }
422
+ }
423
+ doc.div(:id => "collapse_expectation_text_equals_#{index}", :class => "accordion-body collapse") {
424
+ doc.div(:class => "accordion-inner") {
425
+ doc.pre {
426
+ doc.text _format_xml(test.test_expectation['text']['equals'])
427
+ }
428
+ }
429
+ }
430
+ }
431
+ }
432
+ }
433
+ }
434
+
435
+ doc.div(:class => "row") {
436
+ doc.div(:class => "span3") {
437
+ doc.text locale['suite.test.status.label']
438
+ }
439
+ doc.div(:class => "span9") {
440
+ doc.text _format_test_status(locale, test)
441
+ }
442
+ }
443
+
444
+ doc.br
445
+ end
446
+
447
+ def _suite_div_text_expectations_contains(locale, index, test, doc)
448
+ return unless test.test_expectation['text']['contains']
449
+
450
+ doc.div(:class => "row") {
451
+ doc.div(:class => "span3") {
452
+ doc.text locale['suite.test.test_expectation.text_contains.label']
453
+ }
454
+ doc.div(:class => "span9") {
455
+ doc.div(:class => "accordion", :id => "accordion_expectation_text_contains_#{index}") {
456
+ doc.div(:class => "accordion-group") {
457
+ doc.div(:class => "accordion-heading") {
458
+ doc.a(:class => "accordion-toggle", 'data-toggle' => "collapse", 'data-parent' => "#accordion_expectation_text_contains_#{index}", :href => "#collapse_expectation_text_contains_#{index}") {
459
+ doc.text "#{locale['suite.data.expand']} / #{locale['suite.data.collapse']}"
460
+ }
461
+ }
462
+ doc.div(:id => "collapse_expectation_text_contains_#{index}", :class => "accordion-body collapse") {
463
+ doc.div(:class => "accordion-inner") {
464
+ doc.pre {
465
+ doc.text test.test_expectation['text']['contains']
466
+ }
467
+ }
468
+ }
469
+ }
470
+ }
471
+ }
472
+ }
473
+
474
+ doc.div(:class => "row") {
475
+ doc.div(:class => "span3") {
476
+ doc.text locale['suite.test.test_expectation.text_contains.status.label']
477
+ }
478
+ doc.div(:class => "span9") {
479
+ doc.text _format_test_status(locale, test)
480
+ }
481
+ }
482
+
483
+ doc.br
484
+ end
485
+
486
+ def _suite_div_text_expectations_not_contains(locale, index, test, doc)
487
+ return unless test.test_expectation['text']['not_contains']
488
+
489
+ doc.div(:class => "row") {
490
+ doc.div(:class => "span3") {
491
+ doc.text locale['suite.test.test_expectation.text_not_contains.label']
492
+ }
493
+ doc.div(:class => "span9") {
494
+ doc.div(:class => "accordion", :id => "accordion_expectation_text_not_contains_#{index}") {
495
+ doc.div(:class => "accordion-group") {
496
+ doc.div(:class => "accordion-heading") {
497
+ doc.a(:class => "accordion-toggle", 'data-toggle' => "collapse", 'data-parent' => "#accordion_expectation_text_not_contains_#{index}", :href => "#collapse_expectation_text_not_contains_#{index}") {
498
+ doc.text "#{locale['suite.data.expand']} / #{locale['suite.data.collapse']}"
499
+ }
500
+ }
501
+ doc.div(:id => "collapse_expectation_text_not_contains_#{index}", :class => "accordion-body collapse") {
502
+ doc.div(:class => "accordion-inner") {
503
+ doc.pre {
504
+ doc.text test.test_expectation['text']['not_contains']
505
+ }
506
+ }
507
+ }
508
+ }
509
+ }
510
+ }
511
+ }
512
+
513
+ doc.div(:class => "row") {
514
+ doc.div(:class => "span3") {
515
+ doc.text locale['suite.test.test_expectation.text_not_contains.status.label']
516
+ }
517
+ doc.div(:class => "span9") {
518
+ doc.text _format_test_status(locale, test)
519
+ }
520
+ }
521
+
522
+ doc.br
523
+ end
524
+
525
+ def _suite_div_text_expectations_regex(locale, index, test, doc)
526
+ return unless test.test_expectation['text']['regex']
527
+
528
+ doc.div(:class => "row") {
529
+ doc.div(:class => "span3") {
530
+ doc.text locale['suite.test.test_expectation.text_regex.label']
531
+ }
532
+ doc.div(:class => "span9") {
533
+ doc.div(:class => "accordion", :id => "accordion_expectation_text_regex_#{index}") {
534
+ doc.div(:class => "accordion-group") {
535
+ doc.div(:class => "accordion-heading") {
536
+ doc.a(:class => "accordion-toggle", 'data-toggle' => "collapse", 'data-parent' => "#accordion_expectation_text_regex_#{index}", :href => "#collapse_expectation_text_regex_#{index}") {
537
+ doc.text "#{locale['suite.data.expand']} / #{locale['suite.data.collapse']}"
538
+ }
539
+ }
540
+ doc.div(:id => "collapse_expectation_text_regex_#{index}", :class => "accordion-body collapse") {
541
+ doc.div(:class => "accordion-inner") {
542
+ doc.pre {
543
+ doc.text test.test_expectation['text']['regex']
544
+ }
545
+ }
546
+ }
547
+ }
548
+ }
549
+ }
550
+ }
551
+
552
+ doc.div(:class => "row") {
553
+ doc.div(:class => "span3") {
554
+ doc.text locale['suite.test.test_expectation.text_regex.status.label']
555
+ }
556
+ doc.div(:class => "span9") {
557
+ doc.text _format_test_status(locale, test)
558
+ }
559
+ }
560
+
561
+ doc.br
562
+ end
563
+
564
+ def _suite_div_expected_output(locale, index, test, doc)
565
+ if test.test_actual
566
+ doc.h4 locale['sutie.test.test_output.title']
567
+ doc.div(:class => "row") {
568
+ doc.div(:class => "span3") { doc.text locale['sutie.test.test_output.response.label'] }
569
+
570
+ doc.div(:class => "span9") {
571
+ doc.div(:class => "accordion", :id => "accordion_output_test_#{index}") {
572
+ doc.div(:class => "accordion-group") {
573
+ doc.div(:class => "accordion-heading") {
574
+ doc.a(:class => "accordion-toggle", 'data-toggle' => "collapse", 'data-parent' => "#accordion_output_test_#{index}", :href => "#collapse_output_test_#{index}") {
575
+ doc.text "#{locale['suite.data.expand']} / #{locale['suite.data.collapse']}"
576
+ }
577
+ }
578
+ doc.div(:id => "collapse_output_test_#{index}", :class => "accordion-body collapse") {
579
+ doc.div(:class => "accordion-inner") {
580
+ doc.pre {
581
+ doc.text _actual_file test.test_actual
582
+ }
583
+ }
584
+ }
585
+ }
586
+ }
587
+ }
588
+ }
589
+ end
590
+ end
591
+
592
+ def _expected_file(expectation)
593
+ return if expectation.nil?
594
+ s = expectation.sub(/^#{Regexp.new(ENV['ws.test.output.files.path'])}/, '')
595
+ file = "#{ENV['ws.test.output.files.path']}/#{s}"
596
+
597
+ return unless File.exist? file
598
+
599
+ File.read(file)
600
+ end
601
+
602
+ def _actual_file(file)
603
+ return unless File.exist? file
604
+ File.read file
605
+ end
606
+
607
+ def _format_xml(text)
608
+ text = '' unless text
609
+ Nokogiri::XML(text).to_xml
610
+ end
611
+
612
+ def _backtrace(backtrace)
613
+ if backtrace.instance_of? Array
614
+ backtrace.join("\n")
615
+ else
616
+ backtrace.to_s
617
+ end
618
+ end
619
+
620
+ def _format_test_status(locale, test)
621
+ if test.skip
622
+ locale['suite.test.status.skipped']
623
+ elsif test.status.test_text_status.nil?
624
+ locale['suite.test.status.skipped']
625
+ else
626
+ ((test.status.test_text_status[:contains])) ? locale['suite.test.status.passed'] : locale['suite.test.status.failed']
627
+ end
628
+ end
629
+
630
+ end
631
+
632
+ end
633
+ end
@@ -0,0 +1,16 @@
1
+ module Theotokos
2
+ module Model
3
+
4
+ class Execution
5
+
6
+ def initialize
7
+ @report_formats = [:console]
8
+ yield self if block_given?
9
+ end
10
+
11
+ attr_accessor :test_files, :test_index, :report_formats, :tags, :execution_path, :internationalization
12
+
13
+ end
14
+
15
+ end
16
+ end