proctorserv-api 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,73 +1,102 @@
1
+ ![ProctorCam Logo](http://i.imgur.com/vp5bSXc.png)
2
+
1
3
  ### ProctorservApi Client
2
4
 
3
5
  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
6
 
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.
7
+ 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 exam instance) are required so that an integrating web service can request an individual session or a more involved list (like all sessions for an exam or all exam 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 exam 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
8
 
7
9
  **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.
8
10
 
9
- #### Example workflows
10
-
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
34
-
35
- **Scheduling for now (immediate reservation)**
36
-
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
41
-
42
- *Required Parameters:*
43
-
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
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)
11
+ The workflow involves
12
+ - ####Finding available session times
13
+ - getAvailableTimeslotsBetween
14
+
15
+ Getting the available session timeslots between two time-specific dates
16
+
17
+ - getAvailableTimeslotsAround
18
+
19
+ Getting the available session timeslots around one time-specific date
20
+
21
+ - ####Making a session reservation
22
+ - makeReservation
23
+
24
+ Making a future reservation based on a time-specific date
25
+
26
+ - makeImmediateReservation
27
+
28
+ Making an immediate reservation
29
+
30
+ - ####Canceling a reservation
31
+
32
+ - cancelReservation
33
+
34
+ Canceling a reservation based on a session ID which is created when making a reservation
35
+
36
+ - ####Launching a session
37
+
38
+ - generateJsonpToken
39
+
40
+ Generating a JSONP token that renders a 'Download' button for ProctorApp and grants temporary JSONP access for the web browser the user is using to launch the session.
41
+
42
+ - ####Creating a session event
43
+
44
+ - createSessionEvent
45
+
46
+ Creating a severity-defined session event based on regular and irregular session activity such as irregular eye movement, checking into a session, etc. A list of session events can be found in SessionEvent.php.
47
+
48
+ Session events are documented by the proctor and can be seen in the web interface after logging in with one's customer account.
49
+
50
+
51
+ - ####Reviewing the sesison
52
+
53
+ - generateSecureReviewUrl
54
+
55
+ Generating a secure URL that grants temporary customer access to the review screen of one of their users' sessions. The review screen consists of the exam taker's audio, video, and desktop activity as recorded by ProctorApp. It can be accessed live or after the session has ended.
56
+
57
+
58
+ ### Example workflow
59
+
60
+ ***Note:*** Required and optional parameters for each method can be found in the included documentaiton
61
+
62
+ #####*Finding available session times* (getAvailableTimeslotsBetween, getAvailableTimeslotsAround)
63
+ An exam taker in the integrating system is searching for a time to schedule a session
64
+
65
+ - The integrating system makes an API request to Proctorserve to search for available timeslots
66
+ - The integrating system presents the exam taker with a list of schedulable times
67
+
68
+ #####*Making a session reservation* (makeReservation, makeImmediateReservation)
69
+
70
+ - An exam taker in the integrating system either schedules a future exam or an immediate exam
71
+
72
+ - **Future Reservation**
73
+ - The integrating system makes an API request to Proctorserve to get a list of schedulable times
74
+ - The exam taker chooses a schedulable time, triggering an API request to Proctorserve to make a reservation for that user at that time
75
+ - **Immediate Reservation**
76
+ - The integrating system makes an API request to Proctorserve to make an immediate reservation
77
+ - On exam day, the integrating system presents the exam taker with the Proctorserve launch session component
78
+ - The exam taker downloads the ProctorApp desktop application and completes their session
79
+
80
+ #####*Canceling a reservation* (cancelReservation)
81
+
82
+ - A exam taker in the integrating system cancels a reserved session
83
+ - The integrating system make an API request with the exam taker's unique session ID to cancel the reservation
84
+
85
+ #####*Launching a session* (generateJsonpToken)
86
+
87
+ - A exam taker in the integrating system is ready to start his session
88
+ - The integrating system makes an API request to generate a JSONP token
89
+ - The integrating system can generate the token and implement the session launcher component wherever seems fit in the system
90
+
91
+ #####*Creating a session event* (createSessionEvent)
92
+
93
+ - A session reviewer wants to create a session event
94
+ - The integrating system makes an API request to the session's proctor along with the event type and severity
95
+
96
+ #####*Reviewing a session* (generateSecureReviewUrl)
97
+ - A customer wants to review a live or recorded session
98
+ - The integrating system makes an API request to generate a secure review URL for the customer
99
+ - The secure review URL can be loaded into an iframe or a new window
71
100
 
72
101
  #### Installation
73
102
 
@@ -118,5 +147,6 @@ proctorserv_api.generate_jsonp_token
118
147
  proctorserv_api.generate_secure_review_url
119
148
  proctorserv_api.create_session_event
120
149
  ```
150
+ ### Full Documentation
121
151
 
122
152
  Further documentation for these methods can be found [here](http://rubydoc.info/github/ProctorCam/proctorserv-api-rb/master/frames)
@@ -3,7 +3,6 @@ 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'
7
6
 
8
7
  #
9
8
  # proctorserv_api.rb
@@ -30,7 +29,7 @@ module ProctorCam
30
29
  module Proctorserv
31
30
  class ProctorservApi
32
31
 
33
- VERSION = "1.0.4"
32
+ VERSION = "1.0.5"
34
33
 
35
34
  def initialize(api_identifier, shared_secret, service_protocol = "https", service_url = "service.proctorcam.com")
36
35
  @service_protocol = service_protocol
@@ -40,9 +39,9 @@ module ProctorCam
40
39
  end
41
40
 
42
41
  # Get a list of schedulable timeslots (represented as Time objects) between two
43
- # times for a given test that needs to be scheduled. This API request takes the
42
+ # times for a given exam that needs to be scheduled. This API request takes the
44
43
  # provided session_duration into account when comparing Proctorserve business hours.
45
- # The timeslots returned are specific for a test of duration provided.
44
+ # The timeslots returned are specific for an exam of duration provided.
46
45
  #
47
46
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
48
47
  #
@@ -51,7 +50,7 @@ module ProctorCam
51
50
  # - :lower_bound (Time or int seconds since epoch) - the earlier of two timestamps to find available timeslots between
52
51
  # - :upper_bound (Time or int seconds since epoch) - the later of two timestamps to find available timeslots between
53
52
  # - :session_duration (int) - is the length in minutes alloted for this examination
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
53
+ # @return [Array<Time>] list of Time objects that represent schedulable timeslots in Proctorserve for an exam of length session_duration between lower_bound and upper_bound
55
54
  def get_available_timeslots_between(options)
56
55
  requires_of options, [:lower_bound, :upper_bound, :session_duration]
57
56
  url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
@@ -64,19 +63,19 @@ module ProctorCam
64
63
  end
65
64
 
66
65
  # Get a list of schedulable timeslots (represented as Time objects) around the
67
- # time for a given test that needs to be scheduled. This API request takes the
66
+ # time for a given exam that needs to be scheduled. This API request takes the
68
67
  # provided session_duration into account when comparing Proctorserve business hours.
69
- # The timeslots returned are specific for a test of duration provided. At most
68
+ # The timeslots returned are specific for an exam of duration provided. At most
70
69
  # 20 slots will be returned
71
70
  #
72
71
  # This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
73
72
  #
74
73
  # @param [Hash{Symbol => String}] options
75
74
  # Required:
76
- # - :time (Time or int seconds since epoch) - time around which to find slots
75
+ # - :time (Time or int seconds since epoch) - time around which to find schedulable slots
77
76
  # - :num_slots (int) - number of slots to return
78
77
  # - :session_duration (int) - length in minutes alloted for this examination
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
78
+ # @return [Array<Time>] list (length num_slots or 20) of Time objects that represent schedulable timeslots in Proctorserve for an exam of length session_duration around time passed in options hash
80
79
  def get_available_timeslots_around(options)
81
80
  requires_of options, [:time, :num_slots, :session_duration]
82
81
  url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
@@ -95,17 +94,17 @@ module ProctorCam
95
94
  # @param [Hash{Symbol => String}] options
96
95
  # Required:
97
96
  # - :time (Time or int seconds since epoch) - Scheduable time for examination, as obtained by get_available_timeslots_between or get_available_timeslots_around
98
- # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
99
- # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
97
+ # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this exam
98
+ # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this exam
100
99
  # - :client_code (String) - Unique identifier for API customer's client
101
- # - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
100
+ # - :reservation_id (String) - Unique identifier representing this exam instance in API customer's system
102
101
  # - :session_duration (int) - Session length in minutes
103
- # - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
102
+ # - :exam_code (String) - Unique identifier representing the group of exams this specific exam instance belongs to
104
103
  # Optional:
105
104
  # - :complete_url (String) - URL that the candidate is redirected to after exam completion
106
105
  # - :first_name (String) - First name of the candidate taking the exam
107
106
  # - :last_name (String) - Last name of the candidate taking the exam
108
- # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not scheduable.
107
+ # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not schedulable.
109
108
  def make_reservation(options)
110
109
  requires_of options, [:time, :customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
111
110
  url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
@@ -126,17 +125,17 @@ module ProctorCam
126
125
  #
127
126
  # @param [Hash{Symbol => String}] options
128
127
  # Required:
129
- # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this test
130
- # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this test
128
+ # - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this exam
129
+ # - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this exam
131
130
  # - :client_code (String) - Unique identifier for API customer's client
132
- # - :reservation_id (String) - Unique identifier representing this test instance in API customer's system
131
+ # - :reservation_id (String) - Unique identifier representing this exam instance in API customer's system
133
132
  # - :session_duration (int) - Session length in minutes
134
- # - :exam_code (String) - Unique identifier representing the group of tests this specific test instance belongs to
133
+ # - :exam_code (String) - Unique identifier representing the group of exams this specific exam instance belongs to
135
134
  # Optional:
136
135
  # - :complete_url (String) - URL that the candidate is redirected to after exam completion
137
136
  # - :first_name (String) - First name of the candidate taking the exam
138
137
  # - :last_name (String) - Last name of the candidate taking the exam
139
- # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not scheduable.
138
+ # @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not schedulable.
140
139
  def make_immediate_reservation(options)
141
140
  requires_of options, [:customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
142
141
  url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
@@ -158,7 +157,7 @@ module ProctorCam
158
157
  # @param [Hash{Symbol => String}] options
159
158
  # Required:
160
159
  # - :session_id (int) Proctorserve id for the session to be canceled
161
- # @return [Boolean] whether or not the test was successfully canceled.
160
+ # @return [Boolean] whether or not the exam was successfully canceled.
162
161
  def cancel_reservation(options)
163
162
  requires_of options, [:session_id]
164
163
  url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
@@ -177,8 +176,11 @@ module ProctorCam
177
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.
178
177
  #
179
178
  # @param [Hash{Symbol => String}] options
180
- # - :session_id (int) Proctorserve id for the session to grant access to
181
- # - :duration (int) Number of minutes to grant access for (defaults to 1 hour, maximum 3 hours)
179
+ # Required:
180
+ # - :session_id (int) Proctorserve id for the session to grant access to
181
+ # Optional:
182
+ # - :duration (int) Number of minutes to grant access for (defaults to 1 hour, maximum 3 hours)
183
+ # @return [String] the jsonp token
182
184
  def generate_jsonp_token(options)
183
185
  requires_of options, [:session_id]
184
186
 
@@ -191,12 +193,15 @@ module ProctorCam
191
193
  end
192
194
 
193
195
  # Generate a secure token that can be used to grant temporary access to a session for a web browser user to review a session.
194
- # Can be loaded an iframe or a new window to grant secure access to a single user for a specified period of time
196
+ # Can be loaded in an iframe or a new window to grant secure access to a single user for a specified period of time
195
197
  #
196
198
  # @param [Hash{Symbol => String}] options
197
- # - :session_id (int) Proctorserve id for the session to grant review access to
198
- # - :proctor_id (String) unique identifier representing the user to grant access to. This will determine the user's display name in Proctorserve interfaces.
199
- # - :duration (int) Number of minutes link stays active for (defaults to 5 minutes)
199
+ # Required:
200
+ # - :session_id (int) Proctorserve id for the session to grant review access to
201
+ # - :proctor_id (String) unique identifier representing the user to grant access to. This will determine the user's display name in Proctorserve interfaces.
202
+ # Optional:
203
+ # - :duration (int) Number of minutes link stays active for (defaults to 5 minutes)
204
+ # @return [String] a URL to review the session
200
205
  def generate_secure_review_url(options)
201
206
  requires_of options, [:proctor_id, :session_id]
202
207
 
@@ -220,7 +225,7 @@ module ProctorCam
220
225
  # - :time (String) (Time or int seconds since epoch) Date and Time that the session event happened at
221
226
  # - :severity (int) (Defaults to 0) The severity of the session_event being created.
222
227
  # - 0: Lowest severity
223
- # - 1: Highest Severity, may be used for events like test revoked or emergency.
228
+ # - 1: Highest Severity, may be used for events like exam revoked or emergency.
224
229
  # - 2: Medium Severity, the session needs to be reviewed.
225
230
  # - 3: Low Severity, common events like going through the system check.
226
231
  # @return [Boolean] whether or not the session event was successfully created.
@@ -179,14 +179,14 @@ describe ProctorCam::Proctorserv::ProctorservApi do
179
179
  end
180
180
 
181
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}
182
+ options = {:session_id => 427, :event_type => "completed", :proctor_id => "foo", :severity => 2}
183
183
  result = @proctorserv_api.create_session_event options
184
184
  result.should be_true
185
185
  end
186
186
 
187
187
  it "returns false if the customer does not have the session_id passed" do
188
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}
189
+ options = {:session_id => -1, :event_type => "completed", :proctor_id => "foo", :severity => 2}
190
190
  result = proctorserv_api.create_session_event options
191
191
  result.should be_false
192
192
  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.4
4
+ version: 1.0.5
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-22 00:00:00.000000000 Z
12
+ date: 2013-09-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -57,7 +57,6 @@ 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
61
60
  - lib/proctorserv_api.rb
62
61
  - LICENSE
63
62
  - README.md
@@ -1,51 +0,0 @@
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