scorm_engine 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.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Rakefile +13 -0
  4. data/lib/scorm_engine.rb +13 -0
  5. data/lib/scorm_engine/api/endpoints.rb +50 -0
  6. data/lib/scorm_engine/api/endpoints/about.rb +59 -0
  7. data/lib/scorm_engine/api/endpoints/courses.rb +136 -0
  8. data/lib/scorm_engine/api/endpoints/courses/configuration.rb +146 -0
  9. data/lib/scorm_engine/api/endpoints/courses/import.rb +83 -0
  10. data/lib/scorm_engine/api/endpoints/ping.rb +20 -0
  11. data/lib/scorm_engine/api/endpoints/registrations.rb +321 -0
  12. data/lib/scorm_engine/api/endpoints/registrations/configuration.rb +146 -0
  13. data/lib/scorm_engine/api/endpoints/registrations/launch_history.rb +47 -0
  14. data/lib/scorm_engine/client.rb +17 -0
  15. data/lib/scorm_engine/configuration.rb +43 -0
  16. data/lib/scorm_engine/faraday/connection.rb +35 -0
  17. data/lib/scorm_engine/faraday/request.rb +54 -0
  18. data/lib/scorm_engine/models.rb +9 -0
  19. data/lib/scorm_engine/models/course.rb +66 -0
  20. data/lib/scorm_engine/models/course_configuration.rb +37 -0
  21. data/lib/scorm_engine/models/course_import.rb +42 -0
  22. data/lib/scorm_engine/models/learner.rb +24 -0
  23. data/lib/scorm_engine/models/registration.rb +82 -0
  24. data/lib/scorm_engine/models/registration_activity_detail.rb +37 -0
  25. data/lib/scorm_engine/models/registration_configuration.rb +37 -0
  26. data/lib/scorm_engine/models/registration_launch_history.rb +92 -0
  27. data/lib/scorm_engine/models/registration_runtime_interaction.rb +52 -0
  28. data/lib/scorm_engine/response.rb +26 -0
  29. data/lib/scorm_engine/utils.rb +13 -0
  30. data/lib/scorm_engine/version.rb +3 -0
  31. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about/is_successful.yml +38 -0
  32. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about/knows_the_platform.yml +38 -0
  33. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about/knows_the_version.yml +38 -0
  34. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/accepts_before_option.yml +38 -0
  35. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/accepts_since_option.yml +38 -0
  36. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/is_successful.yml +38 -0
  37. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/tracks_combined_counts.yml +38 -0
  38. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/tracks_per_tenantcounts.yml +38 -0
  39. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_delete_course/fails_when_id_is_invalid.yml +38 -0
  40. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_delete_course/works.yml +32 -0
  41. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_detail/is_successful.yml +41 -0
  42. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_detail/results/sucessfully_creates_the_Course_attributes.yml +41 -0
  43. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_preview/fails_when_id_is_invalid.yml +38 -0
  44. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_preview/is_successful.yml +38 -0
  45. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_preview/results/returns_a_URL_string.yml +38 -0
  46. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_course_id_option/fetches_a_single_course_but_perhaps_multiple_versions.yml +39 -0
  47. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_course_id_option/returns_404_when_ID_is_invalid.yml +38 -0
  48. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_more_option_pagination_/returns_all_the_courses.yml +89 -0
  49. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_more_option_pagination_/returns_the_more_key_in_the_raw_response.yml +48 -0
  50. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_since_option/fails_when_passed_an_invalid_value.yml +37 -0
  51. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_since_option/works.yml +43 -0
  52. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/is_successful.yml +43 -0
  53. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/results/is_an_enumerator_of_Course_models.yml +43 -0
  54. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/results/sucessfully_creates_the_Course_attributes.yml +43 -0
  55. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration/fails_when_id_is_invalid.yml +38 -0
  56. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration/is_successful.yml +38 -0
  57. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration/results/makes_settings_available_as_key/value_pairs.yml +38 -0
  58. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/fails_when_course_id_is_invalid.yml +38 -0
  59. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  60. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/is_successful.yml +65 -0
  61. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/results/returns_the_value_as_a_string.yml +65 -0
  62. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/fails_when_id_is_invalid.yml +38 -0
  63. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/fails_when_settings_are_invalid.yml +36 -0
  64. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/is_successful.yml +32 -0
  65. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/persists_the_settings.yml +131 -0
  66. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/fails_when_course_id_is_invalid.yml +38 -0
  67. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  68. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/is_successful.yml +65 -0
  69. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/results/persists_the_changes.yml +98 -0
  70. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_get_course_import/successful_imports/works.yml +147 -0
  71. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_get_course_import/unsuccessful_imports/fails_to_import_given_an_invalid_url.yml +326 -0
  72. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_post_course_import/successful_imports/works.yml +38 -0
  73. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_post_course_import/unsuccessful_imports/fails_to_import_a_previously_existing_course.yml +36 -0
  74. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/is_successful.yml +38 -0
  75. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/reports_the_api_is_up.yml +38 -0
  76. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/with_invalid_password/is_unsuccessful.yml +41 -0
  77. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/with_invalid_password/returns_status_403.yml +41 -0
  78. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_delete_registration/is_failure_when_registration_does_not_exist.yml +38 -0
  79. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_delete_registration/is_successful_when_registration_exists.yml +32 -0
  80. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_exists/is_false_when_registration_does_not_exist.yml +38 -0
  81. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_exists/is_true_when_registration_exists.yml +36 -0
  82. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_instances/includes_results_we_expect.yml +39 -0
  83. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_instances/is_successful.yml +39 -0
  84. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_instances/returns_an_array_of_registrations.yml +39 -0
  85. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_launch_link/fails_when_id_is_invalid.yml +38 -0
  86. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_launch_link/is_successful.yml +38 -0
  87. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_launch_link/results/returns_a_URL_string.yml +38 -0
  88. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/detail/does_not_return_activity_details_by_default.yml +39 -0
  89. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/detail/returns_activity_details_if_requested.yml +41 -0
  90. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/fails_when_registration_does_not_exist.yml +38 -0
  91. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/returns_a_registration_when_it_exists.yml +39 -0
  92. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_course_id/excludes_results.yml +38 -0
  93. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_course_id/includes_results.yml +40 -0
  94. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_learner_id/excludes_results.yml +38 -0
  95. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_learner_id/includes_results.yml +39 -0
  96. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/includes_results_we_expect.yml +40 -0
  97. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/is_successful.yml +40 -0
  98. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/returns_an_array_of_registrations.yml +40 -0
  99. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_post_registration/fails_if_course_id_is_invalid.yml +36 -0
  100. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_post_registration/fails_if_registration_id_already_exists.yml +36 -0
  101. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_post_registration/is_successful.yml +61 -0
  102. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration/fails_when_id_is_invalid.yml +38 -0
  103. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration/is_successful.yml +38 -0
  104. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration/results/makes_settings_available_as_key/value_pairs.yml +38 -0
  105. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/fails_when_registration_id_is_invalid.yml +38 -0
  106. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  107. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/is_successful.yml +65 -0
  108. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/results/returns_the_value_as_a_string.yml +65 -0
  109. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/fails_when_id_is_invalid.yml +38 -0
  110. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/fails_when_settings_are_invalid.yml +36 -0
  111. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/is_successful.yml +32 -0
  112. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/persists_the_settings.yml +131 -0
  113. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/fails_when_registration_id_is_invalid.yml +38 -0
  114. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  115. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/is_successful.yml +65 -0
  116. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/results/persists_the_changes.yml +98 -0
  117. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_LaunchHistory/_get_registration_launch_history/fails_when_registration_does_not_exist.yml +38 -0
  118. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_LaunchHistory/_get_registration_launch_history/is_successful.yml +54 -0
  119. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_LaunchHistory/_get_registration_launch_history/returns_an_array_of_registration_launch_histories.yml +54 -0
  120. data/spec/fixtures/zip/Non-working SCORM.zip +0 -0
  121. data/spec/fixtures/zip/RuntimeBasicCalls_SCORM20043rdEdition.zip +0 -0
  122. data/spec/scorm_engine/api/endpoints/about_spec.rb +59 -0
  123. data/spec/scorm_engine/api/endpoints/courses/configuration_spec.rb +143 -0
  124. data/spec/scorm_engine/api/endpoints/courses/import_spec.rb +92 -0
  125. data/spec/scorm_engine/api/endpoints/courses_spec.rb +155 -0
  126. data/spec/scorm_engine/api/endpoints/ping_spec.rb +27 -0
  127. data/spec/scorm_engine/api/endpoints/registrations/configuration_spec.rb +154 -0
  128. data/spec/scorm_engine/api/endpoints/registrations/launch_history_spec.rb +46 -0
  129. data/spec/scorm_engine/api/endpoints/registrations_spec.rb +201 -0
  130. data/spec/scorm_engine/configuration_spec.rb +29 -0
  131. data/spec/scorm_engine/models/course_configuration_spec.rb +16 -0
  132. data/spec/scorm_engine/models/course_import_spec.rb +86 -0
  133. data/spec/scorm_engine/models/course_spec.rb +92 -0
  134. data/spec/scorm_engine/models/learner_spec.rb +27 -0
  135. data/spec/scorm_engine/models/registration_activity_detail_spec.rb +101 -0
  136. data/spec/scorm_engine/models/registration_launch_history_spec.rb +86 -0
  137. data/spec/scorm_engine/models/registration_runtime_interaction_spec.rb +91 -0
  138. data/spec/scorm_engine/models/registration_spec.rb +82 -0
  139. data/spec/scorm_engine/utils_spec.rb +15 -0
  140. data/spec/scorm_engine/version_spec.rb +5 -0
  141. data/spec/scorm_engine_spec.rb +2 -0
  142. data/spec/spec_helper.rb +47 -0
  143. data/spec/support/scorm_engine.rb +72 -0
  144. data/spec/support/scorm_engine_client.rb +6 -0
  145. data/spec/support/scorm_engine_configuration.rb +7 -0
  146. data/spec/support/vcr.rb +53 -0
  147. metadata +329 -0
@@ -0,0 +1,201 @@
1
+ RSpec.describe ScormEngine::Api::Endpoints::Registrations do
2
+ let(:subject) { scorm_engine_client }
3
+
4
+ let(:registration_options) { {
5
+ course_id: "testing-golf-explained",
6
+ registration_id: "testing-golf-explained-registration-1",
7
+ learner: {
8
+ id: "testing-golf-explained-learner-1",
9
+ first_name: "Arnold",
10
+ last_name: "Palmer",
11
+ }
12
+ } }
13
+
14
+ before do
15
+ against_real_scorm_engine do
16
+ ensure_course_exists(client: subject, course_id: registration_options[:course_id])
17
+ ensure_registration_exists(registration_options.merge(client: subject))
18
+ ensure_course_exists(client: subject, course_id: registration_options[:course_id] + "-no-registrations")
19
+ end
20
+ end
21
+
22
+ describe "#get_registrations" do
23
+ let(:registrations) { subject.get_registrations }
24
+
25
+ it "is successful" do
26
+ expect(registrations.success?).to eq true
27
+ end
28
+
29
+ it "returns an array of registrations" do
30
+ expect(registrations.result.all? { |r| r.is_a?(ScormEngine::Models::Registration) }).to eq true
31
+ end
32
+
33
+ it "includes results we expect" do
34
+ reg = registrations.result.detect { |r| r.id == registration_options[:registration_id] }
35
+ expect(reg).not_to be nil
36
+ end
37
+
38
+ describe "filtering by course_id" do
39
+ it "includes results" do
40
+ registrations = subject.get_registrations(course_id: registration_options[:course_id])
41
+ reg = registrations.result.detect { |r| r.id == registration_options[:registration_id] }
42
+ expect(reg).not_to be nil
43
+ end
44
+
45
+ it "excludes results" do
46
+ registrations = subject.get_registrations(course_id: registration_options[:course_id] + "-no-registrations")
47
+ reg = registrations.result.detect { |r| r.id == registration_options[:registration_id] }
48
+ expect(reg).to be nil
49
+ end
50
+ end
51
+
52
+ describe "filtering by learner_id" do
53
+ it "includes results" do
54
+ registrations = subject.get_registrations(learner_id: registration_options[:learner][:id])
55
+ reg = registrations.result.detect { |r| r.id == registration_options[:registration_id] }
56
+ expect(reg).not_to be nil
57
+ end
58
+
59
+ it "excludes results" do
60
+ registrations = subject.get_registrations(learner_id: "some-other-learner-id")
61
+ reg = registrations.result.detect { |r| r.id == registration_options[:registration_id] }
62
+ expect(reg).to be nil
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "#get_registration_instances" do
68
+ let(:registrations) { subject.get_registration_instances(registration_id: registration_options[:registration_id]) }
69
+
70
+ it "is successful" do
71
+ expect(registrations.success?).to eq true
72
+ end
73
+
74
+ it "returns an array of registrations" do
75
+ expect(registrations.result.all? { |r| r.is_a?(ScormEngine::Models::Registration) }).to eq true
76
+ end
77
+
78
+ it "includes results we expect" do
79
+ reg = registrations.result.detect { |r| r.id == registration_options[:registration_id] }
80
+ expect(reg).not_to be nil
81
+ end
82
+ end
83
+
84
+ describe "#get_registration_exists" do
85
+ it "is true when registration exists" do
86
+ response = subject.get_registration_exists(registration_id: registration_options[:registration_id])
87
+ aggregate_failures do
88
+ expect(response.success?).to eq true
89
+ expect(response.result).to eq true
90
+ end
91
+ end
92
+
93
+ it "is false when registration does not exist" do
94
+ response = subject.get_registration_exists(registration_id: "reg-does-not-exist")
95
+ aggregate_failures do
96
+ expect(response.result).to eq false
97
+ expect(response.status).to eq 404
98
+ end
99
+ end
100
+ end
101
+
102
+ describe "#get_registration_progress" do
103
+ it "returns a registration when it exists" do
104
+ response = subject.get_registration_progress(registration_id: registration_options[:registration_id])
105
+ aggregate_failures do
106
+ expect(response.success?).to eq true
107
+ expect(response.result).to be_a ScormEngine::Models::Registration
108
+ expect(response.result.id).to eq registration_options[:registration_id]
109
+ end
110
+ end
111
+
112
+ it "fails when registration does not exist" do
113
+ response = subject.get_registration_progress(registration_id: "reg-does-not-exist")
114
+ aggregate_failures do
115
+ expect(response.success?).to eq false
116
+ expect(response.status).to eq 404
117
+ expect(response.result).to be_falsey
118
+ end
119
+ end
120
+
121
+ context "detail" do
122
+ it "does not return activity_details by default" do
123
+ response = subject.get_registration_progress(registration_id: registration_options[:registration_id])
124
+ expect(response.result.activity_details).to eq nil
125
+ end
126
+
127
+ it "returns activity_details if requested" do
128
+ response = subject.get_registration_progress(registration_id: registration_options[:registration_id], detail: true)
129
+ expect(response.result.activity_details).to be_a ScormEngine::Models::RegistrationActivityDetail
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "#delete_registration" do
135
+ it "is successful when registration exists" do
136
+ response = subject.delete_registration(registration_id: registration_options[:registration_id])
137
+ aggregate_failures do
138
+ expect(response.success?).to eq true
139
+ end
140
+ end
141
+
142
+ it "is failure when registration does not exist" do
143
+ response = subject.delete_registration(registration_id: "reg-does-not-exist")
144
+ aggregate_failures do
145
+ expect(response.success?).to eq false
146
+ expect(response.status).to eq 404
147
+ end
148
+ end
149
+ end
150
+
151
+ describe "#post_registration" do
152
+ it "is successful" do
153
+ subject.delete_registration(registration_options)
154
+ response = subject.post_registration(registration_options)
155
+ aggregate_failures do
156
+ expect(response.success?).to eq true
157
+ expect(response.status).to eq 204
158
+ end
159
+ end
160
+
161
+ it "fails if course_id is invalid" do
162
+ response = subject.post_registration(registration_options.merge(course_id: "invalid-bogus"))
163
+ aggregate_failures do
164
+ expect(response.success?).to eq false
165
+ expect(response.status).to eq 400
166
+ expect(response.message).to match(/External Package ID 'invalid-bogus'/)
167
+ end
168
+ end
169
+
170
+ it "fails if registration_id already exists" do
171
+ response = subject.post_registration(registration_options)
172
+ aggregate_failures do
173
+ expect(response.success?).to eq false
174
+ expect(response.status).to eq 400
175
+ expect(response.message).to match(/This RegistrationId is already in use/)
176
+ end
177
+ end
178
+ end
179
+
180
+ describe "#get_registration_launch_link" do
181
+ let(:response) { subject.get_registration_launch_link(registration_id: registration_options[:registration_id], redirect_on_exit_url: "https://example.com") }
182
+
183
+ it "is successful" do
184
+ expect(response.success?).to eq true
185
+ end
186
+
187
+ describe "results" do
188
+ it "returns a URL string" do
189
+ url = response.result
190
+ expect(url).to match(%r{/defaultui/launch.jsp\?.*registration=#{registration_options[:registration_id]}.*RedirectOnExitUrl=https%3A%2F%2Fexample.com})
191
+ end
192
+ end
193
+
194
+ it "fails when id is invalid" do
195
+ response = subject.get_registration_launch_link(registration_id: "nonexistent-registration")
196
+ expect(response.success?).to eq false
197
+ expect(response.status).to eq 404
198
+ expect(response.message).to match(/External Registration ID 'nonexistent-registration'/)
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,29 @@
1
+ RSpec.describe ScormEngine::Configuration do
2
+ before do
3
+ ScormEngine.configure do |config|
4
+ config.host = "scorm.engine"
5
+ config.username = "admin"
6
+ config.password = "secret"
7
+ end
8
+ end
9
+
10
+ it "knows its host" do
11
+ expect(ScormEngine.configuration.host).to eq "scorm.engine"
12
+ end
13
+
14
+ it "knows its username" do
15
+ expect(ScormEngine.configuration.username).to eq "admin"
16
+ end
17
+
18
+ it "knows its password" do
19
+ expect(ScormEngine.configuration.password).to eq "secret"
20
+ end
21
+
22
+ it "knows its logger" do
23
+ expect(ScormEngine.configuration.logger).to be_a Logger
24
+ end
25
+
26
+ it "knows its log options" do
27
+ expect(ScormEngine.configuration.log_options).to eq({ headers: false, bodies: false })
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ RSpec.describe ScormEngine::Models::CourseConfiguration do
2
+ describe ".new_from_api" do
3
+ describe ":settings" do
4
+ it "a hash built from configurationItems" do
5
+ config = described_class.new_from_api(
6
+ "configurationItems" => [
7
+ { "id" => "Foo", "value" => "YES" },
8
+ { "id" => "Bar", "value" => "123" },
9
+ ]
10
+ )
11
+ expect(config.settings["Foo"]).to eq "YES"
12
+ expect(config.settings["Bar"]).to eq "123"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,86 @@
1
+ RSpec.describe ScormEngine::Models::CourseImport do
2
+ describe ".new_from_api" do
3
+ describe "when :importResult is present" do
4
+ let(:subject) { described_class.new_from_api("result" => "id123", "importResult" => { "status" => "RUNNING", "parserWarnings" => "watch out" }) }
5
+
6
+ it "sets the id" do
7
+ expect(subject.id).to eq "id123"
8
+ end
9
+
10
+ it "sets the status" do
11
+ expect(subject.status).to eq "RUNNING"
12
+ end
13
+
14
+ it "sets the course to nil" do
15
+ expect(subject.course).to eq nil
16
+ end
17
+
18
+ it "sets the parser_warnings" do
19
+ expect(subject.parser_warnings).to eq "watch out"
20
+ end
21
+
22
+ it "sets the parser_warnings to nil if not present" do
23
+ subject = described_class.new_from_api("importResult" => {})
24
+ expect(subject.parser_warnings).to eq nil
25
+ end
26
+ end
27
+
28
+ describe "when :importResult is absent" do
29
+ let(:subject) { described_class.new_from_api("jobId" => "id123", "status" => "COMPLETE", "course" => { "id" => "course123" }) }
30
+
31
+ it "sets the id" do
32
+ expect(subject.id).to eq "id123"
33
+ end
34
+
35
+ it "sets the status" do
36
+ expect(subject.status).to eq "COMPLETE"
37
+ end
38
+
39
+ it "sets the course if present" do
40
+ expect(subject.course).to be_a ScormEngine::Models::Course
41
+ expect(subject.course.id).to eq "course123"
42
+ end
43
+
44
+ it "sets the course to nil if absent" do
45
+ subject = described_class.new_from_api({})
46
+ expect(subject.course).to eq nil
47
+ end
48
+ end
49
+ end
50
+
51
+ describe "#running?" do
52
+ it "is true when status is RUNNING" do
53
+ subject = described_class.new_from_api("status" => "RUNNING")
54
+ expect(subject.running?).to eq true
55
+ end
56
+
57
+ it "is false when status is not RUNNING" do
58
+ subject = described_class.new_from_api("status" => "OOPS")
59
+ expect(subject.running?).to eq false
60
+ end
61
+ end
62
+
63
+ describe "#error?" do
64
+ it "is true when status is ERROR" do
65
+ subject = described_class.new_from_api("status" => "ERROR")
66
+ expect(subject.error?).to eq true
67
+ end
68
+
69
+ it "is false when status is not ERROR" do
70
+ subject = described_class.new_from_api("status" => "OOPS")
71
+ expect(subject.error?).to eq false
72
+ end
73
+ end
74
+
75
+ describe "#complete?" do
76
+ it "is true when status is COMPLETE" do
77
+ subject = described_class.new_from_api("status" => "COMPLETE")
78
+ expect(subject.complete?).to eq true
79
+ end
80
+
81
+ it "is false when status is not COMPLETTE" do
82
+ subject = described_class.new_from_api("status" => "OOPS")
83
+ expect(subject.complete?).to eq false
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,92 @@
1
+ RSpec.describe ScormEngine::Models::Course do
2
+ describe ".new_from_api" do
3
+ describe ":title" do
4
+ it "is blank when title is blank" do
5
+ course = described_class.new_from_api(
6
+ "id" => "test"
7
+ )
8
+ expect(course.title).to eq ""
9
+ end
10
+
11
+ it "is blank when title is blank" do
12
+ course = described_class.new_from_api(
13
+ "id" => "test", "title" => ""
14
+ )
15
+ expect(course.title).to eq ""
16
+ end
17
+
18
+ it "is blank when title is literally 'Title'" do
19
+ course = described_class.new_from_api(
20
+ "id" => "test", "title" => "Title"
21
+ )
22
+ expect(course.title).to eq ""
23
+ end
24
+
25
+ it "is blank when title is literally 'Captivate E-Learning Course'" do
26
+ course = described_class.new_from_api(
27
+ "id" => "test", "title" => "Captivate E-Learning Course"
28
+ )
29
+ expect(course.title).to eq ""
30
+ end
31
+
32
+ it "is correct when title contains escaped HTML" do
33
+ course = described_class.new_from_api(
34
+ "id" => "test", "title" => "<b>The <a href="foo">Title</a></b>"
35
+ )
36
+ expect(course.title).to eq "The Title"
37
+ end
38
+
39
+ it "is correct when title contains unescaped HTML" do
40
+ course = described_class.new_from_api(
41
+ "id" => "test", "title" => "<b>The <a href='foo'>Title</a></b>"
42
+ )
43
+ expect(course.title).to eq "The Title"
44
+ end
45
+
46
+ it "is correct when title contains lots of white space" do
47
+ course = described_class.new_from_api(
48
+ "id" => "test", "title" => " The \n\tTitle "
49
+ )
50
+ expect(course.title).to eq "The Title"
51
+ end
52
+ end
53
+
54
+ describe ":scaled_passing_score" do
55
+ it "is nil when rootActivity is blank" do
56
+ course = described_class.new_from_api(
57
+ "id" => "test"
58
+ )
59
+ expect(course.scaled_passing_score).to eq nil
60
+ end
61
+
62
+ it "is nil when rootActivity/children is blank" do
63
+ course = described_class.new_from_api(
64
+ "id" => "test", "rootActivity" => { "children" => [] }
65
+ )
66
+ expect(course.scaled_passing_score).to eq nil
67
+ end
68
+
69
+ it "is nil when rootActivity/children/scaledPassingScore is blank" do
70
+ course = described_class.new_from_api(
71
+ "id" => "test", "rootActivity" => { "children" => [{ "scaledPassingScore" => nil }] }
72
+ )
73
+ expect(course.scaled_passing_score).to eq nil
74
+ end
75
+
76
+ {
77
+ "0" => 0,
78
+ "0.5" => 50,
79
+ "1.0" => 100,
80
+ "2" => 2,
81
+ "100" => 100,
82
+ }.each do |value, score|
83
+ it "is #{score} when rootActivity/children/scaledPassingScore is '#{value}'" do
84
+ course = described_class.new_from_api(
85
+ "id" => "test", "rootActivity" => { "children" => [{ "scaledPassingScore" => value }] }
86
+ )
87
+ expect(course.scaled_passing_score).to eq score
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,27 @@
1
+ RSpec.describe ScormEngine::Models::Learner do
2
+ describe ".new_from_api" do
3
+ let(:learner) { described_class.new_from_api(
4
+ "id" => "learner-123",
5
+ "firstName" => "Bobby",
6
+ "lastName" => "Jones",
7
+ ) }
8
+
9
+ describe ":id" do
10
+ it "is set properly" do
11
+ expect(learner.id).to eq "learner-123"
12
+ end
13
+ end
14
+
15
+ describe ":first_name" do
16
+ it "is set properly" do
17
+ expect(learner.first_name).to eq "Bobby"
18
+ end
19
+ end
20
+
21
+ describe ":last_name" do
22
+ it "is set properly" do
23
+ expect(learner.last_name).to eq "Jones"
24
+ end
25
+ end
26
+ end
27
+ end