scorm_engine 0.1.0

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