cornucopia 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
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