appraisermetrics_report_service 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,219 @@
1
+ module ReportUtils
2
+
3
+ def static_strings
4
+ text_blocks = {}
5
+ static_strings = YAML.load_file('./config/static_text.yml')
6
+ static_strings.each {|k, v| text_blocks[k.to_sym] = v}
7
+ return text_blocks
8
+ end
9
+ module_function :static_strings
10
+
11
+ def moneymaker(money_hash, without_cents) # ({cents: 12345, currency_iso: "USD"}, boolean) # DRY currency string generation
12
+ if money_hash
13
+ m = Money.new(money_hash[:cents], money_hash[:currency_iso])
14
+ else
15
+ m = Money.new(0, "USD")
16
+ end
17
+
18
+ m.format(no_cents: without_cents)
19
+ end
20
+
21
+ def datemaker(date_string) # takes a string string value, avoid parse errors by checking for nil
22
+ if date_string
23
+ begin
24
+ ds = Date.parse(date_string)
25
+ rescue ArgumentError => ex
26
+ end
27
+ end
28
+ ds ||= ''
29
+ return ds
30
+ end
31
+
32
+ def no_nil_array(array_hash) # check for nodes for arrays that might be nil, return empty array
33
+ array_hash ||= []
34
+ end
35
+
36
+ def no_nil_number(my_num) # check for nil nodes to avoid typerrors and NoMethod
37
+ my_num ||= 0
38
+ end
39
+
40
+ def no_nil_string(my_string) # check for nil befor calling methods on it
41
+ my_string ||= ""
42
+ end
43
+
44
+ def parallel_text(static, dyn, indent_distance) # DRY parallel text gen method for text in the form: "Some Title:" "Some Data"
45
+ float do
46
+ text static, style: :bold
47
+ end
48
+
49
+ indent(indent_distance) do
50
+ text dyn
51
+ end
52
+ end
53
+ module_function :parallel_text
54
+
55
+ def average_primary_land_val(comp_values) # averages an array of floats
56
+ sum = comp_values.inject(:+)
57
+ ave = sum ? sum / comp_values.count : 0
58
+ return Money.new(ave * 100, 'USD')
59
+ end
60
+ module_function :average_primary_land_val
61
+
62
+ def median_primary_land_val(comp_values) # gets median value for an array of floats
63
+ sorted_array = comp_values.sort
64
+ length = sorted_array.length
65
+
66
+ median = sorted_array.any? ? (sorted_array[(length - 1) / 2] + sorted_array[length / 2]) / 2.0 : 0
67
+ return Money.new(median * 100, 'USD')
68
+ end
69
+ module_function :median_primary_land_val
70
+
71
+ def maximum_primary_land_val(comp_values) # gets max value for array of floats
72
+ max = comp_values.any? ? comp_values.max : 0
73
+ return Money.new(max * 100, 'USD')
74
+ end
75
+ module_function :maximum_primary_land_val
76
+
77
+ def minimum_primary_land_val(comp_values) # gets min value for array of floats
78
+ min = comp_values.any? ? comp_values.min : 0
79
+ return Money.new(min * 100, 'USD')
80
+ end
81
+ module_function :minimum_primary_land_val
82
+
83
+ def flip_improvements_array(improv_array)
84
+ type, size, unit_of_measure, foundation, const_class = ["Type"], ["Size"], ["Unit of Measure"], ["Foundation"], ["Const. Class"]
85
+ floor, const_quality, cond_utility, year_built = ["Floor"], ["Const. Quality"], ["Cond Utility"], ["Year Built"]
86
+ total_econ_al, eff_age, remaining_al, rcn, def_maint = ["Total Economic AL"], ["Remaining AL:"], ["RCN:"], ["Deferred Maint:"], ["% Physical Deprec."]
87
+ phys_dep, func_dep, economic, total_cont_val = ["% Physical Deprec."], ["% Functional Deprec."], ["% Economic"], ["Total Cont. Value:"]
88
+
89
+ if improv_array && improv_array.any?
90
+ improv_array.each do |i|
91
+ type.push("#{i[:improvtype]}")
92
+ size.push("#{i[:unitsize]}")
93
+ unit_of_measure.push("#{i[:unitdescr]}")
94
+ foundation.push("#{i[:foundation]}")
95
+ const_class.push("#{i[:constrclass]}")
96
+ floor.push("#{i[:floor]}")
97
+ const_quality.push("#{i[:qaulityconstr]}")
98
+ cond_utility.push("#{i[:condition]}")
99
+ year_built.push("#{i[:yearbuilt]}")
100
+ total_econ_al.push("#{i[:totalecoage]}")
101
+ eff_age.push("#{i[:effage]}")
102
+ remaining_al.push("#{no_nil_number(i[:totalecoage]) - no_nil_number(i[:effage])}")
103
+ rcn.push(moneymaker(i[:rplccost], true))
104
+ def_maint.push("#{moneymaker(i[:deffmaintenance], false)}")
105
+
106
+ eco_age = no_nil_number(i[:totalecoage])
107
+ if eco_age == 0
108
+ phys_dep.push("undef")
109
+ else
110
+ phys_dep.push("#{no_nil_number(i[:effage]) / eco_age}")
111
+ end
112
+
113
+ func_dep.push("#{i[:fnctldeprication]}")
114
+ economic.push("#{i[:extdeprication]}")
115
+ total_cont_val.push("#{moneymaker(i[:depval], false)}")
116
+ end
117
+ end
118
+
119
+ parsed_array = [
120
+ [{content: "Improvements", colspan: 8}],
121
+ %w(Description Imprv.1 Imprv.2 Imprv.3 Imprv.4 Imprv.5 Imprv.6 Imprv.7)
122
+ ]
123
+ parsed_array.push(type, size, unit_of_measure, foundation, const_class, floor, const_quality, cond_utility, year_built,
124
+ total_econ_al, eff_age, remaining_al, rcn, def_maint, phys_dep, func_dep, economic, total_cont_val)
125
+ # this method creates a 2 dimensional array to pass in to prawn table
126
+ # it is necessary because of the reversed axis of the improvements table
127
+ # there is likely a cleaner way to do this, but any solution should ensure a predictable array to pass to a prawn table
128
+ # an array should contain 8 elements that can include nil or "" if such an attribute does not exist.
129
+ end
130
+
131
+ def self.conditional_externs_array(doc)
132
+ # the array that will be returned and used by the prawn table
133
+ full_array = [
134
+ [{content: "Externalities, Wind Power Generation, Transmission Towers", colspan: 4}]
135
+ ]
136
+
137
+ # row 1, will populate 3rd and 4th cells conditionally
138
+ externs_array = [
139
+ {content: "Are there any past uses of the property that may have
140
+ created hazardous waste contamination of the property or its groundwater? If yes, describe:", colspan: 2}
141
+ ]
142
+
143
+ # push affected by into externs array
144
+ affected_by = doc[:property_affectedby]
145
+ if affected_by && affected_by.any?
146
+ externs_array.push("Description of Externalities that affect(s) this property:", affected_by.join(", "))
147
+ end
148
+
149
+ # conditional push of hazards and/or problems if exist
150
+ hazards_and_problems = []
151
+ if doc[:has_hazardous_waste] == "Yes"
152
+ hazards_and_problems.push({content: doc[:hazard_descr], colspan: 2})
153
+ else
154
+ hazards_and_problems.push({content: "No", colspan: 2})
155
+ end
156
+
157
+ # check various fields for environmental or other problems
158
+ problems = []
159
+ problems.push(doc[:problem_descr], doc[:env_problems], doc[:env_problem_descr])
160
+ if problems && problems.any?
161
+ hazards_and_problems.push("Description of problems, issues or resolve:", problems.join(". "))
162
+ end
163
+
164
+ # conditional push of tower and wind info
165
+ towers_and_wind_type = []
166
+ ttowers = doc[:ttowers]
167
+ if ttowers && ttowers.any?
168
+ towers_and_wind_type.push("Type of Transmission Tower on Property:", ttowers.join(", "))
169
+ end
170
+
171
+ wind = doc[:windgeneratortype]
172
+ if wind && wind.any?
173
+ towers_and_wind_type.push("Wind Power Generation Type:", wind.join(", "))
174
+ end
175
+
176
+ #conditional push of tower income and wind speed
177
+ tt_income_and_wind_speed = []
178
+ if doc[:tt_annual_income]
179
+ tt_income_and_wind_speed.push("Annual net income from Transmission Tower Contracts:", doc[:tt_annual_income])
180
+ end
181
+
182
+ if doc[:windspeed]
183
+ tt_income_and_wind_speed.push("Wind Speed Class:", doc[:windspeed])
184
+ end
185
+
186
+ # conditional push of transmission tower comments and number of wind gen towers
187
+ tt_comments_and_wind_towers = []
188
+ if doc[:transtower_comments]
189
+ tt_comments_and_wind_towers.push("Transmission Tower Comments:", doc[:transtower_comments])
190
+ end
191
+
192
+ if doc[:num_of_gentowers]
193
+ tt_comments_and_wind_towers.push("Number of Generation Towers:", doc[:num_of_gentowers])
194
+ end
195
+
196
+ # conditional push of tower info
197
+ tower_height = ["", ""]
198
+ if doc[:avgtowerhight]
199
+ tower_height.push("Average Height of Generation Towers:", doc[:avgtowerhight])
200
+ end
201
+
202
+ wind_income = ["", ""]
203
+ if doc[:windgenincome]
204
+ wind_income.push("Net Annual Income Generate from Wind Generation Towers:", doc[:windgenincome])
205
+ end
206
+
207
+ wind_gen_comment = ["", ""]
208
+ if doc[:windgen_comment]
209
+ wind_gen_comment.push("Wind Generation Comments:", doc[:windgen_comment])
210
+ end
211
+
212
+ # push all subarrays into main array and return
213
+ full_array.push(externs_array, hazards_and_problems, towers_and_wind_type,
214
+ tt_income_and_wind_speed, tt_comments_and_wind_towers, tower_height, wind_income, wind_gen_comment)
215
+
216
+ return full_array
217
+ end
218
+
219
+ end
@@ -0,0 +1,626 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'closed_sale class' do
4
+ describe 'meta data table' do # meta data
5
+ context 'keys present' do
6
+ before :each do
7
+ @pdf = ClosedSale.new do
8
+ @rep = Sampler.get_comp2 # using record 1054 for tests
9
+ meta_data
10
+ end
11
+ @meta_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
12
+ end
13
+
14
+ it 'renders static data' do
15
+ expect(@meta_content).to include('Record Created By')
16
+ end
17
+
18
+ it 'renders the meta data table if keys are present' do
19
+ expect(@meta_content).to include('1054')
20
+ end
21
+ end
22
+
23
+ context 'keys missing' do
24
+ it 'renders static content' do
25
+ @pdf = ClosedSale.new do
26
+ @rep = {foo: 'bar'}
27
+ meta_data
28
+ end
29
+
30
+ @meta_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
31
+ expect(@meta_content).to include('Record Created By')
32
+ end
33
+ end
34
+ end
35
+
36
+ describe 'image' do
37
+ it 'renders the text "No image" if there are no images to display' do
38
+ @pdf = ClosedSale.new do
39
+ @rep = {foo: 'bar'}
40
+ @property_images = []
41
+ profile_image
42
+ end
43
+
44
+ @image_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
45
+ expect(@image_content).to include('No Image')
46
+ end
47
+
48
+ it 'renders the profile image if present' do
49
+ @pdf = ClosedSale.new do
50
+ @rep = {foo: 'bar'}
51
+ @property_images = ['./spec/test_data/images/profile1.png']
52
+ profile_image
53
+ end
54
+
55
+ @image_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
56
+ expect(@image_content).to include('')
57
+ end
58
+ end
59
+
60
+ describe 'land classification' do
61
+ context 'with keys' do
62
+ before :each do
63
+ @pdf = ClosedSale.new do
64
+ @rep = Sampler.get_comp2
65
+ land_classification
66
+ end
67
+ @land_class_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
68
+ end
69
+ it 'renders static content' do
70
+ expect(@land_class_content).to include('Land Class')
71
+ end
72
+
73
+ it 'renders dynamic content from keys' do
74
+ expect(@land_class_content).to include('$7,500')
75
+ end
76
+ end
77
+
78
+ context 'without keys' do
79
+ it 'renders static content' do
80
+ @pdf = ClosedSale.new do
81
+ @rep = {foo: 'bar'}
82
+ land_classification
83
+ end
84
+ @land_class_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
85
+ expect(@land_class_content).to include('Land Class')
86
+ end
87
+ end
88
+ end
89
+
90
+ describe 'cash flow' do
91
+ context 'with keys' do
92
+ before :each do
93
+ @pdf = ClosedSale.new do
94
+ @rep = Sampler.get_comp2
95
+ cash_flow
96
+ end
97
+ @cash_flow_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
98
+ end
99
+
100
+ it 'renders static content' do
101
+ expect(@cash_flow_content).to include('Cash Flow - Production Analysis')
102
+ end
103
+
104
+ it 'renders dynamic content from keys' do
105
+ expect(@cash_flow_content).to include('$600.00')
106
+ end
107
+ end
108
+
109
+ context 'without keys' do
110
+ it 'renders static content' do
111
+ @pdf = ClosedSale.new do
112
+ @rep = {foo: 'bar'}
113
+ cash_flow
114
+ end
115
+ @cash_flow_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
116
+ expect(@cash_flow_content).to include('Cash Flow - Production Analysis')
117
+ end
118
+ end
119
+ end
120
+
121
+ describe 'comments' do
122
+ context 'with keys' do
123
+ before :each do
124
+ @pdf = ClosedSale.new do
125
+ @rep = Sampler.get_comp2
126
+ comments
127
+ end
128
+ @comments_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
129
+ end
130
+
131
+ it 'renders static content' do
132
+ expect(@comments_content).to include('Comments')
133
+ end
134
+
135
+ it 'renders dynamic content from keys' do
136
+ expect(@comments_content).to include('Farmer retiring')
137
+ end
138
+ end
139
+
140
+ context 'without keys' do
141
+ it 'renders static content' do
142
+ @pdf = ClosedSale.new do
143
+ @rep = {foo: 'bar'}
144
+ comments
145
+ end
146
+ @comments_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
147
+ expect(@comments_content).to include('Comments')
148
+ end
149
+ end
150
+ end
151
+
152
+ describe 'property class' do
153
+ context 'with keys' do
154
+ before :each do
155
+ @pdf = ClosedSale.new do
156
+ @rep = Sampler.get_comp2
157
+ property_class
158
+ end
159
+ @property_class_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
160
+ end
161
+
162
+ it 'renders static content' do
163
+ expect(@property_class_content).to include('Transaction Type')
164
+ end
165
+
166
+ it 'renders dynamic content from keys' do
167
+ expect(@property_class_content).to include('Apple and Potato Farm')
168
+ end
169
+ end
170
+
171
+ context 'without keys' do
172
+ it 'renders static content' do
173
+ @pdf = ClosedSale.new do
174
+ @rep = {foo: 'bar'}
175
+ property_class
176
+ end
177
+ @property_class_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
178
+ expect(@property_class_content).to include('Transaction Type')
179
+ end
180
+ end
181
+ end
182
+
183
+ describe 'property type and address' do
184
+ context 'with keys' do
185
+ before :each do
186
+ @pdf = ClosedSale.new do
187
+ @rep = Sampler.get_comp2
188
+ property_type_and_address
189
+ end
190
+ @property_type_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
191
+ end
192
+
193
+ it 'renders static content' do
194
+ expect(@property_type_content).to include('Property Type and Address')
195
+ end
196
+
197
+ it 'renders dynamic content from keys' do
198
+ expect(@property_type_content).to include('Apple')
199
+ end
200
+ end
201
+
202
+ context 'without keys' do
203
+ it 'renders static content' do
204
+ @pdf = ClosedSale.new do
205
+ @rep = {foo: 'bar'}
206
+ property_type_and_address
207
+ end
208
+ @property_type_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
209
+ expect(@property_type_content).to include('Property Type and Address')
210
+ end
211
+ end
212
+ end
213
+
214
+ describe 'transaction summary' do
215
+ context 'with keys' do
216
+ before :each do
217
+ @pdf = ClosedSale.new do
218
+ @rep = Sampler.get_comp2
219
+ transaction_summary
220
+ end
221
+ @transaction_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
222
+ end
223
+
224
+ it 'renders static content' do
225
+ expect(@transaction_content).to include('Sale Price')
226
+ end
227
+
228
+ it 'renders dynamic content from keys' do
229
+ expect(@transaction_content).to include('950.00')
230
+ end
231
+ end
232
+
233
+ context 'without keys' do
234
+ it 'renders static content' do
235
+ @pdf = ClosedSale.new do
236
+ @rep = {foo: 'bar'}
237
+ transaction_summary
238
+ end
239
+ @transaction_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
240
+ expect(@transaction_content).to include('Sale Price')
241
+ end
242
+ end
243
+ end
244
+
245
+ describe 'physical overview' do
246
+ context 'with keys' do
247
+ before :each do
248
+ @pdf = ClosedSale.new do
249
+ @rep = Sampler.get_comp2
250
+ physical_overview
251
+ end
252
+ @physical_overview_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
253
+ end
254
+
255
+ it 'renders static content' do
256
+ expect(@physical_overview_content).to include('Physical Overview')
257
+ end
258
+
259
+ it 'renders dynamic content from keys' do
260
+ expect(@physical_overview_content).to include('Loam')
261
+ end
262
+ end
263
+
264
+ context 'without keys' do
265
+ it 'renders static content' do
266
+ @pdf = ClosedSale.new do
267
+ @rep = {foo: 'bar'}
268
+ physical_overview
269
+ end
270
+ @physical_overview_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
271
+ expect(@physical_overview_content).to include('Physical Overview')
272
+ end
273
+ end
274
+ end
275
+
276
+ describe 'income expense' do
277
+ context 'with keys' do
278
+ before :each do
279
+ @pdf = ClosedSale.new do
280
+ @rep = Sampler.get_comp2
281
+ income_expense
282
+ end
283
+ @income_expense_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
284
+ end
285
+
286
+ it 'renders static content' do
287
+ expect(@income_expense_content).to include('Farm')
288
+ end
289
+
290
+ it 'renders dynamic content from keys' do
291
+ expect(@income_expense_content).to include('$698,000')
292
+ end
293
+ end
294
+
295
+ context 'without keys' do
296
+ it 'renders static content' do
297
+ @pdf = ClosedSale.new do
298
+ @rep = {foo: 'bar'}
299
+ income_expense
300
+ end
301
+ @income_expense_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
302
+ expect(@income_expense_content).to include('Farm')
303
+ end
304
+ end
305
+ end
306
+
307
+ describe 'legal transaction' do
308
+ context 'with keys' do
309
+ before :each do
310
+ @pdf = ClosedSale.new do
311
+ @rep = Sampler.get_comp2
312
+ legal_transaction
313
+ end
314
+ @legal_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
315
+ end
316
+
317
+ it 'renders static content' do
318
+ expect(@legal_content).to include('Legal/Transaction Detail')
319
+ end
320
+
321
+ it 'renders dynamic content from keys' do
322
+ expect(@legal_content).to include('06750')
323
+ end
324
+ end
325
+
326
+ context 'without keys' do
327
+ it 'renders static content' do
328
+ @pdf = ClosedSale.new do
329
+ @rep = {foo: 'bar'}
330
+ legal_transaction
331
+ end
332
+ @legal_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
333
+ expect(@legal_content).to include('Legal/Transaction Detail')
334
+ end
335
+ end
336
+ end
337
+
338
+ describe 'transaction history' do
339
+ context 'with keys' do
340
+ before :each do
341
+ @pdf = ClosedSale.new do
342
+ @rep = Sampler.get_comp2
343
+ transaction_history
344
+ end
345
+ @transaction_history_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
346
+ end
347
+
348
+ it 'renders static content' do
349
+ expect(@transaction_history_content).to include('Historic')
350
+ end
351
+
352
+ it 'renders dynamic content from keys' do
353
+ expect(@transaction_history_content).to include('Prior Transfer of Title')
354
+ end
355
+ end
356
+
357
+ context 'without keys' do
358
+ it 'renders static content' do
359
+ @pdf = ClosedSale.new do
360
+ @rep = {foo: 'bar'}
361
+ transaction_history
362
+ end
363
+ @transaction_history_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
364
+ expect(@transaction_history_content).to include('Historic')
365
+ end
366
+ end
367
+ end
368
+
369
+ describe 'utilities' do
370
+ context 'with keys' do
371
+ before :each do
372
+ @pdf = ClosedSale.new do
373
+ @rep = Sampler.get_comp2
374
+ utilities
375
+ end
376
+ @utilities_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
377
+ end
378
+
379
+ it 'renders static content' do
380
+ expect(@utilities_content).to include('Utility Description')
381
+ end
382
+
383
+ it 'renders dynamic content from keys' do
384
+ expect(@utilities_content).to include('Electricity')
385
+ end
386
+ end
387
+
388
+ context 'without keys' do
389
+ it 'renders static content' do
390
+ @pdf = ClosedSale.new do
391
+ @rep = {foo: 'bar'}
392
+ utilities
393
+ end
394
+ @utilities_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
395
+ expect(@utilities_content).to include('Utility Description')
396
+ end
397
+ end
398
+ end
399
+
400
+ describe 'improvements' do
401
+ context 'with keys' do
402
+ before :each do
403
+ @pdf = ClosedSale.new do
404
+ @rep = Sampler.get_comp2
405
+ improvements
406
+ end
407
+ @improvements_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
408
+ end
409
+
410
+ it 'renders static content' do
411
+ expect(@improvements_content).to include('Unit')
412
+ end
413
+
414
+ it 'renders dynamic content from keys' do
415
+ expect(@improvements_content).to include('Shop')
416
+ end
417
+ end
418
+
419
+ context 'without keys' do
420
+ it 'renders static content' do
421
+ @pdf = ClosedSale.new do
422
+ @rep = {foo: 'bar'}
423
+ improvements
424
+ end
425
+
426
+ @improvements_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
427
+ expect(@improvements_content).to include('Unit')
428
+ end
429
+ end
430
+ end
431
+
432
+ describe 'water_rights' do
433
+ context 'with keys' do
434
+ before :each do
435
+ @pdf = ClosedSale.new do
436
+ @rep = Sampler.get_comp2
437
+ water_rights
438
+ end
439
+ @water_rights_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
440
+ end
441
+
442
+ it 'renders static content' do
443
+ expect(@water_rights_content).to include('Source')
444
+ end
445
+
446
+ it 'renders dynamic content from keys' do
447
+ expect(@water_rights_content).to include('Surface')
448
+ end
449
+
450
+ end
451
+
452
+ context 'without keys' do
453
+ it 'renders static content' do
454
+ @pdf = ClosedSale.new do
455
+ @rep = {foo: 'bar'}
456
+ water_rights
457
+ end
458
+ @water_rights_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
459
+ expect(@water_rights_content).to include('Source')
460
+ end
461
+ end
462
+ end
463
+
464
+ describe 'water_distribution' do
465
+ context 'with keys' do
466
+ before :each do
467
+ @pdf = ClosedSale.new do
468
+ @rep = Sampler.get_comp2
469
+ water_distribution
470
+ end
471
+ page1 = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
472
+ page2 = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
473
+ @water_distribution_content = page1 + page2
474
+ end
475
+
476
+ it 'renders static content' do
477
+ expect(@water_distribution_content).to include('Type')
478
+ end
479
+
480
+ it 'renders dynamic content from keys' do
481
+ expect(@water_distribution_content).to include('Pump')
482
+ end
483
+
484
+ end
485
+
486
+ context 'without keys' do
487
+ it 'renders static content' do
488
+ @pdf = ClosedSale.new do
489
+ @rep = {foo: 'bar'}
490
+ water_distribution
491
+ end
492
+ @water_distribution_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
493
+ expect(@water_distribution_content).to include('Type')
494
+ end
495
+ end
496
+ end
497
+
498
+ describe 'crop_yield' do
499
+ context 'with keys' do
500
+ before :each do
501
+ @pdf = ClosedSale.new do
502
+ @rep = Sampler.get_comp2
503
+ crop_yield
504
+ end
505
+ @crop_yield_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
506
+ end
507
+
508
+ it 'renders static content' do
509
+ expect(@crop_yield_content).to include('Commodity')
510
+ end
511
+
512
+ it 'renders dynamic content from keys' do
513
+ expect(@crop_yield_content).to include('2010')
514
+ end
515
+
516
+ end
517
+
518
+ context 'without keys' do
519
+ it 'renders static content' do
520
+ @pdf = ClosedSale.new do
521
+ @rep = {foo: 'bar'}
522
+ crop_yield
523
+ end
524
+ @crop_yield_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
525
+ expect(@crop_yield_content).to include('Crop')
526
+ end
527
+ end
528
+ end
529
+
530
+ describe 'estimated productivity' do
531
+ context 'with keys' do
532
+ it 'renders static content' do
533
+ @pdf = ClosedSale.new do
534
+ @rep = Sampler.get_comp2
535
+ estimated_productivity
536
+ end
537
+ @productivity_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
538
+ expect(@productivity_content).to include('Commodity')
539
+ end
540
+
541
+ it 'renders dynamic content from keys' do
542
+ @pdf = ClosedSale.new do
543
+ @rep = Sampler.get_comp2
544
+ estimated_productivity
545
+ end
546
+ @productivity_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
547
+ expect(@productivity_content).to include('Corn')
548
+ end
549
+ end
550
+
551
+ context 'without keys' do
552
+ it 'renders static content' do
553
+ @pdf = ClosedSale.new do
554
+ @rep = {foo: 'bar'}
555
+ estimated_productivity
556
+ end
557
+ @productivity_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
558
+ expect(@productivity_content).to include('Commodity')
559
+ end
560
+ end
561
+ end
562
+
563
+ describe 'perm_plantings' do
564
+ context 'with keys' do
565
+ before :each do
566
+ @pdf = ClosedSale.new do
567
+ @rep = Sampler.get_comp2
568
+ perm_plantings
569
+ end
570
+ @perm_plantings_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
571
+ end
572
+
573
+ it 'renders static content' do
574
+ expect(@perm_plantings_content).to include('Variety')
575
+ end
576
+
577
+ it 'renders dynamic content from keys' do
578
+ expect(@perm_plantings_content).to include('Apples')
579
+ end
580
+
581
+ end
582
+
583
+ context 'without keys' do
584
+ it 'renders static content' do
585
+ @pdf = ClosedSale.new do
586
+ @rep = {foo: 'bar'}
587
+ perm_plantings
588
+ end
589
+ @perm_plantings_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
590
+ expect(@perm_plantings_content).to include('Variety')
591
+ end
592
+ end
593
+ end
594
+
595
+ describe 'externalities' do
596
+ context 'with keys' do
597
+ before :each do
598
+ @pdf = ClosedSale.new do
599
+ @rep = Sampler.get_comp2
600
+ externalities
601
+ end
602
+ @externalities_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
603
+ end
604
+
605
+ it 'renders static content' do
606
+ expect(@externalities_content).to include('Are')
607
+ end
608
+
609
+ it 'renders dynamic content from keys' do
610
+ expect(@externalities_content).to include('Triple Blade')
611
+ end
612
+
613
+ end
614
+
615
+ context 'without keys' do
616
+ it 'renders static content' do
617
+ @pdf = ClosedSale.new do
618
+ @rep = {foo: 'bar'}
619
+ externalities
620
+ end
621
+ @externalities_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
622
+ expect(@externalities_content).to include('waste')
623
+ end
624
+ end
625
+ end
626
+ end