cornucopia 0.1.12

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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +51 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +16 -0
  6. data/LICENSE.TXT +22 -0
  7. data/README.md +341 -0
  8. data/Rakefile +18 -0
  9. data/cornucopia.gemspec +39 -0
  10. data/lib/cornucopia.rb +18 -0
  11. data/lib/cornucopia/capybara/finder_diagnostics.rb +536 -0
  12. data/lib/cornucopia/capybara/finder_extensions.rb +89 -0
  13. data/lib/cornucopia/capybara/install_finder_extensions.rb +105 -0
  14. data/lib/cornucopia/capybara/install_matcher_extensions.rb +39 -0
  15. data/lib/cornucopia/capybara/matcher_extensions.rb +83 -0
  16. data/lib/cornucopia/capybara/page_diagnostics.rb +228 -0
  17. data/lib/cornucopia/cucumber_hooks.rb +38 -0
  18. data/lib/cornucopia/factory_girl/dynamic_association.rb +14 -0
  19. data/lib/cornucopia/rspec_hooks.rb +37 -0
  20. data/lib/cornucopia/site_prism/element_extensions.rb +273 -0
  21. data/lib/cornucopia/site_prism/install_element_extensions.rb +23 -0
  22. data/lib/cornucopia/site_prism/page_application.rb +126 -0
  23. data/lib/cornucopia/source_files/collapse.gif +0 -0
  24. data/lib/cornucopia/source_files/cornucopia.css +162 -0
  25. data/lib/cornucopia/source_files/expand.gif +0 -0
  26. data/lib/cornucopia/source_files/index_base.html +10 -0
  27. data/lib/cornucopia/source_files/index_contents.html +2 -0
  28. data/lib/cornucopia/source_files/more_info.js +87 -0
  29. data/lib/cornucopia/source_files/report_base.html +10 -0
  30. data/lib/cornucopia/source_files/report_contents.html +3 -0
  31. data/lib/cornucopia/spinach_hooks.rb +51 -0
  32. data/lib/cornucopia/util/configuration.rb +493 -0
  33. data/lib/cornucopia/util/configured_report.rb +520 -0
  34. data/lib/cornucopia/util/file_asset.rb +46 -0
  35. data/lib/cornucopia/util/generic_settings.rb +37 -0
  36. data/lib/cornucopia/util/log_capture.rb +97 -0
  37. data/lib/cornucopia/util/pretty_formatter.rb +580 -0
  38. data/lib/cornucopia/util/report_builder.rb +474 -0
  39. data/lib/cornucopia/util/report_formatters.rb +11 -0
  40. data/lib/cornucopia/util/report_table.rb +195 -0
  41. data/lib/cornucopia/version.rb +3 -0
  42. data/lib/tasks/cornucopia_tasks.rake +4 -0
  43. data/spec/dummy/README.rdoc +28 -0
  44. data/spec/dummy/Rakefile +6 -0
  45. data/spec/dummy/app/assets/images/.keep +0 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  47. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  48. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  49. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  50. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  51. data/spec/dummy/app/mailers/.keep +0 -0
  52. data/spec/dummy/app/models/.keep +0 -0
  53. data/spec/dummy/app/models/concerns/.keep +0 -0
  54. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  55. data/spec/dummy/bin/bundle +3 -0
  56. data/spec/dummy/bin/rails +4 -0
  57. data/spec/dummy/bin/rake +4 -0
  58. data/spec/dummy/config.ru +4 -0
  59. data/spec/dummy/config/application.rb +27 -0
  60. data/spec/dummy/config/boot.rb +5 -0
  61. data/spec/dummy/config/cucumber.yml +8 -0
  62. data/spec/dummy/config/database.yml +37 -0
  63. data/spec/dummy/config/environment.rb +5 -0
  64. data/spec/dummy/config/environments/development.rb +29 -0
  65. data/spec/dummy/config/environments/production.rb +80 -0
  66. data/spec/dummy/config/environments/test.rb +36 -0
  67. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  68. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/spec/dummy/config/initializers/inflections.rb +16 -0
  70. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  71. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  72. data/spec/dummy/config/initializers/session_store.rb +3 -0
  73. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  74. data/spec/dummy/config/locales/en.yml +23 -0
  75. data/spec/dummy/config/routes.rb +56 -0
  76. data/spec/dummy/db/schema.rb +16 -0
  77. data/spec/dummy/features/support/env.rb +66 -0
  78. data/spec/dummy/lib/assets/.keep +0 -0
  79. data/spec/dummy/lib/tasks/cucumber.rake +65 -0
  80. data/spec/dummy/public/404.html +58 -0
  81. data/spec/dummy/public/422.html +58 -0
  82. data/spec/dummy/public/500.html +57 -0
  83. data/spec/dummy/public/favicon.ico +0 -0
  84. data/spec/dummy/script/cucumber +10 -0
  85. data/spec/fixtures/sample_page.html +150 -0
  86. data/spec/lib/capybara/finder_diagnostics_spec.rb +517 -0
  87. data/spec/lib/capybara/finder_extensions_spec.rb +328 -0
  88. data/spec/lib/capybara/page_diagnostics_spec.rb +277 -0
  89. data/spec/lib/site_prism/element_extensions_spec.rb +290 -0
  90. data/spec/lib/site_prism/page_application_spec.rb +81 -0
  91. data/spec/lib/util/configuration_spec.rb +254 -0
  92. data/spec/lib/util/configured_report_spec.rb +1058 -0
  93. data/spec/lib/util/file_asset_spec.rb +86 -0
  94. data/spec/lib/util/generic_settings_spec.rb +48 -0
  95. data/spec/lib/util/log_capture_spec.rb +151 -0
  96. data/spec/lib/util/pretty_formatter_spec.rb +694 -0
  97. data/spec/lib/util/report_builder_spec.rb +983 -0
  98. data/spec/lib/util/report_formatters_spec.rb +13 -0
  99. data/spec/lib/util/report_table_exception_spec.rb +21 -0
  100. data/spec/lib/util/report_table_spec.rb +319 -0
  101. data/spec/pages/cornucopia_report_app.rb +10 -0
  102. data/spec/pages/google/email_page.rb +22 -0
  103. data/spec/pages/google/login_page.rb +25 -0
  104. data/spec/rails_helper.rb +43 -0
  105. data/spec/sample_report.rb +45 -0
  106. data/spec/spec_helper.rb +81 -0
  107. metadata +410 -0
@@ -0,0 +1,983 @@
1
+ require 'spec_helper'
2
+ require ::File.expand_path("../../../lib/cornucopia/util/report_builder", File.dirname(__FILE__))
3
+
4
+ describe Cornucopia::Util::ReportBuilder do
5
+ let(:current_report) { Cornucopia::Util::ReportBuilder.new_report }
6
+ let(:custom_report) { Cornucopia::Util::ReportBuilder.new_report("cool_report", "diag_reports") }
7
+
8
+ report_variation_settings = [
9
+ { report: :current_report,
10
+ index_folder: "cornucopia_report",
11
+ sub_folder: "cornucopia_report" },
12
+ { report: :custom_report,
13
+ index_folder: "diag_reports",
14
+ sub_folder: "cool_report" }
15
+ ]
16
+
17
+ # Make sure that all tests start clean and get cleaned up afterwards...
18
+ around(:each) do |example|
19
+ expect(File.directory?(Rails.root.join("cornucopia_report/"))).to be_falsey
20
+ expect(File.directory?(Rails.root.join("diag_reports/"))).to be_falsey
21
+
22
+ begin
23
+ example.run
24
+ ensure
25
+ if (Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report"))
26
+ Cornucopia::Util::ReportBuilder.current_report.close
27
+ end
28
+
29
+ FileUtils.rm_rf Rails.root.join("cornucopia_report/")
30
+ FileUtils.rm_rf Rails.root.join("diag_reports/")
31
+ end
32
+ end
33
+
34
+ describe "#on_close" do
35
+ around(:each) do |example|
36
+ num_close_calls = Cornucopia::Util::ReportBuilder.class_variable_get("@@on_close_blocks").length
37
+
38
+ example.run
39
+
40
+ while num_close_calls != Cornucopia::Util::ReportBuilder.class_variable_get("@@on_close_blocks").length
41
+ Cornucopia::Util::ReportBuilder.class_variable_get("@@on_close_blocks").pop
42
+ end
43
+ end
44
+
45
+ it "calls each on_close block" do
46
+ report_results = []
47
+
48
+ Cornucopia::Util::ReportBuilder.on_close do
49
+ report_results << 1
50
+ end
51
+
52
+ Cornucopia::Util::ReportBuilder.on_close do
53
+ report_results << 2
54
+ end
55
+
56
+ Cornucopia::Util::ReportBuilder.on_close do
57
+ report_results << 3
58
+ end
59
+
60
+ Cornucopia::Util::ReportBuilder.current_report.close
61
+
62
+ expect(report_results).to be == [1, 2, 3]
63
+ expect(Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report")).not_to be
64
+ end
65
+
66
+ it "calls each on_close block even if an exception is thrown" do
67
+ report_results = []
68
+
69
+ Cornucopia::Util::ReportBuilder.on_close do
70
+ report_results << 1
71
+ raise "1"
72
+ end
73
+
74
+ Cornucopia::Util::ReportBuilder.on_close do
75
+ report_results << 2
76
+ raise "2"
77
+ end
78
+
79
+ Cornucopia::Util::ReportBuilder.on_close do
80
+ report_results << 3
81
+ raise "3"
82
+ end
83
+
84
+ expect do
85
+ Cornucopia::Util::ReportBuilder.current_report.close
86
+ end.to raise_exception
87
+
88
+ expect(report_results).to be == [1, 2, 3]
89
+ expect(Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report")).not_to be
90
+ end
91
+ end
92
+
93
+ describe "#escape_string" do
94
+ it "makes a string html_safe" do
95
+ expect(Cornucopia::Util::ReportBuilder.escape_string("test_value")).to be_html_safe
96
+ end
97
+
98
+ it "escapes html characters" do
99
+ expect(Cornucopia::Util::ReportBuilder.escape_string("<test_value>")).to be == "&lt;test_value&gt;"
100
+ end
101
+ end
102
+
103
+ describe "#format_code_refs" do
104
+ it "does not alter a string without refs" do
105
+ sample_string = "This is a sample string /fred/george.html:45"
106
+
107
+ expect(Cornucopia::Util::ReportBuilder.format_code_refs(sample_string)).to be == sample_string
108
+ end
109
+
110
+ it "ensures that the string is html_safe" do
111
+ sample_string = "This is a sample string /fred/george.html:45"
112
+
113
+ expect(Cornucopia::Util::ReportBuilder.format_code_refs(sample_string)).to be_html_safe
114
+ end
115
+ end
116
+
117
+ describe "#root_folder" do
118
+ it "returns the rails root if it is available" do
119
+ expect(Cornucopia::Util::ReportBuilder.root_folder).to be == Rails.root
120
+ end
121
+
122
+ it "returns the pwd if Rails is not available" do
123
+ expect(Object).to receive(:const_defined?).with("Rails").and_return false
124
+
125
+ expect(Cornucopia::Util::ReportBuilder.root_folder).to be == FileUtils.pwd
126
+ end
127
+ end
128
+
129
+ describe "#pretty_array" do
130
+ let(:array_values) { [
131
+ "Turner &amp; Hooch",
132
+ "Barney Rubble",
133
+ "Harvey"
134
+ ] }
135
+
136
+ it "ignores a non-array value" do
137
+ expect(Cornucopia::Util::ReportBuilder.pretty_array("a string")).to be == "a string"
138
+ end
139
+
140
+ it "calls #pretty_format for a non-array value" do
141
+ expect(Cornucopia::Util::ReportBuilder).to receive(:pretty_format).once.and_call_original
142
+
143
+ expect(Cornucopia::Util::ReportBuilder.pretty_array("a string")).to be_html_safe
144
+ end
145
+
146
+ it "calls #pretty_format for each element in the array" do
147
+ expect(Cornucopia::Util::ReportBuilder).to receive(:pretty_format).exactly(3).and_call_original
148
+
149
+ formatted_code = Cornucopia::Util::ReportBuilder.pretty_array(array_values)
150
+
151
+ expect(formatted_code).to be_html_safe
152
+ expect(formatted_code).to be == "Turner &amp;amp; Hooch\nBarney Rubble\nHarvey"
153
+ end
154
+
155
+ it "calls #pretty_format on a sub-array after it is converted to a string" do
156
+ expect(Cornucopia::Util::ReportBuilder).to receive(:pretty_format).exactly(4).and_call_original
157
+ array_values << [1, 2, 3]
158
+
159
+ formatted_code = Cornucopia::Util::ReportBuilder.pretty_array(array_values)
160
+
161
+ expect(formatted_code).to be_html_safe
162
+ expect(formatted_code).to be == "Turner &amp;amp; Hooch\nBarney Rubble\nHarvey\n[1, 2, 3]"
163
+ end
164
+ end
165
+
166
+ describe "#pretty_object" do
167
+ around(:each) do |example|
168
+ orig_timeout = Cornucopia::Util::Configuration.print_timeout_min
169
+
170
+ begin
171
+ Cornucopia::Util::Configuration.print_timeout_min = 2
172
+ example.run
173
+ ensure
174
+ Cornucopia::Util::Configuration.print_timeout_min = orig_timeout
175
+ end
176
+ end
177
+
178
+ it "returns a string as-is" do
179
+ test_object = "a string"
180
+
181
+ expect(test_object).not_to receive(:pretty_inspect)
182
+ expect(test_object).not_to receive(:to_s)
183
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
184
+
185
+ Cornucopia::Util::ReportBuilder.pretty_object(test_object)
186
+ end
187
+
188
+ it "calls pretty_inspect on most objects" do
189
+ test_object = { a: "b" }
190
+
191
+ expect(test_object).to receive(:pretty_inspect).and_call_original
192
+ expect(test_object).not_to receive(:to_s)
193
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
194
+
195
+ Cornucopia::Util::ReportBuilder.pretty_object(test_object)
196
+ end
197
+
198
+ it "times out after a long time" do
199
+ test_object = { a: "b" }
200
+
201
+ expect(test_object).to receive(:pretty_inspect) { sleep 60 }
202
+ expect(test_object).to receive(:to_s).and_call_original
203
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
204
+
205
+ expect(Cornucopia::Util::ReportBuilder.pretty_object(test_object)).to be == "{:a=>\"b\"}"
206
+ end
207
+
208
+ it "times out after a long time with t_s too" do
209
+ test_object = { a: "b" }
210
+
211
+ expect(test_object).to receive(:pretty_inspect) { sleep 60 }
212
+ expect(test_object).to receive(:to_s) { sleep 60 }
213
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
214
+
215
+ expect(Cornucopia::Util::ReportBuilder.pretty_object(test_object)).to be == "Timed out rendering"
216
+ end
217
+
218
+ it "calls to_s after an exception is raised" do
219
+ test_object = { a: "b" }
220
+
221
+ expect(test_object).to receive(:pretty_inspect) { raise Exception.new("This is an error") }
222
+ expect(test_object).to receive(:to_s).and_call_original
223
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
224
+
225
+ expect(Cornucopia::Util::ReportBuilder.pretty_object(test_object)).to be == "{:a=>\"b\"}"
226
+ end
227
+
228
+ it "times out after an exception is raised" do
229
+ test_object = { a: "b" }
230
+
231
+ expect(test_object).to receive(:pretty_inspect) { raise Exception.new("This is an error") }
232
+ expect(test_object).to receive(:to_s) { sleep 60 }
233
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
234
+
235
+ expect(Cornucopia::Util::ReportBuilder.pretty_object(test_object)).to be == "Timed out rendering"
236
+ end
237
+
238
+ it "returns an array by formatting it" do
239
+ test_object = [:a, "b"]
240
+
241
+ expect(test_object).not_to receive(:pretty_inspect)
242
+ expect(test_object).not_to receive(:to_s)
243
+ expect(Cornucopia::Util::ReportBuilder).to receive(:pretty_array).and_call_original
244
+
245
+ Cornucopia::Util::ReportBuilder.pretty_object(test_object)
246
+ end
247
+
248
+ it "returns an object that cannot be inspected as a string" do
249
+ test_object = { a: "b" }
250
+
251
+ expect(test_object).to receive(:respond_to?).and_return false
252
+
253
+ expect(test_object).not_to receive(:pretty_inspect)
254
+ expect(test_object).to receive(:to_s).and_call_original
255
+ expect(Cornucopia::Util::ReportBuilder).not_to receive(:pretty_array)
256
+
257
+ Cornucopia::Util::ReportBuilder.pretty_object(test_object)
258
+ end
259
+ end
260
+
261
+ it "should create a new report" do
262
+ orig_report = Cornucopia::Util::ReportBuilder.current_report
263
+ report = Cornucopia::Util::ReportBuilder.new_report
264
+
265
+ expect(report).to_not be == orig_report
266
+
267
+ alt_report = Cornucopia::Util::ReportBuilder.current_report
268
+
269
+ expect(report).to be == alt_report
270
+ end
271
+
272
+ it "should create a new report if the current report doesn't match" do
273
+ orig_report = Cornucopia::Util::ReportBuilder.current_report
274
+ report = Cornucopia::Util::ReportBuilder.current_report("cool_report", "diag_reports")
275
+
276
+ expect(report).to_not be == orig_report
277
+
278
+ alt_report = Cornucopia::Util::ReportBuilder.current_report("cool_report", "diag_reports")
279
+
280
+ expect(report).to be == alt_report
281
+
282
+ alt_report = Cornucopia::Util::ReportBuilder.current_report("cool_report")
283
+
284
+ expect(report).to be == alt_report
285
+
286
+ alt_report = Cornucopia::Util::ReportBuilder.current_report
287
+
288
+ expect(report).to be == alt_report
289
+ end
290
+
291
+ describe "#folder_name_to_section_name" do
292
+ it "returns a special value for cornucopia_report" do
293
+ expect(Cornucopia::Util::ReportBuilder.folder_name_to_section_name("cornucopia_report")).
294
+ to be == "Feature Tests"
295
+ end
296
+
297
+ it "returns a special value for diagnostics_rspec_report" do
298
+ expect(Cornucopia::Util::ReportBuilder.folder_name_to_section_name("diagnostics_rspec_report")).
299
+ to be == "RSPEC Tests"
300
+ end
301
+
302
+ it "returns the passed in value if nothing else" do
303
+ value = Faker::Lorem.word
304
+ expect(Cornucopia::Util::ReportBuilder.folder_name_to_section_name("#{value}")).to be == value
305
+ end
306
+
307
+ it "returns the basename of the passed in value" do
308
+ value = Faker::Lorem.word
309
+ expect(Cornucopia::Util::ReportBuilder.folder_name_to_section_name("#{Faker::Lorem.word}/#{value}")).
310
+ to be == value
311
+ end
312
+ end
313
+
314
+ describe "#build_index_section_item" do
315
+ it "creates a list item with an anchor" do
316
+ result_string = Cornucopia::Util::ReportBuilder.build_index_section_item("harold/fred/george.html")
317
+
318
+ expect(result_string).to match /href=\"harold\/fred\/george.html\"/
319
+ expect(result_string).to match /\>harold\/fred\</
320
+ expect(result_string).to match /\<li\>/
321
+ expect(result_string).to match /\<\/li\>/
322
+ end
323
+ end
324
+
325
+ describe "#build_index_section" do
326
+ it "creates a list item with an anchor" do
327
+ a_title = Faker::Lorem.sentence
328
+ strings = Faker::Lorem.sentences(5)
329
+ strings.map! { |string| string.gsub(" ", "/") }
330
+ result_string = Cornucopia::Util::ReportBuilder.build_index_section(a_title, strings)
331
+
332
+ expect(result_string).to match /#{a_title}/
333
+ strings.each do |a_string|
334
+ expect(result_string).to match /href=\"#{a_string}\"/
335
+ expect(result_string).to match /\>#{File.dirname(a_string)}\</
336
+ end
337
+ expect(result_string).to match /\<ul.*?\>/
338
+ expect(result_string).to match /\<\/ul\>/
339
+ end
340
+ end
341
+
342
+ describe "#page_dump" do
343
+ it "outputs a text area with the page html_encoded" do
344
+ source_html = "<html>\n<body>\nThis is some &amp; awesome text</body>\n</html>"
345
+ page_html = Cornucopia::Util::ReportBuilder.page_dump(source_html)
346
+ source_html = "".html_safe + source_html
347
+
348
+ expect(page_html).to match /\>#{source_html}\</
349
+ expect(page_html).to match /^\<textarea/
350
+ end
351
+ end
352
+
353
+ report_variation_settings.each do |report_settings|
354
+ index_folder = Rails.root.join("#{report_settings[:index_folder]}/")
355
+ report_folder = File.join(index_folder, "#{report_settings[:sub_folder]}/")
356
+
357
+ describe "When using #{report_settings[:report]}" do
358
+ it "should return a report" do
359
+ expect(send(report_settings[:report]).is_a?(Cornucopia::Util::ReportBuilder)).to be_truthy
360
+ end
361
+
362
+ describe "#index_folder_name" do
363
+ it "should create and return the folder for the base index file" do
364
+ folder_name = index_folder
365
+ index_folder_name = nil
366
+
367
+ expect(File.directory?(folder_name)).to be_falsey
368
+
369
+ begin
370
+ index_folder_name = send(report_settings[:report]).index_folder_name
371
+
372
+ expect(index_folder_name.to_s).to be == folder_name.to_s
373
+ expect(File.directory?(index_folder_name)).to be_truthy
374
+ ensure
375
+ FileUtils.rm_rf index_folder_name if index_folder_name
376
+ FileUtils.rm_rf folder_name
377
+ end
378
+ end
379
+ end
380
+
381
+ describe "#delete_old_folders" do
382
+ it "does nothing if there are too few old folders" do
383
+ folder_name = index_folder
384
+
385
+ expect(File.directory?(folder_name)).to be_falsey
386
+
387
+ begin
388
+ num_folders = rand(Cornucopia::Util::ReportBuilder::MAX_OLD_FOLDERS)
389
+ (1..num_folders).to_a.each do |report_index|
390
+ FileUtils.mkdir_p(File.join(folder_name, "#{report_settings[:sub_folder]}_#{report_index}"))
391
+ end
392
+
393
+ send(report_settings[:report]).delete_old_folders
394
+
395
+ (1..num_folders).to_a.each do |report_index|
396
+ expect(File.directory?(File.join(folder_name, "#{report_settings[:sub_folder]}_#{report_index}"))).to be_truthy
397
+ end
398
+ ensure
399
+ FileUtils.rm_rf folder_name
400
+ end
401
+ end
402
+
403
+ it "deletes the oldest folders (by name) till there are the right number of folders" do
404
+ folder_name = index_folder
405
+
406
+ expect(File.directory?(folder_name)).to be_falsey
407
+
408
+ begin
409
+ num_folders = Cornucopia::Util::ReportBuilder::MAX_OLD_FOLDERS + 1 + rand(4)
410
+ (1..num_folders).to_a.each do |report_index|
411
+ FileUtils.mkdir_p(File.join(folder_name, "#{report_settings[:sub_folder]}_#{report_index}"))
412
+ end
413
+
414
+ send(report_settings[:report]).delete_old_folders
415
+
416
+ (1..num_folders - Cornucopia::Util::ReportBuilder::MAX_OLD_FOLDERS).to_a.each do |report_index|
417
+ expect(File.directory?(File.join(folder_name, "#{report_settings[:sub_folder]}_#{report_index}"))).to be_falsey
418
+ end
419
+ (num_folders - Cornucopia::Util::ReportBuilder::MAX_OLD_FOLDERS + 1..num_folders).to_a.each do |report_index|
420
+ expect(File.directory?(File.join(folder_name, "#{report_settings[:sub_folder]}_#{report_index}"))).to be_truthy
421
+ end
422
+ ensure
423
+ FileUtils.rm_rf folder_name
424
+ end
425
+ end
426
+ end
427
+
428
+ it "returns the #report_base_page_name" do
429
+ expect(send(report_settings[:report]).report_base_page_name).
430
+ to be == File.join(report_folder, "index.html").to_s
431
+ end
432
+
433
+ it "returns the #index_base_page_name" do
434
+ expect(send(report_settings[:report]).index_base_page_name).to be == File.join(index_folder, "index.html").to_s
435
+ end
436
+
437
+ it "returns the #report_contents_page_name" do
438
+ expect(send(report_settings[:report]).report_contents_page_name).
439
+ to be == File.join(report_folder, "report_contents.html").to_s
440
+ end
441
+
442
+ it "returns the #index_contents_page_name" do
443
+ expect(send(report_settings[:report]).index_contents_page_name).
444
+ to be == File.join(index_folder, "report_contents.html").to_s
445
+ end
446
+
447
+ describe "#backup_report_folder" do
448
+ it "renames the report folder" do
449
+ test_time = Time.now
450
+ report = send(report_settings[:report])
451
+ report.instance_variable_set("@report_folder_name", report_folder)
452
+ expect(File).to receive(:ctime).with(File.join(report_folder, "index.html")).and_return(test_time)
453
+
454
+ FileUtils.mkdir_p(report_folder)
455
+ Cornucopia::Util::FileAsset.asset("index_base.html").add_file(File.join(report_folder, "index.html"))
456
+
457
+ report.backup_report_folder
458
+
459
+ expect(File.directory?(report_folder)).to be_falsey
460
+ expect(File.directory?(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}/"))).to be_truthy
461
+
462
+ FileUtils.rm_rf(report_folder)
463
+ end
464
+
465
+ it "deals with the unlikely event of a conflict" do
466
+ test_time = Time.now
467
+ report = send(report_settings[:report])
468
+ report.instance_variable_set("@report_folder_name", report_folder)
469
+ expect(File).to receive(:ctime).with(report_folder).and_return(test_time)
470
+
471
+ FileUtils.mkdir_p(report_folder)
472
+ FileUtils.mkdir_p(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}/"))
473
+ FileUtils.mkdir_p(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}_alt_1/"))
474
+ FileUtils.mkdir_p(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}_alt_2/"))
475
+
476
+ report.backup_report_folder
477
+
478
+ expect(File.directory?(report_folder)).to be_falsey
479
+ expect(File.directory?(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}_alt_1/"))).to be_truthy
480
+ expect(File.directory?(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}_alt_2/"))).to be_truthy
481
+ expect(File.directory?(File.join(index_folder, "#{report_settings[:sub_folder]}_#{test_time.strftime("%Y_%m_%d_%H_%M_%S")}_alt_3/"))).to be_truthy
482
+
483
+ FileUtils.rm_rf(report_folder)
484
+ end
485
+ end
486
+
487
+ describe "#rebuild_index_page" do
488
+ around(:each) do |example|
489
+ expect(File.directory?(Rails.root.join("coverage/"))).to be_falsey
490
+
491
+ begin
492
+ example.run
493
+ ensure
494
+ FileUtils.rm_rf Rails.root.join("coverage/")
495
+ end
496
+ end
497
+
498
+ it "creates the index file" do
499
+ current_report = send(report_settings[:report])
500
+
501
+ current_report.rebuild_index_page
502
+
503
+ expect(File.directory?(current_report.index_folder_name)).to be_truthy
504
+ expect(File.exists?(current_report.index_base_page_name)).to be_truthy
505
+ expect(File.exists?(File.join(current_report.index_folder_name, "cornucopia.css"))).to be_truthy
506
+ end
507
+
508
+ it "deletes the existing report_contents page" do
509
+ current_report = send(report_settings[:report])
510
+
511
+ FileUtils.mkdir_p current_report.index_folder_name
512
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").
513
+ add_file(File.join(current_report.index_folder_name, "report_contents.html"))
514
+
515
+ pre_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
516
+
517
+ current_report.rebuild_index_page
518
+
519
+ post_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
520
+ expect(post_file).not_to be == pre_file
521
+
522
+ expect(post_file).not_to match /coverage/i
523
+ end
524
+
525
+ it "adds coverage if it exists" do
526
+ current_report = send(report_settings[:report])
527
+
528
+ FileUtils.mkdir_p Rails.root.join("coverage")
529
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").add_file(Rails.root.join("coverage/index.html"))
530
+
531
+ FileUtils.mkdir_p current_report.index_folder_name
532
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").
533
+ add_file(File.join(current_report.index_folder_name, "report_contents.html"))
534
+
535
+ pre_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
536
+
537
+ current_report.rebuild_index_page
538
+
539
+ post_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
540
+ expect(post_file).not_to be == pre_file
541
+
542
+ expect(post_file).to match /coverage/i
543
+ expect(post_file).to match /coverage\/index.html/i
544
+ end
545
+
546
+ it "indexes folders properly" do
547
+ current_report = send(report_settings[:report])
548
+ base_folder = current_report.index_folder_name
549
+
550
+ folder_names = []
551
+ file_names = []
552
+ empty_folder_names = []
553
+ folder_names << "cornucopia_report"
554
+ folder_names << "diagnostics_rspec_report"
555
+
556
+ rand(3..5).times do
557
+ folder_names << "cornucopia_report_#{Faker::Lorem.word}"
558
+ folder_names << "diagnostics_rspec_report_#{Faker::Lorem.word}"
559
+ file_name = Faker::Lorem.word
560
+ folder_names << file_name
561
+ rand(3..5).times do
562
+ folder_names << "#{file_name}_#{Faker::Lorem.word}"
563
+ end
564
+
565
+ file_name = Faker::Lorem.word
566
+ empty_folder_names << file_name
567
+ FileUtils.mkdir_p(File.join(base_folder, file_name))
568
+ Cornucopia::Util::FileAsset.asset("more_info.js").add_file(File.join(base_folder, file_name, "other.html"))
569
+
570
+ file_name = "#{Faker::Lorem.word}.html"
571
+ file_names << file_name
572
+ Cornucopia::Util::FileAsset.asset("more_info.js").add_file(File.join(base_folder, file_name))
573
+ end
574
+
575
+ folder_names.each do |folder_name|
576
+ FileUtils.mkdir_p(File.join(base_folder, folder_name))
577
+ Cornucopia::Util::FileAsset.asset("more_info.js").add_file(File.join(base_folder, folder_name, "index.html"))
578
+ end
579
+
580
+ FileUtils.mkdir_p Rails.root.join("coverage")
581
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").add_file(Rails.root.join("coverage/index.html"))
582
+
583
+ FileUtils.mkdir_p current_report.index_folder_name
584
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").
585
+ add_file(File.join(current_report.index_folder_name, "report_contents.html"))
586
+
587
+ pre_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
588
+
589
+ current_report.rebuild_index_page
590
+
591
+ post_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
592
+ expect(post_file).not_to be == pre_file
593
+
594
+ expect(post_file).to match /\>..\/coverage\</i
595
+ expect(post_file).to match /coverage\/index.html/i
596
+
597
+ groups = {}
598
+ folder_names.each do |folder_name|
599
+ if folder_name =~ /cornucopia_report/
600
+ group_name = "cornucopia_report"
601
+ groups[group_name] ||= []
602
+ groups[group_name] << (post_file =~ /h4\>Feature Tests\</i) if groups[group_name].empty?
603
+ elsif folder_name =~ /diagnostics_rspec_report/
604
+ group_name = "diagnostics_rspec_report"
605
+ groups[group_name] ||= []
606
+ groups[group_name] << (post_file =~ /h4\>RSPEC Tests\</i) if groups[group_name].empty?
607
+ elsif folder_name =~ /_/
608
+ group_name = folder_name.split("_")[0]
609
+ groups[group_name] ||= []
610
+ groups[group_name] << (post_file =~ /h4\>#{group_name}\</i) if groups[group_name].empty?
611
+ else
612
+ group_name = folder_name
613
+ groups[group_name] ||= []
614
+ groups[group_name] << (post_file =~ /h4\>#{group_name}\</i) if groups[group_name].empty?
615
+ end
616
+ groups[group_name] << (post_file =~ /\"#{folder_name}\/index.html\"/i)
617
+ groups[group_name] << (post_file =~ /\>#{folder_name}\<\/a\>/i)
618
+ end
619
+
620
+ groups.each do |group_name, group_indexes|
621
+ group_indexes.each do |index_value|
622
+ expect(index_value).to be
623
+ expect(index_value).to be >= 0
624
+ end
625
+
626
+ groups.each do |other_group_name, other_group_indexes|
627
+ if (other_group_name != group_name)
628
+ expect((group_indexes.min < other_group_indexes.min && group_indexes.max < other_group_indexes.min) ||
629
+ (group_indexes.min > other_group_indexes.max && group_indexes.max > other_group_indexes.max)).
630
+ to be_truthy
631
+ end
632
+ end
633
+ end
634
+
635
+ empty_folder_names.each do |file_name|
636
+ expect(post_file).not_to match /#{file_name}\/other.html/i
637
+ end
638
+
639
+ file_names.each do |file_name|
640
+ expect(post_file).not_to match /\/#{file_name}/i
641
+ end
642
+ end
643
+ end
644
+
645
+ describe "#initialize_report_files" do
646
+ it "should create the report folder" do
647
+ current_report = send(report_settings[:report])
648
+
649
+ FileUtils.mkdir_p current_report.index_folder_name
650
+ current_report.rebuild_index_page
651
+
652
+ post_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
653
+ expect(post_file).not_to match /\>#{report_settings[:sub_folder]}\</
654
+
655
+ current_report.initialize_report_files
656
+
657
+ report_folder = current_report.report_folder_name
658
+ expect(File.exists?(report_folder)).to be_truthy
659
+
660
+ post_file = File.read(File.join(current_report.index_folder_name, "report_contents.html"))
661
+ expect(post_file).to match /\>#{report_settings[:sub_folder]}\</
662
+
663
+ expect(File.exists?(File.join(report_folder, "index.html"))).to be_truthy
664
+ expect(File.exists?(File.join(report_folder, "report_contents.html"))).to be_truthy
665
+ expect(File.exists?(File.join(report_folder, "collapse.gif"))).to be_truthy
666
+ expect(File.exists?(File.join(report_folder, "expand.gif"))).to be_truthy
667
+ expect(File.exists?(File.join(report_folder, "more_info.js"))).to be_truthy
668
+ expect(File.exists?(File.join(report_folder, "cornucopia.css"))).to be_truthy
669
+ end
670
+ end
671
+
672
+ describe "#report_folder_name" do
673
+ it "initializes the system to make room for the folder" do
674
+ current_report = send(report_settings[:report])
675
+
676
+ expect(current_report).to receive(:backup_report_folder).and_call_original
677
+ expect(current_report).to receive(:delete_old_folders).and_call_original
678
+ expect(current_report).not_to receive(:initialize_report_files)
679
+
680
+ expect(current_report.report_folder_name.to_s).to be == Rails.root.join(report_settings[:index_folder],
681
+ report_settings[:sub_folder]).to_s + "/"
682
+ expect(File.exists?(current_report.report_contents_page_name)).to be_falsey
683
+ end
684
+ end
685
+
686
+ describe "#open_report_contents_file" do
687
+ it "initializes the report_contents file" do
688
+ current_report = send(report_settings[:report])
689
+ expect(current_report).to receive(:initialize_report_files).and_call_original
690
+ write_contents = Faker::Lorem.paragraphs(rand(5..8)).join("\n\n")
691
+
692
+ current_report.open_report_contents_file do |writer|
693
+ writer.write(write_contents)
694
+ end
695
+
696
+ write_contents = "".html_safe + write_contents
697
+
698
+ post_data = File.read(current_report.report_contents_page_name)
699
+ expect(post_data).to match /#{write_contents}/
700
+ end
701
+ end
702
+
703
+ describe "#close" do
704
+ it "should create an empty report if nothing was reported" do
705
+ current_report = send(report_settings[:report])
706
+ current_report.close
707
+
708
+ post_data = File.read(current_report.report_contents_page_name)
709
+ expect(post_data).to match /No errors to report/i
710
+
711
+ expect(Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report")).not_to be
712
+ end
713
+
714
+ it "should not call open_report_after_generation if nothing was reported" do
715
+ expect(Cornucopia::Util::Configuration).not_to receive(:open_report_after_generation)
716
+
717
+ current_report = send(report_settings[:report])
718
+ current_report.close
719
+
720
+ post_data = File.read(current_report.report_contents_page_name)
721
+ expect(post_data).to match /No errors to report/i
722
+
723
+ expect(Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report")).not_to be
724
+ end
725
+
726
+ it "should not create an empty report if something was reported" do
727
+ current_report = send(report_settings[:report])
728
+
729
+ section_name = Faker::Lorem.sentence
730
+ current_report.within_section(section_name) do |report_object|
731
+ expect(report_object.is_a?(Cornucopia::Util::ReportBuilder)).to be_truthy
732
+ end
733
+
734
+ current_report.close
735
+
736
+ post_data = File.read(current_report.report_contents_page_name)
737
+ expect(post_data).not_to match /No errors to report/i
738
+
739
+ expect(Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report")).not_to be
740
+ end
741
+
742
+ it "should open the report if something was created" do
743
+ current_report = send(report_settings[:report])
744
+
745
+ expect(Cornucopia::Util::Configuration).to receive(:open_report_after_generation).and_return(true)
746
+ expect(current_report).to receive(:system).and_return(nil)
747
+
748
+ section_name = Faker::Lorem.sentence
749
+ current_report.within_section(section_name) do |report_object|
750
+ expect(report_object.is_a?(Cornucopia::Util::ReportBuilder)).to be_truthy
751
+ end
752
+
753
+ current_report.close
754
+
755
+ post_data = File.read(current_report.report_contents_page_name)
756
+ expect(post_data).not_to match /No errors to report/i
757
+
758
+ expect(Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report")).not_to be
759
+ end
760
+ end
761
+
762
+ describe "#within_section" do
763
+ it "should output passed in text to the report file" do
764
+ current_report = send(report_settings[:report])
765
+
766
+ expect(current_report).to receive(:initialize_report_files).at_least(1).and_call_original
767
+
768
+ section_name = Faker::Lorem.sentence
769
+ current_report.within_section(section_name) do |report_object|
770
+ expect(report_object.is_a?(Cornucopia::Util::ReportBuilder)).to be_truthy
771
+ end
772
+
773
+ post_data = File.read(current_report.report_contents_page_name)
774
+ expect(post_data).to match /\>#{section_name}\</i
775
+ end
776
+
777
+ it "should always close the section if an exception is thrown" do
778
+ current_report = send(report_settings[:report])
779
+
780
+ expect(current_report).to receive(:initialize_report_files).at_least(1).and_call_original
781
+
782
+ expect do
783
+ section_name = Faker::Lorem.sentence
784
+ current_report.within_section(section_name) do |report_object|
785
+ expect(report_object.is_a?(Cornucopia::Util::ReportBuilder)).to be_truthy
786
+ raise Exception.new("This is an exception")
787
+ end
788
+ end.to raise_exception
789
+
790
+ post_data = File.read(current_report.report_contents_page_name)
791
+ expect(post_data[-1 * "\<\/div\>\n".length..-1]).to be == "\<\/div\>\n"
792
+ end
793
+ end
794
+
795
+ describe "#within_table" do
796
+ it "should output the table within a section" do
797
+ current_report = send(report_settings[:report])
798
+
799
+ section_name = "".html_safe + Faker::Lorem.sentence
800
+ table_label = "".html_safe + Faker::Lorem.sentence
801
+ table_data = "".html_safe + Faker::Lorem.paragraphs.join("\n")
802
+
803
+ current_report.within_section(section_name) do |report_object|
804
+ report_object.within_table do |report_table|
805
+ report_table.write_stats(table_label, table_data)
806
+ end
807
+ end
808
+
809
+ post_data = File.read(current_report.report_contents_page_name)
810
+ expect(post_data[-1 * "\<\/div\>\n".length..-1]).to be == "\<\/div\>\n"
811
+ expect(post_data).to match /\>\n#{table_label}\n\</
812
+ expect(post_data).to match /\>#{table_data}\</
813
+ end
814
+
815
+ it "should output the table within a section even if an exception is thrown" do
816
+ current_report = send(report_settings[:report])
817
+
818
+ section_name = "".html_safe + Faker::Lorem.sentence
819
+ table_label = "".html_safe + Faker::Lorem.sentence
820
+ table_data = "".html_safe + Faker::Lorem.paragraphs.join("\n")
821
+
822
+ expect do
823
+ current_report.within_section(section_name) do |report_object|
824
+ report_object.within_table do |report_table|
825
+ report_table.write_stats(table_label, table_data)
826
+ raise Exception.new("This is an exception")
827
+ end
828
+ end
829
+ end.to raise_exception
830
+
831
+ post_data = File.read(current_report.report_contents_page_name)
832
+ expect(post_data[-1 * "\<\/div\>\n".length..-1]).to be == "\<\/div\>\n"
833
+ expect(post_data).to match /\>\n#{table_label}\n\</
834
+ expect(post_data).to match /\>#{table_data}\</
835
+ expect(post_data).to match /This is an exception/
836
+ end
837
+
838
+ # noinspection RubyScope
839
+ it "outputs the table in another table, and doesn't write anything" do
840
+ current_report = send(report_settings[:report])
841
+ mid_data = ""
842
+
843
+ current_report.within_section("Section") do |report_object|
844
+ # noinspection RubyScope
845
+ report_object.within_table do |report_table|
846
+ report_object.within_table(report_table: report_table) do |sub_table|
847
+ sub_table.write_stats "stat", "value"
848
+ end
849
+
850
+ mid_data = File.read(current_report.report_contents_page_name)
851
+ end
852
+ end
853
+
854
+ current_report.close
855
+
856
+ post_data = File.read(current_report.report_contents_page_name)
857
+
858
+ expect(post_data).to match /\>\nstat\n\</
859
+ expect(mid_data).not_to match /\>\nstat\n\</
860
+ end
861
+ end
862
+
863
+ describe "#unique_folder_name" do
864
+ it "returns the folder if there is no folder with that name" do
865
+ current_report = send(report_settings[:report])
866
+ report_folder = current_report.report_folder_name
867
+
868
+ new_folder = Faker::Lorem.word
869
+
870
+ expect(current_report.unique_folder_name(new_folder)).to be == new_folder
871
+ end
872
+
873
+ it "returns a uniqe folder if there is a folder with that name" do
874
+ current_report = send(report_settings[:report])
875
+ report_folder = current_report.report_folder_name
876
+
877
+ new_folder = Faker::Lorem.word
878
+ num_folders = rand(5..10)
879
+
880
+ FileUtils.mkdir_p File.join(report_folder, new_folder)
881
+ num_folders.times do |folder_number|
882
+ FileUtils.mkdir_p File.join(report_folder, "#{new_folder}_#{folder_number}")
883
+ end
884
+
885
+ expect(current_report.unique_folder_name(new_folder)).to be == "#{new_folder}_#{num_folders}"
886
+ end
887
+ end
888
+
889
+ describe "#unique_file_name" do
890
+ it "creates a unique file name if there are no files" do
891
+ current_report = send(report_settings[:report])
892
+ report_folder = current_report.report_folder_name
893
+
894
+ prefix = Faker::Lorem.word
895
+ postfix = Faker::Lorem.word
896
+
897
+ expect(current_report.unique_file_name("#{prefix}.#{postfix}")).to be == "#{prefix}.#{postfix}"
898
+ end
899
+
900
+ it "creates a unique file name if there are some files already" do
901
+ current_report = send(report_settings[:report])
902
+ report_folder = current_report.report_folder_name
903
+
904
+ prefix = Faker::Lorem.word
905
+ postfix = Faker::Lorem.word
906
+ num_files = rand(3..5)
907
+
908
+ FileUtils.mkdir_p report_folder
909
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").
910
+ add_file(File.join(report_folder, "#{prefix}.#{postfix}"))
911
+ (1..num_files).to_a.each do |file_index|
912
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").
913
+ add_file(File.join(report_folder, "#{prefix}_#{file_index}.#{postfix}"))
914
+ end
915
+
916
+ expect(current_report.unique_file_name("#{prefix}.#{postfix}")).to be == "#{prefix}_#{num_files + 1}.#{postfix}"
917
+ end
918
+ end
919
+
920
+ describe "#image_link" do
921
+ it "moves the image file and creates an image element" do
922
+ current_report = send(report_settings[:report])
923
+ report_folder = current_report.report_folder_name
924
+
925
+ prefix = Faker::Lorem.word
926
+ postfix = Faker::Lorem.word
927
+
928
+ FileUtils.mkdir_p report_folder
929
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").
930
+ add_file(File.join(report_folder, "#{prefix}.#{postfix}"))
931
+
932
+ expect(File.exists?(File.join(report_folder, "#{prefix}.#{postfix}"))).to be_truthy
933
+ expect(File.exists?(File.join(report_folder, "#{prefix}_1.#{postfix}"))).to be_falsey
934
+
935
+ image_link = current_report.image_link(File.join(report_folder, "#{prefix}.#{postfix}"))
936
+
937
+ expect(File.exists?(File.join(report_folder, "#{prefix}.#{postfix}"))).to be_falsey
938
+ expect(File.exists?(File.join(report_folder, "#{prefix}_1.#{postfix}"))).to be_truthy
939
+
940
+ expect(image_link).to be_html_safe
941
+ expect(image_link).to match /^\<img/i
942
+ expect(image_link).to match /src=\".\/#{prefix}_1.#{postfix}\"/i
943
+ end
944
+ end
945
+
946
+ describe "#page_frame" do
947
+ it "dumps the html to a file, and returns an iframe element" do
948
+ current_report = send(report_settings[:report])
949
+ report_folder = current_report.report_folder_name
950
+ source_html = "<html>\n<body>\nThis is some &amp; awesome text</body>\n</html>"
951
+
952
+ FileUtils.mkdir_p report_folder
953
+ Cornucopia::Util::FileAsset.asset("cornucopia.css").add_file(File.join(report_folder, "page_dump.html"))
954
+
955
+ expect(File.exists?(File.join(report_folder, "page_dump.html"))).to be_truthy
956
+ expect(File.exists?(File.join(report_folder, "page_dump_1.html"))).to be_falsey
957
+
958
+ page_link = current_report.page_frame(source_html)
959
+
960
+ expect(File.exists?(File.join(report_folder, "page_dump.html"))).to be_truthy
961
+ expect(File.exists?(File.join(report_folder, "page_dump_1.html"))).to be_truthy
962
+
963
+ expect(page_link).to be_html_safe
964
+ expect(page_link).to match /\<iframe/i
965
+ expect(page_link).to match /src=\"page_dump_1.html\"/i
966
+ expect(File.read(File.join(report_folder, "page_dump_1.html"))).to be == source_html
967
+ end
968
+ end
969
+
970
+ describe "#page_text" do
971
+ it "outputs a textarea for page" do
972
+ current_report = send(report_settings[:report])
973
+
974
+ text_area_value = current_report.page_text("</textarea>")
975
+
976
+ expect(text_area_value).to match /\&lt\;\/textarea\&gt\;/
977
+ expect(text_area_value).to match /\<textarea/
978
+ expect(text_area_value).to match /\<\/textarea\>/
979
+ end
980
+ end
981
+ end
982
+ end
983
+ end