salesforce_certification_calculator 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +114 -0
- data/Rakefile +15 -0
- data/bin/salesforce_certification_calculator +5 -0
- data/data/Administrator-Spring2022.xml +40 -0
- data/data/AdvancedAdministrator-Spring2022.xml +40 -0
- data/data/B2BSolutionArchitect-Spring2022.xml +30 -0
- data/data/B2CSolutionArchitect-Spring2022.xml +30 -0
- data/data/DataArchitect-Spring2022.xml +35 -0
- data/data/DevelopmentLifecycleAndDeploymentArchitect-Spring2022.xml +45 -0
- data/data/EducationCloudConsultant-Spring2022.xml +35 -0
- data/data/ExperienceCloudConsultant-Spring2022.xml +45 -0
- data/data/IdentityAndAccessManagementArchitect-Spring2022.xml +35 -0
- data/data/IntegrationArchitect-Spring2022.xml +35 -0
- data/data/JavaScriptDeveloperI-Spring2022.xml +40 -0
- data/data/MarketingCloudAdministrator-Spring2022.xml +30 -0
- data/data/MarketingCloudConsultant-Spring2022.xml +35 -0
- data/data/MarketingCloudDeveloper-Spring2022.xml +30 -0
- data/data/MarketingCloudEmailSpecialist-Spring2022.xml +30 -0
- data/data/PlatformAppBuilder-Spring2022.xml +30 -0
- data/data/PlatformDeveloperI-Spring2022.xml +25 -0
- data/data/PlatformDeveloperII-Spring2022.xml +30 -0
- data/data/SalesCloudConsultant-Spring2022.xml +55 -0
- data/data/ServiceCloudConsultant-Spring2022.xml +50 -0
- data/data/SharingAndVisibilityArchitect-Spring2022.xml +20 -0
- data/lib/salesforce_certification_calculator/exam.rb +63 -0
- data/lib/salesforce_certification_calculator/file_reader.rb +53 -0
- data/lib/salesforce_certification_calculator/section.rb +25 -0
- data/lib/salesforce_certification_calculator/u_i.rb +107 -0
- data/lib/salesforce_certification_calculator.rb +92 -0
- data/test/test_exam.rb +498 -0
- data/test/test_file_reader.rb +65 -0
- data/test/test_salesforce_certification_calculator.rb +189 -0
- data/test/test_section.rb +59 -0
- data/test/test_u_i.rb +297 -0
- metadata +98 -0
data/test/test_exam.rb
ADDED
@@ -0,0 +1,498 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "nokogiri"
|
3
|
+
require "salesforce_certification_calculator"
|
4
|
+
|
5
|
+
class ExamTest < Minitest::Test
|
6
|
+
Exam = SalesforceCertificationCalculator::Exam
|
7
|
+
@@exam = Exam.new
|
8
|
+
@@methods = @@exam.methods
|
9
|
+
|
10
|
+
def test_initialize_title_exists
|
11
|
+
assert_includes @@methods, :title, "should create an object with a title attribute"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_initialize_title_setter
|
15
|
+
assert_includes @@methods, :title=, "should create an object with a method for setting the title attribute"
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialize_title_string
|
19
|
+
assert_instance_of String, @@exam.title, "should create an object with a title attribute of type string"
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialize_file_exists
|
23
|
+
assert_includes @@methods, :file, "should create an object with a file attribute"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_initialize_file_setter
|
27
|
+
assert_includes @@methods, :file=, "should create an object with a method for setting the file attribute"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_initialize_file_string
|
31
|
+
assert_instance_of String, @@exam.file, "should create an object with a file attribute of type string"
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_initialize_sections_exists
|
35
|
+
assert_includes @@methods, :sections, "should create an object with a sections attribute"
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_initialize_sections_array
|
39
|
+
assert_instance_of Array, @@exam.sections, "should create an object with a sections attribute of type array"
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_initialize_total_exists
|
43
|
+
assert_includes @@methods, :total, "should create an object with a total attribute"
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_initialize_total_integer
|
47
|
+
assert_instance_of Integer, @@exam.total, "should create an object with a total attribute of type integer"
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_add_section_exists
|
51
|
+
assert_includes @@methods, :add_section, "should create an object with a method called add_section"
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_calculate_total_exists
|
55
|
+
assert_includes @@methods, :calculate_total, "should create an object with a method called calculate_total"
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_add_section_name_weight_increments
|
59
|
+
initial_sections = @@exam.sections.length
|
60
|
+
@@exam.add_section("Database", 24)
|
61
|
+
updated_sections = @@exam.sections.length
|
62
|
+
|
63
|
+
assert_equal initial_sections + 1, updated_sections, "should add a new section to exam object when invoke add_section method without score"
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_add_section_name_weight_default_0_score
|
67
|
+
@@exam.add_section("Database", 24)
|
68
|
+
sections_length = @@exam.sections.length
|
69
|
+
recent_section = @@exam.sections[sections_length - 1]
|
70
|
+
|
71
|
+
assert_equal 0, recent_section.score, "should give new section a score of 0 if no score parameter supplied"
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_add_section_name_weight_score_increments
|
75
|
+
initial_sections = @@exam.sections.length
|
76
|
+
@@exam.add_section("Database", 24, 80)
|
77
|
+
updated_sections = @@exam.sections.length
|
78
|
+
|
79
|
+
assert_equal initial_sections + 1, updated_sections, "should add a new section to exam object when invoke add_section method with score"
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_add_section_name_weight_score_new_value
|
83
|
+
score_value = 80
|
84
|
+
@@exam.add_section("Database", 24, score_value)
|
85
|
+
sections_length = @@exam.sections.length
|
86
|
+
recent_section = @@exam.sections[sections_length - 1]
|
87
|
+
|
88
|
+
assert_equal score_value, recent_section.score, "should give new section a score matching the score parameter if supplied"
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_calculate_total_1_section
|
92
|
+
exam = Exam.new
|
93
|
+
exam.add_section("Database", 100, 65)
|
94
|
+
exam.calculate_total
|
95
|
+
|
96
|
+
assert_equal 65, exam.total, "should set total to first section's score if exam contains only 1 section with a weight of 100 after invoking calculate_total"
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_calculate_total_2_sections
|
100
|
+
exam = Exam.new
|
101
|
+
exam.add_section("Database", 40, 65)
|
102
|
+
exam.add_section("Application", 60, 85)
|
103
|
+
exam.calculate_total
|
104
|
+
|
105
|
+
assert_equal 77, exam.total, "should set total correctly when calculate_total called on exam containing 2 sections"
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_calculate_total_3_sections
|
109
|
+
exam = Exam.new
|
110
|
+
exam.add_section("Database", 25, 62)
|
111
|
+
exam.add_section("Application", 35, 83)
|
112
|
+
exam.add_section("Program", 40, 54)
|
113
|
+
exam.calculate_total
|
114
|
+
|
115
|
+
assert_equal 66.15, exam.total, "should set total correctly when calculate_total called on exam containing 3 sections"
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_calculate_total_many_sections
|
119
|
+
exam = Exam.new
|
120
|
+
exam.add_section("Section 1", 5, 82)
|
121
|
+
exam.add_section("Section 2", 6, 93)
|
122
|
+
exam.add_section("Section 3", 7, 54)
|
123
|
+
exam.add_section("Section 4", 8, 62)
|
124
|
+
exam.add_section("Section 5", 9, 80)
|
125
|
+
exam.add_section("Section 6", 10, 40)
|
126
|
+
exam.add_section("Section 7", 12, 50)
|
127
|
+
exam.add_section("Section 8", 13, 60)
|
128
|
+
exam.add_section("Section 9", 14, 70)
|
129
|
+
exam.add_section("Section 10", 16, 65)
|
130
|
+
exam.calculate_total
|
131
|
+
|
132
|
+
assert_equal 63.62, exam.total, "should set total correctly when calculate_total called on exam containing multiple sections"
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_calculate_total_administrator
|
136
|
+
exam = Exam.new
|
137
|
+
exam.file = "data/Administrator-Spring2022.xml"
|
138
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
139
|
+
names = doc.xpath("//name")
|
140
|
+
weights = doc.xpath("//weight")
|
141
|
+
|
142
|
+
(0..names.length-1).each do |i|
|
143
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
144
|
+
end
|
145
|
+
|
146
|
+
exam.calculate_total
|
147
|
+
|
148
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Administrator data"
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_calculate_total_advanced_administrator
|
152
|
+
exam = Exam.new
|
153
|
+
exam.file = "data/AdvancedAdministrator-Spring2022.xml"
|
154
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
155
|
+
names = doc.xpath("//name")
|
156
|
+
weights = doc.xpath("//weight")
|
157
|
+
|
158
|
+
(0..names.length-1).each do |i|
|
159
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
160
|
+
end
|
161
|
+
|
162
|
+
exam.calculate_total
|
163
|
+
|
164
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Advanced Administrator data"
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_calculate_total_b2b_solution_architect
|
168
|
+
exam = Exam.new
|
169
|
+
exam.file = "data/B2BSolutionArchitect-Spring2022.xml"
|
170
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
171
|
+
names = doc.xpath("//name")
|
172
|
+
weights = doc.xpath("//weight")
|
173
|
+
|
174
|
+
(0..names.length-1).each do |i|
|
175
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
176
|
+
end
|
177
|
+
|
178
|
+
exam.calculate_total
|
179
|
+
|
180
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with B2B Solution Architect data"
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_calculate_total_b2c_solution_architect
|
184
|
+
exam = Exam.new
|
185
|
+
exam.file = "data/B2CSolutionArchitect-Spring2022.xml"
|
186
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
187
|
+
names = doc.xpath("//name")
|
188
|
+
weights = doc.xpath("//weight")
|
189
|
+
|
190
|
+
(0..names.length-1).each do |i|
|
191
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
192
|
+
end
|
193
|
+
|
194
|
+
exam.calculate_total
|
195
|
+
|
196
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with B2C Solution Architect data"
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_calculate_total_data_architect
|
200
|
+
exam = Exam.new
|
201
|
+
exam.file = "data/DataArchitect-Spring2022.xml"
|
202
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
203
|
+
names = doc.xpath("//name")
|
204
|
+
weights = doc.xpath("//weight")
|
205
|
+
|
206
|
+
(0..names.length-1).each do |i|
|
207
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
208
|
+
end
|
209
|
+
|
210
|
+
exam.calculate_total
|
211
|
+
|
212
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Data Architect data"
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_calculate_total_development_lifecycle_and_deployment_architect
|
216
|
+
exam = Exam.new
|
217
|
+
exam.file = "data/DevelopmentLifecycleAndDeploymentArchitect-Spring2022.xml"
|
218
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
219
|
+
names = doc.xpath("//name")
|
220
|
+
weights = doc.xpath("//weight")
|
221
|
+
|
222
|
+
(0..names.length-1).each do |i|
|
223
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
224
|
+
end
|
225
|
+
|
226
|
+
exam.calculate_total
|
227
|
+
|
228
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Development Lifecycle and Deployment Architect data"
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_calculate_total_education_cloud_consultant
|
232
|
+
exam = Exam.new
|
233
|
+
exam.file = "data/EducationCloudConsultant-Spring2022.xml"
|
234
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
235
|
+
names = doc.xpath("//name")
|
236
|
+
weights = doc.xpath("//weight")
|
237
|
+
|
238
|
+
(0..names.length-1).each do |i|
|
239
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
240
|
+
end
|
241
|
+
|
242
|
+
exam.calculate_total
|
243
|
+
|
244
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Education Cloud Consultant data"
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_calculate_total_experience_cloud_consultant
|
248
|
+
exam = Exam.new
|
249
|
+
exam.file = "data/ExperienceCloudConsultant-Spring2022.xml"
|
250
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
251
|
+
names = doc.xpath("//name")
|
252
|
+
weights = doc.xpath("//weight")
|
253
|
+
|
254
|
+
(0..names.length-1).each do |i|
|
255
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
256
|
+
end
|
257
|
+
|
258
|
+
exam.calculate_total
|
259
|
+
|
260
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Experience Cloud Consultant data"
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_calculate_total_identity_and_access_management_architect
|
264
|
+
exam = Exam.new
|
265
|
+
exam.file = "data/IdentityAndAccessManagementArchitect-Spring2022.xml"
|
266
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
267
|
+
names = doc.xpath("//name")
|
268
|
+
weights = doc.xpath("//weight")
|
269
|
+
|
270
|
+
(0..names.length-1).each do |i|
|
271
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
272
|
+
end
|
273
|
+
|
274
|
+
exam.calculate_total
|
275
|
+
|
276
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Identity and Access Management Architect data"
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_calculate_total_integration_architect
|
280
|
+
exam = Exam.new
|
281
|
+
exam.file = "data/IntegrationArchitect-Spring2022.xml"
|
282
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
283
|
+
names = doc.xpath("//name")
|
284
|
+
weights = doc.xpath("//weight")
|
285
|
+
|
286
|
+
(0..names.length-1).each do |i|
|
287
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
288
|
+
end
|
289
|
+
|
290
|
+
exam.calculate_total
|
291
|
+
|
292
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Integration Architect data"
|
293
|
+
end
|
294
|
+
|
295
|
+
def test_calculate_total_javascript_developer_i
|
296
|
+
exam = Exam.new
|
297
|
+
exam.file = "data/JavaScriptDeveloperI-Spring2022.xml"
|
298
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
299
|
+
names = doc.xpath("//name")
|
300
|
+
weights = doc.xpath("//weight")
|
301
|
+
|
302
|
+
(0..names.length-1).each do |i|
|
303
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
304
|
+
end
|
305
|
+
|
306
|
+
exam.calculate_total
|
307
|
+
|
308
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with JavaScript Developer I data"
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_calculate_total_marketing_cloud_administrator
|
312
|
+
exam = Exam.new
|
313
|
+
exam.file = "data/MarketingCloudAdministrator-Spring2022.xml"
|
314
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
315
|
+
names = doc.xpath("//name")
|
316
|
+
weights = doc.xpath("//weight")
|
317
|
+
|
318
|
+
(0..names.length-1).each do |i|
|
319
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
320
|
+
end
|
321
|
+
|
322
|
+
exam.calculate_total
|
323
|
+
|
324
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Marketing Cloud Administrator data"
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_calculate_total_marketing_cloud_consultant
|
328
|
+
exam = Exam.new
|
329
|
+
exam.file = "data/MarketingCloudConsultant-Spring2022.xml"
|
330
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
331
|
+
names = doc.xpath("//name")
|
332
|
+
weights = doc.xpath("//weight")
|
333
|
+
|
334
|
+
(0..names.length-1).each do |i|
|
335
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
336
|
+
end
|
337
|
+
|
338
|
+
exam.calculate_total
|
339
|
+
|
340
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Marketing Cloud Consultant data"
|
341
|
+
end
|
342
|
+
|
343
|
+
def test_calculate_total_marketing_cloud_developer
|
344
|
+
exam = Exam.new
|
345
|
+
exam.file = "data/MarketingCloudDeveloper-Spring2022.xml"
|
346
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
347
|
+
names = doc.xpath("//name")
|
348
|
+
weights = doc.xpath("//weight")
|
349
|
+
|
350
|
+
(0..names.length-1).each do |i|
|
351
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
352
|
+
end
|
353
|
+
|
354
|
+
exam.calculate_total
|
355
|
+
|
356
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Marketing Cloud Developer data"
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_calculate_total_marketing_cloud_email_specialist
|
360
|
+
exam = Exam.new
|
361
|
+
exam.file = "data/MarketingCloudEmailSpecialist-Spring2022.xml"
|
362
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
363
|
+
names = doc.xpath("//name")
|
364
|
+
weights = doc.xpath("//weight")
|
365
|
+
|
366
|
+
(0..names.length-1).each do |i|
|
367
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
368
|
+
end
|
369
|
+
|
370
|
+
exam.calculate_total
|
371
|
+
|
372
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Marketing Cloud Email Specialist data"
|
373
|
+
end
|
374
|
+
|
375
|
+
def test_calculate_total_platform_app_builder
|
376
|
+
exam = Exam.new
|
377
|
+
exam.file = "data/PlatformAppBuilder-Spring2022.xml"
|
378
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
379
|
+
names = doc.xpath("//name")
|
380
|
+
weights = doc.xpath("//weight")
|
381
|
+
|
382
|
+
(0..names.length-1).each do |i|
|
383
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
384
|
+
end
|
385
|
+
|
386
|
+
exam.calculate_total
|
387
|
+
|
388
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Platform App Builder data"
|
389
|
+
end
|
390
|
+
|
391
|
+
def test_calculate_total_platform_developer_i
|
392
|
+
exam = Exam.new
|
393
|
+
exam.file = "data/PlatformDeveloperI-Spring2022.xml"
|
394
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
395
|
+
names = doc.xpath("//name")
|
396
|
+
weights = doc.xpath("//weight")
|
397
|
+
|
398
|
+
(0..names.length-1).each do |i|
|
399
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
400
|
+
end
|
401
|
+
|
402
|
+
exam.calculate_total
|
403
|
+
|
404
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Platform Developer I data"
|
405
|
+
end
|
406
|
+
|
407
|
+
def test_calculate_total_platform_developer_ii
|
408
|
+
exam = Exam.new
|
409
|
+
exam.file = "data/PlatformDeveloperII-Spring2022.xml"
|
410
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
411
|
+
names = doc.xpath("//name")
|
412
|
+
weights = doc.xpath("//weight")
|
413
|
+
|
414
|
+
(0..names.length-1).each do |i|
|
415
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
416
|
+
end
|
417
|
+
|
418
|
+
exam.calculate_total
|
419
|
+
|
420
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Platform Developer II data"
|
421
|
+
end
|
422
|
+
|
423
|
+
def test_calculate_total_sales_cloud_consultant
|
424
|
+
exam = Exam.new
|
425
|
+
exam.file = "data/SalesCloudConsultant-Spring2022.xml"
|
426
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
427
|
+
names = doc.xpath("//name")
|
428
|
+
weights = doc.xpath("//weight")
|
429
|
+
|
430
|
+
(0..names.length-1).each do |i|
|
431
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
432
|
+
end
|
433
|
+
|
434
|
+
exam.calculate_total
|
435
|
+
|
436
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Sales Cloud Consultant data"
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_calculate_total_service_cloud_consultant
|
440
|
+
exam = Exam.new
|
441
|
+
exam.file = "data/ServiceCloudConsultant-Spring2022.xml"
|
442
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
443
|
+
names = doc.xpath("//name")
|
444
|
+
weights = doc.xpath("//weight")
|
445
|
+
|
446
|
+
(0..names.length-1).each do |i|
|
447
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
448
|
+
end
|
449
|
+
|
450
|
+
exam.calculate_total
|
451
|
+
|
452
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Service Cloud Consultant data"
|
453
|
+
end
|
454
|
+
|
455
|
+
def test_calculate_total_sharing_and_visibility_architect
|
456
|
+
exam = Exam.new
|
457
|
+
exam.file = "data/SharingAndVisibilityArchitect-Spring2022.xml"
|
458
|
+
doc = File.open(exam.file) { |f| Nokogiri::XML(f) }
|
459
|
+
names = doc.xpath("//name")
|
460
|
+
weights = doc.xpath("//weight")
|
461
|
+
|
462
|
+
(0..names.length-1).each do |i|
|
463
|
+
exam.add_section(names[i].content, weights[i].content.to_i, 100)
|
464
|
+
end
|
465
|
+
|
466
|
+
exam.calculate_total
|
467
|
+
|
468
|
+
assert_equal 100, exam.total, "should set total correctly when calculate_total called on exam with Sharing and Visibility Architect data"
|
469
|
+
end
|
470
|
+
|
471
|
+
def test_calculate_total_fails_low
|
472
|
+
exam = Exam.new
|
473
|
+
exam.add_section("Section 1", 10, 100)
|
474
|
+
exam.add_section("Section 2", 15, 80)
|
475
|
+
exam.add_section("Section 3", 20, 60)
|
476
|
+
exam.calculate_total
|
477
|
+
|
478
|
+
assert_equal "CANNOT CALCULATE", exam.total, "should set total to CANNOT CALCULATE when calculate_total called on exam with section weights that add up to less than 100"
|
479
|
+
end
|
480
|
+
|
481
|
+
def test_calculate_total_fails_high
|
482
|
+
exam = Exam.new
|
483
|
+
exam.add_section("Section 1", 20, 100)
|
484
|
+
exam.add_section("Section 2", 30, 80)
|
485
|
+
exam.add_section("Section 3", 40, 60)
|
486
|
+
exam.add_section("Section 4", 50, 70)
|
487
|
+
exam.calculate_total
|
488
|
+
|
489
|
+
assert_equal "CANNOT CALCULATE", exam.total, "should set total to CANNOT CALCULATE when calculate_total called on exam with section weights that add up to more than 100"
|
490
|
+
end
|
491
|
+
|
492
|
+
def test_calculate_total_fails_no_sections
|
493
|
+
exam = Exam.new
|
494
|
+
exam.calculate_total
|
495
|
+
|
496
|
+
assert_equal "CANNOT CALCULATE", exam.total, "should set total to CANNOT CALCULATE when calculate_total called on exam with no sections"
|
497
|
+
end
|
498
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "salesforce_certification_calculator"
|
3
|
+
|
4
|
+
class FileReaderTest < Minitest::Test
|
5
|
+
FR = SalesforceCertificationCalculator::FileReader
|
6
|
+
Exam = SalesforceCertificationCalculator::Exam
|
7
|
+
reader = FR.new
|
8
|
+
@@methods = reader.methods
|
9
|
+
@@exams = reader.generate_exams_list
|
10
|
+
@@exam = reader.extract_initial_exam_data(reader.generate_exams_list[0])
|
11
|
+
|
12
|
+
def test_generate_exams_list_exists
|
13
|
+
assert_includes @@methods, :generate_exams_list, "should create an object with a method called generate_exams_list"
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_extract_initial_exam_data_exists
|
17
|
+
assert_includes @@methods, :extract_initial_exam_data, "should create an object with a method called extract_initial_exam_data"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_generate_exams_list_returns_array
|
21
|
+
assert_instance_of Array, @@exams, "should return array when invoke generate_exams_list"
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_generate_exams_list_contains_21_items
|
25
|
+
assert_equal 21, @@exams.length, "should return array with 21 elements when invoke generate_exams_list"
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_generate_exams_list_contains_exams
|
29
|
+
@@exams.each do |exam|
|
30
|
+
assert_instance_of Exam, exam, "should return array of Exam objects when invoke generate_exams_list"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_generate_exams_list_returns_no_sections
|
35
|
+
@@exams.each do |exam|
|
36
|
+
assert_equal 0, exam.sections.length, "should not return any sections on any of the exams listed"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_generate_exams_list_contains_administrator
|
41
|
+
exists = @@exams.any? { |exam| exam.title == "Administrator - Spring 2022" }
|
42
|
+
|
43
|
+
assert_equal true, exists, "should return array containing Administrator title when invoke generate_exams_list"
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_generate_exams_list_contains_multiple_marketings
|
47
|
+
marketings = 0
|
48
|
+
|
49
|
+
@@exams.each do |exam|
|
50
|
+
if exam.title.include? "Marketing"
|
51
|
+
marketings += 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
assert_operator marketings, :>, 1, "should return array containing multiple objects with titles including Marketing when invoke generate_exams_list"
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_extract_initial_exam_data_returns_exam
|
59
|
+
assert_instance_of Exam, @@exam, "should return Exam object when invoke extract_initial_exam_data"
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_extract_initial_exam_data_returns_sections
|
63
|
+
assert_operator @@exam.sections.length, :>, 0, "should return Exam object with sections when invoke extract_initial_exam_data"
|
64
|
+
end
|
65
|
+
end
|