proctorserv-api 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,55 +2,86 @@
2
2
 
3
3
  A ruby wrapper around the Proctorserve scheduling API, which allows a web service to manage various scheduling actions. This gem is framework agnostic -- it will work as part of a Rails or Sinatra project as easily as from a stand-alone script.
4
4
 
5
- Creating a session through the scheduling API sets up a future or immediate opportunity for one of your users to take their examination in a proctored and recorded environment. Important identifiers (eg. user or test instance) are required so that an integrating web service can request an individual session to playback or a more involved list (like all test sessions for an exam or all test sessions for a specific user/subject). When required, we further scope our customers' sessions by client.
5
+ Creating a session through the scheduling API sets up a future or immediate opportunity for a user of an integrating system to take their examination in a proctored and recorded environment. Important identifiers (eg. user or test instance) are required so that an integrating web service can request an individual session or a more involved list (like all test sessions for an exam or all test sessions for a specific user/subject) to playback. However, Proctorserve does not serve as a database of record - the integrating system is responsible for housing test taker and test information as well as keeping Proctorserve up to date. Optionally, when creating a reservation, the integrating system can opt to scope that session to a particular client of theirs -- Proctorserve can organize data by customer as well as that customer's clients.
6
+
7
+ **Note:** If you do not currently have a ProctorCam account, you will need one to actually use the code contained in this repo. You may create an account by calling 877­-TES-T127.
6
8
 
7
9
  #### Example workflows
8
10
 
9
- *Scheduling ahead of time*
11
+ **Scheduling ahead of time (future reservation)**
12
+
13
+ - A test taker in the integrating system needs to select a time to take their examination.
14
+ - The integrating system makes an API request to Proctorserve to get a list of schedulable times
15
+ - The test taker chooses a schedulable time, triggering an API request to Proctorserve to make a reservation for that user at that time
16
+ - On test day, the integrating system presents the test taker with the Proctorserve launch session component
17
+ - The test taker downloads the ProctorApp desktop application and completes their session
18
+
19
+ *Required Parameters:*
20
+
21
+ - :time (Time) - Time around which to find slots
22
+ - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
23
+ - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
24
+ - :client_code (String) - Unique identifier for API customer's client
25
+ - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
26
+ - :session_duration (int) - length in minutes allotted for this examination
27
+ - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
28
+
29
+ *Optional Parameters:*
30
+
31
+ - :complete_url (String) - URL that the candidate is redirected to after exam completion
32
+ - :first_name (String) - First name of the candidate taking the exam
33
+ - :last_name (String) - Last name of the candidate taking the exam
10
34
 
11
- - A test taker in the integrating system needs to select a time to take their examination.
12
- - The integrating system makes an API request to Proctorserve to get a list of scheduable times
13
- - The test taker chooses a schedulable time, triggering an API request to Proctorserve to make a reservation for that user at that time
14
- - On test day, the integrating system presents the test taker with the Proctorserve launch session component
15
- - The tast taker downloads the ProctorApp desktop application and completes their session
35
+ **Scheduling for now (immediate reservation)**
16
36
 
17
- *Scheduling for now*
37
+ - A test taker in the integrating system is ready to take their examination
38
+ - The integrating system makes an API request to Proctorserve to make an immediate reservation
39
+ - The integrating system presents the test taker with the Proctorserve launch session component
40
+ - The test taker downloads the ProctorApp desktop application and completes their session
18
41
 
19
- A test taker in the integrating system is ready to take their examination
42
+ *Required Parameters:*
20
43
 
21
- - The integrating system makes an API request to Proctorserve to make an immediate reservation
22
- - The integrating syste presents the test taker with the Proctorserve launch session component
23
- - The tast taker downloads the ProctorApp desktop application and completes their session
44
+ - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
45
+ - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
46
+ - :client_code (String) - Unique identifier for API customer's client
47
+ - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
48
+ - :session_duration (int) - length in minutes allotted for this examination presents the test taker with the Proctorserve launch session component
49
+ - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
50
+
51
+ *Optional Parameters:*
52
+
53
+ - :complete_url (String) - URL that the candidate is redirected to after exam completion
54
+ - :first_name (String) - First name of the candidate taking the exam
55
+ - :last_name (String) - Last name of the candidate taking the exam - The tast taker downloads the ProctorApp desktop application and completes their session
24
56
 
25
57
  #### Installation
26
58
 
27
59
  $ gem install proctorserv-api
28
60
 
29
61
  To use our ruby API in a project
30
-
31
- ```ruby
32
- require 'proctorserv_api'
62
+ ```ruby
63
+ require 'proctorserv_api'
33
64
  ```
34
65
 
35
66
  #### Configuration
36
67
 
37
68
  The constructor takes two required parameters: the customer_identifier and shared_secret
38
69
 
39
- _What's my customer_identifier?_
70
+ *What's our customer_identifier?*
40
71
 
41
- the Proctorserve service requires that incoming requests identify who is sending them with a `customer_id` parameter. Once your account has been set up, your customer id should be viewable and editable through the web interface.
72
+ The Proctorserve service requires that incoming requests identify who is sending them with a `customer_id` parameter. Once a customer account has been set up with Proctorserve, it's customer identifier should be viewable and editable through the web interface.
42
73
 
43
- _What's the shared_secret for?_
74
+ *What's the shared_secret for?*
44
75
 
45
- Proctorserve uses a secret key that is shared between customer and service as part of a two-factor authentication scheme. This is also viewable and editable through the web interface. It is important to keep this secure, otherwise a man in the middle can make requests on your behalf.
76
+ Proctorserve uses a secret key that is shared between customer and service as part of a two-factor authentication scheme. This is also viewable and editable through the web interface. It is important to keep this secure, otherwise a man in the middle can make requests on the integrating system's behalf.
46
77
 
47
78
  #### Usage
48
79
 
49
80
  ```ruby
50
81
  proctorserv_api = Proctorcam::Proctorserv::ProctorservApi.new("our_customer_identifier", "our_shared_secret")
51
82
  options = {
52
- :scheduling_window_start => Time.now,
53
- :scheduling_window_end => scheduling_window_start + 24 * 60 * 60, # tomorrow at this time
83
+ :lower_bound => Time.now,
84
+ :upper_bound => scheduling_window_start + 24 * 60 * 60, # tomorrow at this time
54
85
  :test_length => 60 # minutes
55
86
  }
56
87
  available_timeslots = proctorserv_api.get_available_timeslots_between options
@@ -61,13 +92,15 @@ available_timeslots = proctorserv_api.get_available_timeslots_between options
61
92
 
62
93
  The following methods are supported
63
94
 
64
- ```ruby
65
- proctorserv_api = Proctorcam::Proctorserv::ProctorservApi.new("our_customer_identifier", "our_shared_secret")
66
- proctorserv_api.get_available_timeslots_between
95
+ ```ruby
96
+ proctorserv_api = Proctorcam::Proctorserv::ProctorservApi.new("our_customer_identifier", "our_shared_secret")
97
+ proctorserv_api.get_available_timeslots_between
67
98
  proctorserv_api.get_available_timeslots_around
68
99
  proctorserv_api.make_reservation
69
100
  proctorserv_api.make_immediate_reservation
70
101
  proctorserv_api.cancel_reservation
102
+ proctorserv_api.generate_jsonp_token
103
+ proctorserv_api.generate_secure_review_url
71
104
  ```
72
105
 
73
- Further documentation for these methods can be found in the `doc/` folder
106
+ Further documentation for these methods can be found [here](http://rubydoc.info/github/ProctorCam/proctorserv-api-rb/master/frames)
@@ -29,7 +29,7 @@ module ProctorCam
29
29
  module Proctorserv
30
30
  class ProctorservApi
31
31
 
32
- VERSION = "1.0.2"
32
+ VERSION = "1.0.3"
33
33
 
34
34
  def initialize(api_identifier, shared_secret, service_protocol = "https", service_url = "service.proctorcam.com")
35
35
  @service_protocol = service_protocol
@@ -46,16 +46,17 @@ module ProctorCam
46
46
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
47
47
  #
48
48
  # @param [Hash{Symbol => String}] options
49
- # - :lower_bound (Time or int seconds since epoch) - the earlier of two timestamps to find available timeslots between
50
- # - :upper_bound (Time or int seconds since epoch) - the later of two timestamps to find available timeslots between
51
- # - :session_duration (int) - is the length in minutes alloted for this examination
49
+ # Required:
50
+ # - :lower_bound (Time or int seconds since epoch) - the earlier of two timestamps to find available timeslots between
51
+ # - :upper_bound (Time or int seconds since epoch) - the later of two timestamps to find available timeslots between
52
+ # - :session_duration (int) - is the length in minutes alloted for this examination
52
53
  # @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
53
54
  def get_available_timeslots_between(options)
54
55
  requires_of options, [:lower_bound, :upper_bound, :session_duration]
55
56
  url = "#{@service_protocol}://#{@service_url}/#{__method__}"
56
57
  convert_times_to_integer options, :lower_bound, :upper_bound
57
58
  response = RestRequestClient.new.make_get_request url, @api_identifier, @shared_secret, options
58
- parsed_response = JSON.parse response
59
+ parsed_response = JSON.parse response.body
59
60
  raise_exception_if_necessary(parsed_response) if response.code != 200
60
61
 
61
62
  parsed_response.map{|timestamp| Time.at(timestamp)}
@@ -70,16 +71,17 @@ module ProctorCam
70
71
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
71
72
  #
72
73
  # @param [Hash{Symbol => String}] options
73
- # - :time (Time or int seconds since epoch) - time around which to find slots
74
- # - :num_slots (int) - number of slots to return
75
- # - :session_duration (int) - length in minutes alloted for this examination
74
+ # Required:
75
+ # - :time (Time or int seconds since epoch) - time around which to find slots
76
+ # - :num_slots (int) - number of slots to return
77
+ # - :session_duration (int) - length in minutes alloted for this examination
76
78
  # @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
77
79
  def get_available_timeslots_around(options)
78
80
  requires_of options, [:time, :num_slots, :session_duration]
79
81
  url = "#{@service_protocol}://#{@service_url}/#{__method__}"
80
82
  convert_times_to_integer options, :time
81
83
  response = RestRequestClient.new.make_get_request url, @api_identifier, @shared_secret, options
82
- parsed_response = JSON.parse response
84
+ parsed_response = JSON.parse response.body
83
85
  raise_exception_if_necessary(parsed_response) if response.code != 200
84
86
 
85
87
  parsed_response.map{|timestamp| Time.at(timestamp)}
@@ -90,24 +92,29 @@ module ProctorCam
90
92
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
91
93
  #
92
94
  # @param [Hash{Symbol => String}] options
93
- # - :time (Time or int seconds since epoch) - Scheduable time for examination, as obtained by get_available_timeslots_between or get_available_timeslots_around
94
- # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
95
- # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
96
- # - :client_code (String) - Unique identifier for API customer's client
97
- # - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
98
- # - :session_duration (int) - Session length in minutes
99
- # - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
100
- # @return [int] session_id - the Proctorserve id for the created session. Will return nil if the time passed is not scheduable.
95
+ # Required:
96
+ # - :time (Time or int seconds since epoch) - Scheduable time for examination, as obtained by get_available_timeslots_between or get_available_timeslots_around
97
+ # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
98
+ # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
99
+ # - :client_code (String) - Unique identifier for API customer's client
100
+ # - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
101
+ # - :session_duration (int) - Session length in minutes
102
+ # - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
103
+ # Optional:
104
+ # - :complete_url (String) - URL that the candidate is redirected to after exam completion
105
+ # - :first_name (String) - First name of the candidate taking the exam
106
+ # - :last_name (String) - Last name of the candidate taking the exam
107
+ # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not scheduable.
101
108
  def make_reservation(options)
102
109
  requires_of options, [:time, :customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
103
110
  url = "#{@service_protocol}://#{@service_url}/#{__method__}"
104
111
  convert_times_to_integer options, :time
105
112
  response = RestRequestClient.new.make_post_request url, @api_identifier, @shared_secret, options
106
113
 
107
- parsed_response = JSON.parse response
114
+ parsed_response = JSON.parse response.body
108
115
  raise_exception_if_necessary(parsed_response) if response.code != 200
109
116
 
110
- return nil if response.code == 404
117
+ return -1 if response.code == 404
111
118
 
112
119
  parsed_response["session_id"]
113
120
  end
@@ -117,23 +124,28 @@ module ProctorCam
117
124
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
118
125
  #
119
126
  # @param [Hash{Symbol => String}] options
120
- # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
121
- # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
122
- # - :client_code (String) - Unique identifier for API customer's client
123
- # - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
124
- # - :session_duration (int) - Session length in minutes
125
- # - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
126
- # @return [int] session_id - the Proctorserve id for the created session. Will return nil if the time passed is not scheduable.
127
+ # Required:
128
+ # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
129
+ # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
130
+ # - :client_code (String) - Unique identifier for API customer's client
131
+ # - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
132
+ # - :session_duration (int) - Session length in minutes
133
+ # - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
134
+ # Optional:
135
+ # - :complete_url (String) - URL that the candidate is redirected to after exam completion
136
+ # - :first_name (String) - First name of the candidate taking the exam
137
+ # - :last_name (String) - Last name of the candidate taking the exam
138
+ # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not scheduable.
127
139
  def make_immediate_reservation(options)
128
140
  requires_of options, [:customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
129
141
  url = "#{@service_protocol}://#{@service_url}/#{__method__}"
130
142
  convert_times_to_integer options, :time
131
143
  response = RestRequestClient.new.make_post_request url, @api_identifier, @shared_secret, options
132
144
 
133
- parsed_response = JSON.parse response
145
+ parsed_response = JSON.parse response.body
134
146
  raise_exception_if_necessary(parsed_response) if response.code != 200
135
147
 
136
- return nil if response.code == 404
148
+ return -1 if response.code == 404
137
149
 
138
150
  parsed_response["session_id"]
139
151
  end
@@ -142,7 +154,9 @@ module ProctorCam
142
154
  #
143
155
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
144
156
  #
145
- # @param [int] session_id Proctorserve id for the session to be canceled
157
+ # @param [Hash{Symbol => String}] options
158
+ # Required:
159
+ # - :session_id (int) Proctorserve id for the session to be canceled
146
160
  # @return [Boolean] whether or not the test was successfully canceled.
147
161
  def cancel_reservation(options)
148
162
  requires_of options, [:session_id]
@@ -152,13 +166,47 @@ module ProctorCam
152
166
  return true if response.code == 204
153
167
 
154
168
  if response.code != 200
155
- parsed_response = JSON.parse response
169
+ parsed_response = JSON.parse response.body
156
170
  raise_exception_if_necessary(parsed_response)
157
171
  end
158
172
 
159
173
  false
160
174
  end
161
175
 
176
+ # Generate a secure token that can be used to grant temporary jsonp access to a session for a web browser user to take a session.
177
+ #
178
+ # @param [Hash{Symbol => String}] options
179
+ # - :session_id (int) Proctorserve id for the session to grant access to
180
+ # - :duration (int) Number of minutes to grant access for (defaults to 1 hour, maximum 3 hours)
181
+ def generate_jsonp_token(options)
182
+ requires_of options, [:session_id]
183
+
184
+ options[:time] = Time.now.to_i
185
+ options[:duration] ||= 60
186
+ options[:duration] = 180 if options[:duration] > 180
187
+
188
+ HashedAuthenticator.apply_reverse_guid_and_sign(options, @api_identifier, @shared_secret)
189
+ options.map{|k,v| "#{k}%3D#{v}"}.join '%26'
190
+ end
191
+
192
+ # Generate a secure token that can be used to grant temporary access to a session for a web browser user to review a session.
193
+ # Can be loaded an iframe or a new window to grant secure access to a single user for a specified period of time
194
+ #
195
+ # @param [Hash{Symbol => String}] options
196
+ # - :session_id (int) Proctorserve id for the session to grant review access to
197
+ # - :proctor_id (String) unique identifier representing the user to grant access to. This will determine the user's display name in Proctorserve interfaces.
198
+ # - :duration (int) Number of minutes link stays active for (defaults to 5 minutes)
199
+ def generate_secure_review_url(options)
200
+ requires_of options, [:proctor_id, :session_id]
201
+
202
+ options[:time] = Time.now.to_i
203
+ options[:duration] ||= 5
204
+ options[:duration] = 180 if options[:duration] > 180
205
+
206
+ HashedAuthenticator.apply_reverse_guid_and_sign(options, @api_identifier, @shared_secret)
207
+ "#{@service_protocol}://#{@service_url}/review?secure_token=#{options.map{|k,v| "#{k}%3D#{v}"}.join '%26'}#watch/#{options[:session_id]}"
208
+ end
209
+
162
210
  protected
163
211
 
164
212
  def raise_exception_if_necessary(response)
@@ -77,20 +77,20 @@ describe ProctorCam::Proctorserv::ProctorservApi do
77
77
  describe "make_reservation" do
78
78
 
79
79
  it "raises missing_required_parameter_exception when not passed [:time, :customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code] in options hash" do
80
- options = {:time => Time.now.to_i, :customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a'}
80
+ options = {:time => Time.now.to_i, :customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :first_name => 'Ryan', :last_name => 'Callahan', :complete_url => 'http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=71756'}
81
81
  options.each do |k,v|
82
82
  expect{@proctorserv_api.make_reservation options.reject{|key,v| key == k} }.to raise_error ProctorCam::Proctorserv::MissingRequiredParameterException
83
83
  end
84
84
  end
85
85
 
86
- it "returns nil when time provided is not schedulable" do
87
- options = {:time => Time.new(1970, 1, 1, 6, 0, 0), :customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a'}
86
+ it "returns -1 when time provided is not schedulable" do
87
+ options = {:time => Time.new(1970, 1, 1, 0, 0, 0), :customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a', :first_name => 'Ryan', :last_name => 'Callahan', :complete_url => 'http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=71756'}
88
88
  response = @proctorserv_api.make_reservation options
89
- response.should == nil
89
+ response.should == -1
90
90
  end
91
91
 
92
92
  it "returns an int value representing session_id when provided a schedulable time and all required parameters" do
93
- options = {:time => Time.now.to_i, :customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a'}
93
+ options = {:time => Time.now.to_i, :customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a', :first_name => 'Ryan', :last_name => 'Callahan', :complete_url => 'http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=71756'}
94
94
  response = @proctorserv_api.make_reservation options
95
95
  response.class.should == Fixnum
96
96
  end
@@ -100,14 +100,14 @@ describe ProctorCam::Proctorserv::ProctorservApi do
100
100
  describe "make_immediate_reservation" do
101
101
 
102
102
  it "raises missing_required_parameter_exception when not passed [:customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code] in options hash" do
103
- options = {:customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a'}
103
+ options = {:customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :first_name => 'Ryan', :last_name => 'Callahan', :complete_url => 'http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=71756'}
104
104
  options.each do |k,v|
105
105
  expect{@proctorserv_api.make_immediate_reservation options.reject{|key,v| key == k} }.to raise_error ProctorCam::Proctorserv::MissingRequiredParameterException
106
106
  end
107
107
  end
108
108
 
109
109
  it "returns an int value representing session_id when now is a schedulable time and all required parameters" do
110
- options = {:customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a'}
110
+ options = {:customer_subject_id => 'c_sub_1', :customer_client_subject_id => 'c_c_sub_1', :client_code => 'c_code', :reservation_id => 'res_id', :session_duration => 60, :exam_code => 'e-code-15a', :first_name => 'Ryan', :last_name => 'Callahan', :complete_url => 'http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=71756'}
111
111
  response = @proctorserv_api.make_immediate_reservation options
112
112
  response.class.should == Fixnum
113
113
  end
@@ -134,6 +134,11 @@ describe ProctorCam::Proctorserv::ProctorservApi do
134
134
  response.should == false
135
135
  end
136
136
 
137
+ it "returns false when passed a session_id that doesn't correspond with a session id in the system" do
138
+ response = @proctorserv_api.cancel_reservation({:session_id => "a"})
139
+ response.should == false
140
+ end
141
+
137
142
  end
138
143
 
139
144
  end
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proctorserv-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Max Lahey
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-06-10 00:00:00.000000000 Z
12
+ date: 2013-07-15 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rest-client
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rspec
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ! '>='
39
44
  - !ruby/object:Gem::Version
@@ -58,26 +63,27 @@ files:
58
63
  - spec/proctorserv_api_spec.rb
59
64
  homepage: http://github.com/proctorcam/proctorserv-api
60
65
  licenses: []
61
- metadata: {}
62
66
  post_install_message:
63
67
  rdoc_options: []
64
68
  require_paths:
65
69
  - lib
66
70
  required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
67
72
  requirements:
68
73
  - - ! '>='
69
74
  - !ruby/object:Gem::Version
70
75
  version: '0'
71
76
  required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
72
78
  requirements:
73
79
  - - ! '>='
74
80
  - !ruby/object:Gem::Version
75
81
  version: '0'
76
82
  requirements: []
77
83
  rubyforge_project:
78
- rubygems_version: 2.0.3
84
+ rubygems_version: 1.8.25
79
85
  signing_key:
80
- specification_version: 4
86
+ specification_version: 3
81
87
  summary: A ruby wrapper around the Proctorserve scheduling API.
82
88
  test_files:
83
89
  - spec/proctorserv_api_spec.rb
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YWVlNTMxNGQyMWMzYWQzMjM3YTAwODQ2NmM0NDNlZjRlNWUxM2Y3Yg==
5
- data.tar.gz: !binary |-
6
- MDVkYjVhNDI3ZTAxNDVhNjNiN2NlZTBiMTkwMWE5NGE2ZGFkMWIyOA==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- MWMzNjU3NmU0MjZlMDBjYTg5Y2U3NjljZTZjNzZiMzFkYTk4MDZhOTlmMzBj
10
- ODg2NDJhNjhkMGVlNTExNTcyNTI2MmRiMDliODQ1NmI1MzZmYWIyNjY0ZTQx
11
- Yzc4NTVlMjRiOWVkZTQxMjE5YTZkMDhiOWRmODkwMzUyZWEwMDQ=
12
- data.tar.gz: !binary |-
13
- Zjg3ZDM3MmM3ZWQ4ZTI3YWM5OGYwYmVjZWU2ZDc2MjY3NGNlZjc4MmMwMmZk
14
- N2ViZjgyMDFiN2E3NzE5NTExYTc2NmFhMjJlNjRhYTU2ZjQ0ZmI1N2M2ODdk
15
- MGRiMTE3ZWI2YzgwMmI3OThiMGQ0MTMwN2Y5YTRjNjZmMTQxMWM=