proctorserv-api 1.0.3 → 1.0.4

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.
data/README.md CHANGED
@@ -54,6 +54,21 @@ Creating a session through the scheduling API sets up a future or immediate oppo
54
54
  - :first_name (String) - First name of the candidate taking the exam
55
55
  - :last_name (String) - Last name of the candidate taking the exam - The tast taker downloads the ProctorApp desktop application and completes their session
56
56
 
57
+ **Creating a session event**
58
+ Creates a session event that is specified by session_id (int), event_type (String), severity (int), and proctor_id (String).
59
+
60
+
61
+ *Required Parameters:*
62
+
63
+ - :session_id (int) - Proctorserve id for the session to grant access to
64
+ - :event_type (String) - The type of event which can be found in session_event.rb
65
+
66
+ *Optional Parameters:*
67
+
68
+ - :severity (int) - The importance-by-color of the session event (0-> grey (system event),1-> red, 2-> yellow, and 3-> green
69
+ - :proctor_id (String) - unique identifier representing the user to grant access to. This will determine the user's display name in Proctorserve interfaces.
70
+ - :time (Time) - Time at which to create the event (defaults to now if not set)
71
+
57
72
  #### Installation
58
73
 
59
74
  $ gem install proctorserv-api
@@ -101,6 +116,7 @@ proctorserv_api.make_immediate_reservation
101
116
  proctorserv_api.cancel_reservation
102
117
  proctorserv_api.generate_jsonp_token
103
118
  proctorserv_api.generate_secure_review_url
119
+ proctorserv_api.create_session_event
104
120
  ```
105
121
 
106
122
  Further documentation for these methods can be found [here](http://rubydoc.info/github/ProctorCam/proctorserv-api-rb/master/frames)
@@ -3,6 +3,7 @@ require 'proctorserv_api/exceptions/invalid_client_exception'
3
3
  require 'proctorserv_api/exceptions/invalid_ip_exception'
4
4
  require 'proctorserv_api/exceptions/invalid_signature_exception'
5
5
  require 'proctorserv_api/exceptions/missing_required_parameter_exception'
6
+ require 'proctorserv_api/session_event.rb'
6
7
 
7
8
  #
8
9
  # proctorserv_api.rb
@@ -29,7 +30,7 @@ module ProctorCam
29
30
  module Proctorserv
30
31
  class ProctorservApi
31
32
 
32
- VERSION = "1.0.3"
33
+ VERSION = "1.0.4"
33
34
 
34
35
  def initialize(api_identifier, shared_secret, service_protocol = "https", service_url = "service.proctorcam.com")
35
36
  @service_protocol = service_protocol
@@ -53,7 +54,7 @@ module ProctorCam
53
54
  # @return [Array<Time>] list of Time objects that represent schedulable timeslots in Proctorserve for a test of length session_duration between lower_bound and upper_bound
54
55
  def get_available_timeslots_between(options)
55
56
  requires_of options, [:lower_bound, :upper_bound, :session_duration]
56
- url = "#{@service_protocol}://#{@service_url}/#{__method__}"
57
+ url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
57
58
  convert_times_to_integer options, :lower_bound, :upper_bound
58
59
  response = RestRequestClient.new.make_get_request url, @api_identifier, @shared_secret, options
59
60
  parsed_response = JSON.parse response.body
@@ -78,7 +79,7 @@ module ProctorCam
78
79
  # @return [Array<Time>] list (length num_slots or 20) of Time objects that represent schedulable timeslots in Proctorserve for a test of length session_duration around time passed in options hash
79
80
  def get_available_timeslots_around(options)
80
81
  requires_of options, [:time, :num_slots, :session_duration]
81
- url = "#{@service_protocol}://#{@service_url}/#{__method__}"
82
+ url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
82
83
  convert_times_to_integer options, :time
83
84
  response = RestRequestClient.new.make_get_request url, @api_identifier, @shared_secret, options
84
85
  parsed_response = JSON.parse response.body
@@ -107,7 +108,7 @@ module ProctorCam
107
108
  # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not scheduable.
108
109
  def make_reservation(options)
109
110
  requires_of options, [:time, :customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
110
- url = "#{@service_protocol}://#{@service_url}/#{__method__}"
111
+ url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
111
112
  convert_times_to_integer options, :time
112
113
  response = RestRequestClient.new.make_post_request url, @api_identifier, @shared_secret, options
113
114
 
@@ -138,7 +139,7 @@ module ProctorCam
138
139
  # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not scheduable.
139
140
  def make_immediate_reservation(options)
140
141
  requires_of options, [:customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
141
- url = "#{@service_protocol}://#{@service_url}/#{__method__}"
142
+ url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
142
143
  convert_times_to_integer options, :time
143
144
  response = RestRequestClient.new.make_post_request url, @api_identifier, @shared_secret, options
144
145
 
@@ -160,7 +161,7 @@ module ProctorCam
160
161
  # @return [Boolean] whether or not the test was successfully canceled.
161
162
  def cancel_reservation(options)
162
163
  requires_of options, [:session_id]
163
- url = "#{@service_protocol}://#{@service_url}/#{__method__}"
164
+ url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
164
165
  response = RestRequestClient.new.make_post_request url, @api_identifier, @shared_secret, options
165
166
 
166
167
  return true if response.code == 204
@@ -207,6 +208,40 @@ module ProctorCam
207
208
  "#{@service_protocol}://#{@service_url}/review?secure_token=#{options.map{|k,v| "#{k}%3D#{v}"}.join '%26'}#watch/#{options[:session_id]}"
208
209
  end
209
210
 
211
+
212
+ # Generate a session event for a testing session.
213
+ #
214
+ # @param [Hash{Symbol => String}] options
215
+ # Required:
216
+ # - :session_id (int) - Proctorserve id for the session the event will be added to
217
+ # - :event_type(String) The event to be added, acceptable events are contained in SessionEvent.rb
218
+ # Optional:
219
+ # - :proctor_id (String) - Unique identifier representing the user to grant access to. This will determine the user's display name in Proctorserve interfaces.
220
+ # - :time (String) (Time or int seconds since epoch) Date and Time that the session event happened at
221
+ # - :severity (int) (Defaults to 0) The severity of the session_event being created.
222
+ # - 0: Lowest severity
223
+ # - 1: Highest Severity, may be used for events like test revoked or emergency.
224
+ # - 2: Medium Severity, the session needs to be reviewed.
225
+ # - 3: Low Severity, common events like going through the system check.
226
+ # @return [Boolean] whether or not the session event was successfully created.
227
+ def create_session_event(options)
228
+ requires_of options, [:session_id, :event_type]
229
+ url = "#{@service_protocol}://#{@service_url}/api/session_events/create"
230
+ response = RestRequestClient.new.make_post_request url, @api_identifier, @shared_secret, options
231
+
232
+ return true if response.code == 201
233
+
234
+ if response.code != 200
235
+ parsed_response = JSON.parse response.body
236
+ raise_exception_if_necessary(parsed_response)
237
+ end
238
+
239
+ false
240
+ end
241
+
242
+
243
+
244
+
210
245
  protected
211
246
 
212
247
  def raise_exception_if_necessary(response)
@@ -0,0 +1,51 @@
1
+ #
2
+ # session_event.rb
3
+ # ProctorservApi
4
+ #
5
+ # Copyright 2013 ProctorCam, Inc
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License")
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # Created by Pat Durgin on 7/19/13.
20
+ #
21
+ module SessionEvent
22
+
23
+ ERROR = "ERROR"
24
+ CHECK_IN_BEGUN = "CHECK_IN_BEGUN"
25
+ APP_CONNECTED = "APP_CONNECTED"
26
+ STARTED = "STARTED"
27
+ COMPLETED = "COMPLETED"
28
+ APP_WORKFLOW = "APP_WORKFLOW"
29
+ APP_HARDWARE_ISSUE = "APP_HARDWARE_ISSUE"
30
+ APP_ISSUE = "APP_ISSUE"
31
+ APP_STREAMING_STARTED = "APP_STREAMING_STARTED"
32
+ APP_STREAMING_STOPPED = "APP_STREAMING_STOPPED"
33
+ APP_READY_FOR_GREET = "APP_READY_FOR_GREET"
34
+ SERVICE_TEST_RELEASED = "SERVICE_TEST_RELEASED"
35
+
36
+ ACCESS_CODE_RESET = "ACCESS_CODE_RESET"
37
+ UNAPPROVED_RESOURCE = "UNAPPROVED_RESOURCE"
38
+ VOICE_HEARD = "VOICE_HEARD"
39
+ PUSHED_TO_COMPLETE = "PUSHED_TO_COMPLETE"
40
+ USING_PHONE = "USING_PHONE"
41
+ LEFT_THE_ROOM = "LEFT_THE_ROOM"
42
+ EMERGENCY = "EMERGENCY"
43
+ UNUSUAL_EYE_MOVEMENT = "UNUSUAL_EYE_MOVEMENT"
44
+ OTHER = "OTHER"
45
+ APP_SUBJECT_HAND_RAISED = "APP_SUBJECT_HAND_RAISED"
46
+ SERVICE_TEST_PAUSED = "SERVICE_TEST_PAUSED"
47
+ SERVICE_TEST_RESUMED = "SERVICE_TEST_RESUMED"
48
+ SERVICE_TEST_REVOKED = "SERVICE_TEST_REVOKED"
49
+ SERVICE_PROCTOR_OUTREACH = "SERVICE_PROCTOR_OUTREACH"
50
+
51
+ end
@@ -25,18 +25,18 @@ require 'rspec'
25
25
  describe ProctorCam::Proctorserv::ProctorservApi do
26
26
 
27
27
  before :all do
28
- @proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("api_identifier", "shared_secret", "http", "localhost:3000/api/scheduling")
28
+ @proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("test", "shared_secret", "http", "localhost:3000")
29
29
  end
30
30
 
31
31
  describe "when passed improper credentials" do
32
32
 
33
33
  it "raises an invalid_client_exception when api_identifier is wrong" do
34
- proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("wrong", "shared_secret", "http", "localhost:3000/api/scheduling")
34
+ proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("wrong", "shared_secret", "http", "localhost:3000")
35
35
  expect{proctorserv_api.get_available_timeslots_between({:lower_bound => Time.now.to_i, :upper_bound => Time.now.to_i + 24*60*60, :session_duration => 60})}.to raise_error ProctorCam::Proctorserv::InvalidClientException
36
36
  end
37
37
 
38
38
  it "raises an invalid_signature_exception when shared_secret is wrong" do
39
- proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("api_identifier", "wrong", "http", "localhost:3000/api/scheduling")
39
+ proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("test", "wrong", "http", "localhost:3000")
40
40
  expect{proctorserv_api.get_available_timeslots_between({:lower_bound => Time.now.to_i, :upper_bound => Time.now.to_i + 24*60*60, :session_duration => 60})}.to raise_error ProctorCam::Proctorserv::InvalidSignatureException
41
41
  end
42
42
 
@@ -141,4 +141,60 @@ describe ProctorCam::Proctorserv::ProctorservApi do
141
141
 
142
142
  end
143
143
 
144
+ describe "generate_jsonp_token" do
145
+
146
+ it "raises missing_required_parameter_exception when not passed session_id in options hash" do
147
+ expect{@proctorserv_api.generate_jsonp_token({})}.to raise_error ProctorCam::Proctorserv::MissingRequiredParameterException
148
+ end
149
+
150
+ it "generates a secure token that can be used to grant temporary jsonp access to a session for a web browser user to take a session" do
151
+ options = {:session_id => 400, :duration => 60}
152
+ jsonp_token = @proctorserv_api.generate_jsonp_token options
153
+ resultant_hash = Hash[jsonp_token.split('%26').map{|sub_hash|sub_hash.split('%3D')}]
154
+ resultant_hash['session_id'].should == options[:session_id].to_s
155
+ resultant_hash['duration'].should == options[:duration].to_s
156
+ end
157
+ end
158
+
159
+ describe "generate_secure_review_url" do
160
+
161
+ it "raises missing_required_parameter_exception when not passed proctor_id and session_id" do
162
+ expect{@proctorserv_api.generate_secure_review_url({})}.to raise_error ProctorCam::Proctorserv::MissingRequiredParameterException
163
+ end
164
+
165
+ it "generate a secure token that can be used to grant temporary access to a session for a web browser user to review a session." do
166
+ options = {:proctor_id => "foo", :session_id => 500, :duration => 60}
167
+ generated_url = @proctorserv_api.generate_secure_review_url options
168
+ resultant_hash = Hash[generated_url.match(/secure_token=(.*)#watch\/[1-9]*/)[1].split('%26').map{|sub_hash|sub_hash.split('%3D')}]
169
+ resultant_hash['session_id'].should == options[:session_id].to_s
170
+ resultant_hash['proctor_id'].should == options[:proctor_id].to_s
171
+ resultant_hash['duration'].should == options[:duration].to_s
172
+ end
173
+ end
174
+
175
+ describe "create_session_event" do
176
+
177
+ it "raises a missing_required_parameter_exception when not passed session_id and event_type" do
178
+ expect{@proctorserv_api.create_session_event({})}.to raise_error ProctorCam::Proctorserv::MissingRequiredParameterException
179
+ end
180
+
181
+ it "returns true if it generates a session event for a testing session if options hash contains correct values" do
182
+ options = {:session_id => 471, :event_type => SessionEvent::COMPLETED, :proctor_id => "foo", :severity => 2}
183
+ result = @proctorserv_api.create_session_event options
184
+ result.should be_true
185
+ end
186
+
187
+ it "returns false if the customer does not have the session_id passed" do
188
+ proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("test", "shared_secret", "http", "localhost:3000")
189
+ options = {:session_id => -1, :event_type => SessionEvent::COMPLETED, :proctor_id => "foo", :severity => 2}
190
+ result = proctorserv_api.create_session_event options
191
+ result.should be_false
192
+ end
193
+
194
+ it "returns false if the event_type is not a valid event type" do
195
+ options = {:session_id => 450, :event_type => 'this isnt an event', :proctor_id => "foo", :severity => 2}
196
+ result = @proctorserv_api.create_session_event options
197
+ result.should be_false
198
+ end
199
+ end
144
200
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proctorserv-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-15 00:00:00.000000000 Z
12
+ date: 2013-07-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -57,6 +57,7 @@ files:
57
57
  - lib/proctorserv_api/exceptions/missing_required_parameter_exception.rb
58
58
  - lib/proctorserv_api/hashed_authenticator.rb
59
59
  - lib/proctorserv_api/rest_request_client.rb
60
+ - lib/proctorserv_api/session_event.rb
60
61
  - lib/proctorserv_api.rb
61
62
  - LICENSE
62
63
  - README.md