quiz_api_client 4.2.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/quiz_api_client/services/courses_service.rb +26 -0
- data/lib/quiz_api_client/services/items_service.rb +11 -0
- data/lib/quiz_api_client/services/quiz_clone_jobs_service.rb +11 -0
- data/lib/quiz_api_client/services/quiz_sync_job_service.rb +17 -0
- data/lib/quiz_api_client/services/quiz_sync_jobs_service.rb +16 -0
- data/lib/quiz_api_client/version.rb +1 -1
- data/lib/quiz_api_client.rb +15 -0
- data/spec/config_spec.rb +66 -0
- data/spec/contracts/interaction_types_service_spec.rb +22 -0
- data/spec/contracts/item_analyses_service_spec.rb +59 -0
- data/spec/contracts/items_service_spec.rb +59 -0
- data/spec/contracts/qti_imports_service_spec.rb +34 -0
- data/spec/contracts/quiz_clone_job_service_spec.rb +20 -0
- data/spec/contracts/quiz_clone_jobs_service_spec.rb +21 -0
- data/spec/contracts/quiz_entries_service_spec.rb +125 -0
- data/spec/contracts/quiz_service_spec.rb +68 -0
- data/spec/contracts/quiz_session_events_service_spec.rb +30 -0
- data/spec/contracts/quiz_session_result_service_spec.rb +42 -0
- data/spec/contracts/quiz_session_service_spec.rb +56 -0
- data/spec/contracts/quiz_sessions_service_spec.rb +28 -0
- data/spec/contracts/quiz_sync_job_service_spec.rb +21 -0
- data/spec/contracts/quiz_sync_jobs_service_spec.rb +21 -0
- data/spec/contracts/quizzes_service_spec.rb +80 -0
- data/spec/contracts/session_item_results_service_spec.rb +60 -0
- data/spec/contracts/session_items_service_spec.rb +21 -0
- data/spec/contracts/shared_banks_spec.rb +366 -0
- data/spec/contracts/shared_examples/http_delete_example.rb +56 -0
- data/spec/contracts/shared_examples/http_get_example.rb +139 -0
- data/spec/contracts/shared_examples/http_patch_example.rb +60 -0
- data/spec/contracts/shared_examples/http_post_example.rb +68 -0
- data/spec/contracts/shared_examples/http_put_example.rb +60 -0
- data/spec/http_client_spec.rb +347 -0
- data/spec/json_formatter_spec.rb +32 -0
- data/spec/quiz_api_client/http_request/failure_spec.rb +100 -0
- data/spec/quiz_api_client/http_request/metrics_spec.rb +75 -0
- data/spec/quiz_api_client_spec.rb +124 -0
- data/spec/services/base_api_service_spec.rb +50 -0
- data/spec/services/courses_service_spec.rb +59 -0
- data/spec/services/interaction_types_service_spec.rb +25 -0
- data/spec/services/item_analyses_service_spec.rb +76 -0
- data/spec/services/items_service_spec.rb +56 -0
- data/spec/services/jwt_service_spec.rb +66 -0
- data/spec/services/qti_imports_service_spec.rb +114 -0
- data/spec/services/quiz_analyses_service_spec.rb +44 -0
- data/spec/services/quiz_clone_job_service_spec.rb +41 -0
- data/spec/services/quiz_clone_jobs_service_spec.rb +77 -0
- data/spec/services/quiz_entries_service_spec.rb +71 -0
- data/spec/services/quiz_service_spec.rb +49 -0
- data/spec/services/quiz_session_events_service_spec.rb +42 -0
- data/spec/services/quiz_session_result_service_spec.rb +26 -0
- data/spec/services/quiz_session_service_spec.rb +49 -0
- data/spec/services/quiz_sessions_service_spec.rb +42 -0
- data/spec/services/quiz_sync_job_service_spec.rb +41 -0
- data/spec/services/quiz_sync_jobs_service_spec.rb +77 -0
- data/spec/services/quizzes_service_spec.rb +71 -0
- data/spec/services/session_item_results_service_spec.rb +33 -0
- data/spec/services/session_items_service_spec.rb +26 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/support/pact_config.rb +64 -0
- data/spec/support/pact_helper.rb +19 -0
- metadata +121 -39
- data/.dockerignore +0 -7
- data/.editorconfig +0 -16
- data/.gitignore +0 -13
- data/.rspec +0 -3
- data/.rubocop.yml +0 -72
- data/CHANGELOG.md +0 -35
- data/Dockerfile +0 -12
- data/Gemfile +0 -5
- data/Jenkinsfile +0 -86
- data/bin/console +0 -7
- data/bin/contracts-generate +0 -26
- data/bin/setup +0 -65
- data/docker-compose.dev.override.yml +0 -11
- data/docker-compose.yml +0 -10
- data/quiz_api_client.gemspec +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e1f12f936c33b3cf09fe4f8475aa40dfc7dbde37e65ed81b7d62ef07d23c86c
|
4
|
+
data.tar.gz: 9b4895c5dedd2d56fb64a79d2d03e5c6a8989832a9a51f912920fd71aa67582b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '009317d5880a188a2ba3ed14f1b937fc34b35f169ab819aaedfd57c09550b5a9acea19db12d6ca8591c13cd41b252e200d82022a236cfdd6f6271a682496ee38'
|
7
|
+
data.tar.gz: 5f8059807154051560b72466ad20452f4f42b771e528ed1a9235d3eca12e0e802af9ca7fe5434dcd740dd808908181357474659bd6c66af25d9ff0072d0ee949
|
data/README.md
CHANGED
@@ -199,7 +199,7 @@ Pact file to a local Pact Broker.
|
|
199
199
|
|
200
200
|
### Development Workflow:
|
201
201
|
|
202
|
-
1. In the quiz_api repo, spin up the Quiz API service with `bin/
|
202
|
+
1. In the quiz_api repo, spin up the Quiz API service with `bin/setup`
|
203
203
|
2. In the quiz_pact_broker repo, spin up a Pact Broker with `bin/dev-setup`
|
204
204
|
3. In the quiz_api repo, write Pact provider states in the
|
205
205
|
spec/service_consumers/api/quiz_api_client_ruby/ directory as needed
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module QuizApiClient::Services
|
2
|
+
class CoursesService < BaseApiService
|
3
|
+
def create(params:, token: nil)
|
4
|
+
post_to_quiz_api(params: params, token: token)
|
5
|
+
end
|
6
|
+
|
7
|
+
def destroy(params:, token: nil)
|
8
|
+
delete_from_quiz_api(params: params, token: token)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def post_to_quiz_api(params:, token:)
|
14
|
+
client(token: token).post(
|
15
|
+
'/api/courses',
|
16
|
+
course: params
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def delete_from_quiz_api(params:, token:)
|
21
|
+
client(token: token).delete(
|
22
|
+
"/api/courses/#{params[:canvas_id]}"
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
module QuizApiClient::Services
|
2
2
|
class ItemsService < BaseApiService
|
3
|
+
def list(params:, token: nil)
|
4
|
+
raise 'Quiz Id Required' unless params && params[:quiz_id]
|
5
|
+
|
6
|
+
list_from_quiz_api(params: params, token: token)
|
7
|
+
end
|
8
|
+
|
3
9
|
def create(params:, token: nil)
|
4
10
|
raise 'Quiz Id Required' unless params && params[:quiz_id]
|
5
11
|
|
@@ -8,6 +14,11 @@ module QuizApiClient::Services
|
|
8
14
|
|
9
15
|
private
|
10
16
|
|
17
|
+
def list_from_quiz_api(params:, token:)
|
18
|
+
quiz_id = params.delete(:quiz_id)
|
19
|
+
client(token: token).get("/api/quizzes/#{quiz_id}/items")
|
20
|
+
end
|
21
|
+
|
11
22
|
def post_to_quiz_api(params:, token:)
|
12
23
|
quiz_id = params.delete(:quiz_id)
|
13
24
|
client(token: token).post(
|
@@ -4,6 +4,10 @@ module QuizApiClient::Services
|
|
4
4
|
post_to_quiz_api(params: params, token: token)
|
5
5
|
end
|
6
6
|
|
7
|
+
def create_batch(body:, token: nil)
|
8
|
+
batch_post_to_quiz_api(body: body, token: token)
|
9
|
+
end
|
10
|
+
|
7
11
|
private
|
8
12
|
|
9
13
|
def post_to_quiz_api(params:, token:)
|
@@ -11,5 +15,12 @@ module QuizApiClient::Services
|
|
11
15
|
"/api/quizzes/#{params.fetch(:quiz_id)}/quiz_clone_jobs"
|
12
16
|
)
|
13
17
|
end
|
18
|
+
|
19
|
+
def batch_post_to_quiz_api(body:, token:)
|
20
|
+
client(token: token).post(
|
21
|
+
'/api/quiz_clone_jobs/create_batch',
|
22
|
+
body
|
23
|
+
)
|
24
|
+
end
|
14
25
|
end
|
15
26
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module QuizApiClient::Services
|
2
|
+
class QuizSyncJobService < BaseApiService
|
3
|
+
def show(params:, token: nil)
|
4
|
+
raise 'Quiz Sync Job Id Required' unless params && params[:id]
|
5
|
+
|
6
|
+
get_from_quiz_api(params: params, token: token)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def get_from_quiz_api(params:, token:)
|
12
|
+
client(token: token).get(
|
13
|
+
"/api/quiz_sync_jobs/#{params.fetch(:id)}"
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module QuizApiClient::Services
|
2
|
+
class QuizSyncJobsService < BaseApiService
|
3
|
+
def create_batch(body:, token: nil)
|
4
|
+
batch_post_to_quiz_api(body: body, token: token)
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def batch_post_to_quiz_api(body:, token:)
|
10
|
+
client(token: token).post(
|
11
|
+
'/api/quiz_sync_jobs/create_batch',
|
12
|
+
body
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/quiz_api_client.rb
CHANGED
@@ -22,6 +22,10 @@ module QuizApiClient
|
|
22
22
|
@_config ||= QuizApiClient::Config.new
|
23
23
|
end
|
24
24
|
|
25
|
+
def courses_service
|
26
|
+
@_courses_service ||= Services::CoursesService.new(config)
|
27
|
+
end
|
28
|
+
|
25
29
|
def jwt_service
|
26
30
|
@_jwt_service ||= QuizApiClient::Services::JwtService.new(config)
|
27
31
|
end
|
@@ -50,6 +54,14 @@ module QuizApiClient
|
|
50
54
|
@_quiz_clone_jobs_service ||= Services::QuizCloneJobsService.new(config)
|
51
55
|
end
|
52
56
|
|
57
|
+
def quiz_sync_job_service
|
58
|
+
@_quiz_sync_job_service ||= Services::QuizSyncJobService.new(config)
|
59
|
+
end
|
60
|
+
|
61
|
+
def quiz_sync_jobs_service
|
62
|
+
@_quiz_sync_jobs_service ||= Services::QuizSyncJobsService.new(config)
|
63
|
+
end
|
64
|
+
|
53
65
|
def qti_imports_service
|
54
66
|
@_qti_imports_service ||= Services::QtiImportsService.new(config)
|
55
67
|
end
|
@@ -106,6 +118,7 @@ require 'quiz_api_client/http_request/metrics'
|
|
106
118
|
require 'quiz_api_client/services/jwt_service'
|
107
119
|
require 'quiz_api_client/services/base_api_service'
|
108
120
|
|
121
|
+
require 'quiz_api_client/services/courses_service'
|
109
122
|
require 'quiz_api_client/services/interaction_types_service'
|
110
123
|
require 'quiz_api_client/services/item_analyses_service'
|
111
124
|
require 'quiz_api_client/services/items_service'
|
@@ -120,6 +133,8 @@ require 'quiz_api_client/services/quizzes_service'
|
|
120
133
|
require 'quiz_api_client/services/quiz_session_result_service'
|
121
134
|
require 'quiz_api_client/services/quiz_clone_job_service'
|
122
135
|
require 'quiz_api_client/services/quiz_clone_jobs_service'
|
136
|
+
require 'quiz_api_client/services/quiz_sync_job_service'
|
137
|
+
require 'quiz_api_client/services/quiz_sync_jobs_service'
|
123
138
|
require 'quiz_api_client/services/session_items_service'
|
124
139
|
require 'quiz_api_client/services/session_item_results_service'
|
125
140
|
require 'quiz_api_client/services/shared_banks'
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
describe QuizApiClient::Config do
|
2
|
+
describe 'initialize with block' do
|
3
|
+
it 'sets the config value' do
|
4
|
+
config = described_class.new do |c|
|
5
|
+
c.host = 'a host'
|
6
|
+
end
|
7
|
+
expect(config.host).to eq 'a host'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#protocol' do
|
12
|
+
it 'returns the default when nil' do
|
13
|
+
config = described_class.new
|
14
|
+
expect(config.protocol).to eq QuizApiClient::Config::DEFAULT_PROTOCOL
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#error_handler=' do
|
19
|
+
it 'raises an error with an invalid error handler' do
|
20
|
+
config = described_class.new
|
21
|
+
expect { config.error_handler = :invalid_error_handler }
|
22
|
+
.to raise_error(QuizApiClient::Config::InvalidErrorHandler)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#allowable_response_codes' do
|
27
|
+
it 'returns the default when nil' do
|
28
|
+
config = described_class.new
|
29
|
+
expect(config.allowable_response_codes).to eq QuizApiClient::Config::DEFAULT_ALLOWABLE_RESPONSE_CODES
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#setup_metrics' do
|
34
|
+
let(:valid_handler) { :inststatsd }
|
35
|
+
let(:invalid_handler) { :invalid_handler }
|
36
|
+
|
37
|
+
let(:valid_namespace) { :quiz_lti }
|
38
|
+
let(:invalid_namespace) { ' ' }
|
39
|
+
|
40
|
+
it 'raises an error with an invalid metrics handler' do
|
41
|
+
config = described_class.new
|
42
|
+
expect { config.setup_metrics(invalid_handler, valid_namespace) }
|
43
|
+
.to raise_error(QuizApiClient::Config::InvalidMetricsHandler)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'raises an error with an invalid namespace' do
|
47
|
+
config = described_class.new
|
48
|
+
expect { config.setup_metrics(valid_handler, invalid_namespace) }
|
49
|
+
.to raise_error(QuizApiClient::Config::InvalidMetricsNamespace)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'raises an error with an nil namespace' do
|
53
|
+
config = described_class.new
|
54
|
+
expect { config.setup_metrics(valid_handler, nil) }
|
55
|
+
.to raise_error(QuizApiClient::Config::InvalidMetricsNamespace)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'sets the handler and namespace successfully' do
|
59
|
+
config = described_class.new
|
60
|
+
config.setup_metrics(valid_handler, valid_namespace)
|
61
|
+
|
62
|
+
expect(config.metrics_handler).to eq valid_handler
|
63
|
+
expect(config.metrics_namespace).to eq valid_namespace.to_s
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
describe QuizApiClient::Services::InteractionTypesService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api collection endpoint' do
|
5
|
+
let(:provider_state) { 'a set of interaction types' }
|
6
|
+
let(:request_description) { 'a request to retrieve a list of interaction types' }
|
7
|
+
let(:quizzes_api_path) { '/api/interaction_types' }
|
8
|
+
let(:scope) { 'quiz.build' }
|
9
|
+
let(:params) { nil }
|
10
|
+
let(:response_body) do
|
11
|
+
Pact.each_like(
|
12
|
+
id: '1',
|
13
|
+
slug: 'choice',
|
14
|
+
name: 'Multiple Choice',
|
15
|
+
properties_schema: {},
|
16
|
+
scoring_algorithm_default: 'Equivalence',
|
17
|
+
user_response_type_options: ['Uuid']
|
18
|
+
)
|
19
|
+
end
|
20
|
+
let(:service_name) { :interaction_types_service }
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
describe QuizApiClient::Services::ItemAnalysesService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api collection endpoint', testrail_id: %w[3402546] do
|
5
|
+
let(:request_description) { 'a request to retrieve item analyses all quiz_id items' }
|
6
|
+
let(:quiz_id) { 1 }
|
7
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/stats/item_analyses" }
|
8
|
+
let(:provider_state) { 'quiz with item analysis' }
|
9
|
+
let(:resource_id) { '1' }
|
10
|
+
let(:scope) { 'quiz.analysis' }
|
11
|
+
let(:params) { { quiz_id: '1' } }
|
12
|
+
let(:response_body) do
|
13
|
+
[
|
14
|
+
{
|
15
|
+
item_id: Pact.like('1'),
|
16
|
+
points_possible: Pact.like(1.0),
|
17
|
+
item_body: Pact.like('item body'),
|
18
|
+
interaction_type: 'choice',
|
19
|
+
item_analysis: {},
|
20
|
+
batch_timestamp: Pact.like('2017-06-15T22:14:51.215Z'),
|
21
|
+
outcome_alignment_set_guid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a')
|
22
|
+
},
|
23
|
+
{
|
24
|
+
item_id: Pact.like('1'),
|
25
|
+
points_possible: Pact.like(1.0),
|
26
|
+
item_body: Pact.like('item body'),
|
27
|
+
interaction_type: 'choice',
|
28
|
+
item_analysis: {},
|
29
|
+
batch_timestamp: Pact.like('2017-06-15T22:14:51.215Z'),
|
30
|
+
outcome_alignment_set_guid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a')
|
31
|
+
}
|
32
|
+
]
|
33
|
+
end
|
34
|
+
let(:service_name) { :item_analyses_service }
|
35
|
+
end
|
36
|
+
|
37
|
+
it_behaves_like 'a http get only request to quiz_api', testrail_id: %w[3402547] do
|
38
|
+
let(:request_description) { 'a request to retrieve item analyses for a quiz item' }
|
39
|
+
let(:quiz_id) { 1 }
|
40
|
+
let(:id) { 1 }
|
41
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/stats/item_analyses/#{id}" }
|
42
|
+
let(:provider_state) { 'quiz with item analysis' }
|
43
|
+
let(:resource_id) { '1' }
|
44
|
+
let(:scope) { 'quiz.analysis' }
|
45
|
+
let(:params) { { quiz_id: '1', id: '1' } }
|
46
|
+
let(:response_body) do
|
47
|
+
{
|
48
|
+
item_id: Pact.like('1'),
|
49
|
+
points_possible: Pact.like(1.0),
|
50
|
+
item_body: Pact.like('item body'),
|
51
|
+
interaction_type: 'choice',
|
52
|
+
item_analysis: {},
|
53
|
+
batch_timestamp: Pact.like('2017-06-15T22:14:51.215Z'),
|
54
|
+
outcome_alignment_set_guid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a')
|
55
|
+
}
|
56
|
+
end
|
57
|
+
let(:service_name) { :item_analyses_service }
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
describe QuizApiClient::Services::ItemsService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http post request to quiz_api' do
|
5
|
+
let(:provider_state) { 'a quiz and a multiple choice interaction type' }
|
6
|
+
let(:request_description) { 'a request to create an item' }
|
7
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/items" }
|
8
|
+
let(:resource_id) { '1' }
|
9
|
+
let(:scope) { 'quiz.build' }
|
10
|
+
let(:quiz_id) { 1 }
|
11
|
+
let(:params) do
|
12
|
+
{
|
13
|
+
quiz_id: quiz_id,
|
14
|
+
interaction_data: {
|
15
|
+
choices: [{
|
16
|
+
id: 'guid',
|
17
|
+
itemBody: '<p>Choice</p>',
|
18
|
+
position: 1
|
19
|
+
}]
|
20
|
+
},
|
21
|
+
interaction_type_id: 1, # we'll seed InteractionType::MultipleChoice
|
22
|
+
item_body: 'Some kind of stem',
|
23
|
+
properties: {},
|
24
|
+
scoring_algorithm: 'Equivalence',
|
25
|
+
scoring_data: {
|
26
|
+
value: 'another guid'
|
27
|
+
},
|
28
|
+
title: 'A perfectly cromulent title',
|
29
|
+
user_response_type: 'Uuid'
|
30
|
+
}
|
31
|
+
end
|
32
|
+
let(:item_params) { params.clone.tap { |p| p.delete(:quiz_id) } }
|
33
|
+
let(:body) { { quiz_id: quiz_id, item: item_params } }
|
34
|
+
let(:response_body) do
|
35
|
+
{
|
36
|
+
id: Pact.like('1'),
|
37
|
+
interaction_data: {
|
38
|
+
choices: Pact.each_like(
|
39
|
+
id: 'a guid',
|
40
|
+
item_body: 'choice description',
|
41
|
+
position: 1
|
42
|
+
)
|
43
|
+
},
|
44
|
+
item_body: Pact.like(''),
|
45
|
+
properties: Pact.like({}),
|
46
|
+
status: Pact.like(''),
|
47
|
+
title: Pact.like(''),
|
48
|
+
user_response_type: Pact.like(''),
|
49
|
+
stimulus_id: Pact.like(''),
|
50
|
+
interaction_type: Pact.like({}),
|
51
|
+
scoring_data: {
|
52
|
+
value: Pact.like('')
|
53
|
+
},
|
54
|
+
scoring_algorithm: Pact.like('')
|
55
|
+
}
|
56
|
+
end
|
57
|
+
let(:service_name) { :items_service }
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
describe QuizApiClient::Services::QtiImportsService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http post request to quiz_api', testrail_id: %w[3402548] do
|
5
|
+
let(:request_description) { 'a request to import a QTI' }
|
6
|
+
let(:provider_state) { 'a quiz' }
|
7
|
+
let(:quiz_id) { 1 }
|
8
|
+
let(:url) { 'http://fake.url' }
|
9
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/qti_imports" }
|
10
|
+
let(:scope) { 'qti_import.create' }
|
11
|
+
let(:resource_id) { quiz_id }
|
12
|
+
let(:params) do
|
13
|
+
{
|
14
|
+
quiz_id: quiz_id,
|
15
|
+
url: url
|
16
|
+
}
|
17
|
+
end
|
18
|
+
let(:body) { { qti_import: params } }
|
19
|
+
let(:response_body) do
|
20
|
+
{
|
21
|
+
id: Pact.like('1'),
|
22
|
+
parent_id: quiz_id.to_s,
|
23
|
+
parent_type: Pact.like('Quiz'),
|
24
|
+
status: 'scheduled',
|
25
|
+
url: url,
|
26
|
+
message: Pact.like(''),
|
27
|
+
created_at: Pact.like(''),
|
28
|
+
updated_at: Pact.like(''),
|
29
|
+
progress: Pact.like(0.0)
|
30
|
+
}
|
31
|
+
end
|
32
|
+
let(:service_name) { :qti_imports_service }
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizCloneJobService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api' do
|
5
|
+
let(:request_description) { 'a request to retrieve a quiz clone job' }
|
6
|
+
let(:quizzes_api_path) { "/api/quiz_clone_jobs/#{resource_id}" }
|
7
|
+
let(:provider_state) { 'a quiz clone job' }
|
8
|
+
let(:scope) { 'quiz_clone_job.show' }
|
9
|
+
let(:params) { { id: resource_id } }
|
10
|
+
let(:resource_id) { '1' }
|
11
|
+
let(:response_body) do
|
12
|
+
{
|
13
|
+
id: Pact.like('1'),
|
14
|
+
original_quiz_id: Pact.like('1'),
|
15
|
+
status: Pact.like('scheduled')
|
16
|
+
}
|
17
|
+
end
|
18
|
+
let(:service_name) { :quiz_clone_job_service }
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizCloneJobsService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http post request to quiz_api' do
|
5
|
+
let(:request_description) { 'a request to clone a quiz' }
|
6
|
+
let(:quizzes_api_path) { "/api/quizzes/#{resource_id}/quiz_clone_jobs" }
|
7
|
+
let(:provider_state) { 'a quiz' }
|
8
|
+
let(:scope) { 'quiz.clone' }
|
9
|
+
let(:params) { { quiz_id: resource_id } }
|
10
|
+
let(:body) { {} }
|
11
|
+
let(:resource_id) { '1' }
|
12
|
+
let(:response_body) do
|
13
|
+
{
|
14
|
+
id: Pact.like('1'),
|
15
|
+
original_quiz_id: Pact.like('1'),
|
16
|
+
status: Pact.like('scheduled')
|
17
|
+
}
|
18
|
+
end
|
19
|
+
let(:service_name) { :quiz_clone_jobs_service }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizEntriesService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api collection endpoint', testrail_id: %w[3402549] do
|
5
|
+
let(:request_description) { 'a request to retrieve a list of quiz entries' }
|
6
|
+
let(:quiz_id) { 1 }
|
7
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/quiz_entries" }
|
8
|
+
let(:provider_state) { 'a set of quiz entries' }
|
9
|
+
let(:resource_id) { '1' }
|
10
|
+
let(:scope) { 'quiz.build' }
|
11
|
+
let(:params) { { id: '1' } }
|
12
|
+
let(:response_body) do
|
13
|
+
[
|
14
|
+
{
|
15
|
+
entry_editable: Pact.like(true),
|
16
|
+
entry_type: 'Item',
|
17
|
+
id: Pact.like('1'),
|
18
|
+
position: Pact.like(0),
|
19
|
+
properties: {},
|
20
|
+
regrade_adjusted_points_possible: nil,
|
21
|
+
status: 'mutable',
|
22
|
+
stimulus_quiz_entry_id: Pact.like('1'),
|
23
|
+
entry: {
|
24
|
+
id: Pact.like('1'),
|
25
|
+
title: Pact.like('item 1 title'),
|
26
|
+
label: Pact.like('item 1 label'),
|
27
|
+
user_response_type: Pact.like('Uuid'),
|
28
|
+
item_body: Pact.like('item 1 body'),
|
29
|
+
interaction_data: Pact.like({}),
|
30
|
+
interaction_type: {
|
31
|
+
id: Pact.like('1')
|
32
|
+
}
|
33
|
+
}
|
34
|
+
},
|
35
|
+
{
|
36
|
+
entry_editable: Pact.like(true),
|
37
|
+
entry_type: 'Item',
|
38
|
+
id: Pact.like('1'),
|
39
|
+
position: Pact.like(0),
|
40
|
+
properties: {},
|
41
|
+
regrade_adjusted_points_possible: nil,
|
42
|
+
status: 'mutable',
|
43
|
+
stimulus_quiz_entry_id: Pact.like('1'),
|
44
|
+
entry: {
|
45
|
+
id: Pact.like('1'),
|
46
|
+
title: Pact.like('item 1 title'),
|
47
|
+
label: Pact.like('item 1 label'),
|
48
|
+
user_response_type: Pact.like('Uuid'),
|
49
|
+
item_body: Pact.like('item 1 body'),
|
50
|
+
interaction_data: Pact.like({}),
|
51
|
+
interaction_type: {
|
52
|
+
id: Pact.like('1')
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
]
|
57
|
+
end
|
58
|
+
let(:service_name) { :quiz_entries_service }
|
59
|
+
end
|
60
|
+
|
61
|
+
it_behaves_like 'a http post request to quiz_api' do
|
62
|
+
let(:request_description) { 'a request to create a quiz entry' }
|
63
|
+
let(:quiz_id) { 1 }
|
64
|
+
let(:resource_id) { quiz_id }
|
65
|
+
let(:provider_state) { 'a quiz with an item' }
|
66
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/quiz_entries" }
|
67
|
+
let(:scope) { 'quiz.build' }
|
68
|
+
let(:params) do
|
69
|
+
{
|
70
|
+
id: quiz_id,
|
71
|
+
quiz_id: quiz_id,
|
72
|
+
entry_type: 'Item',
|
73
|
+
entry_id: 1,
|
74
|
+
points_possible: 1,
|
75
|
+
position: 1,
|
76
|
+
properties: {
|
77
|
+
points_possible: 1,
|
78
|
+
position: 1
|
79
|
+
}
|
80
|
+
}
|
81
|
+
end
|
82
|
+
let(:body) { { quiz_entry: params } }
|
83
|
+
let(:response_body) do
|
84
|
+
{
|
85
|
+
entry_editable: Pact.like(true),
|
86
|
+
entry_type: 'Item',
|
87
|
+
id: Pact.like('1'),
|
88
|
+
position: Pact.like(0),
|
89
|
+
properties: Pact.like({}),
|
90
|
+
regrade_adjusted_points_possible: nil,
|
91
|
+
status: 'mutable',
|
92
|
+
stimulus_quiz_entry_id: Pact.like('1'),
|
93
|
+
entry: {
|
94
|
+
id: Pact.like('1'),
|
95
|
+
title: Pact.like('item 1 title'),
|
96
|
+
label: Pact.like('item 1 label'),
|
97
|
+
user_response_type: Pact.like('Uuid'),
|
98
|
+
item_body: Pact.like('item 1 body'),
|
99
|
+
interaction_data: Pact.like({}),
|
100
|
+
interaction_type: {
|
101
|
+
id: Pact.like('1')
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
end
|
106
|
+
let(:service_name) { :quiz_entries_service }
|
107
|
+
end
|
108
|
+
|
109
|
+
it_behaves_like 'a http delete request to quiz_api' do
|
110
|
+
let(:request_description) { 'a request to delete a quiz entry' }
|
111
|
+
let(:quiz_id) { 1 }
|
112
|
+
let(:item_id) { 1 }
|
113
|
+
let(:resource_id) { quiz_id }
|
114
|
+
let(:provider_state) { 'a set of quiz entries' }
|
115
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/quiz_entries/#{item_id}" }
|
116
|
+
let(:scope) { 'quiz.build' }
|
117
|
+
let(:params) do
|
118
|
+
{
|
119
|
+
quiz_id: quiz_id,
|
120
|
+
id: item_id
|
121
|
+
}
|
122
|
+
end
|
123
|
+
let(:service_name) { :quiz_entries_service }
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api', testrail_id: %w[3402550] do
|
5
|
+
let(:service_name) { :quiz_service }
|
6
|
+
let(:request_description) { 'a request to retrieve a single quiz' }
|
7
|
+
let(:quizzes_api_path) { '/api/quizzes/1' }
|
8
|
+
let(:provider_state) { 'a quiz' }
|
9
|
+
let(:scope) { 'quiz.build' }
|
10
|
+
let(:params) { { id: '1' } }
|
11
|
+
let(:resource_id) { '1' }
|
12
|
+
let(:response_body) do
|
13
|
+
{
|
14
|
+
id: Pact.like('1'),
|
15
|
+
title: Pact.like('quiz title'),
|
16
|
+
context_id: Pact.like('1'),
|
17
|
+
session_time_limit_in_seconds: Pact.like(1),
|
18
|
+
instructions: Pact.like('quiz instructions'),
|
19
|
+
shuffle_questions: Pact.like(false),
|
20
|
+
shuffle_answers: Pact.like(false),
|
21
|
+
status: 'uninitialized',
|
22
|
+
owner: Pact.like('teacher'),
|
23
|
+
has_time_limit: Pact.like(false),
|
24
|
+
outcome_alignment_set_guid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a'),
|
25
|
+
one_at_a_time_type: 'question',
|
26
|
+
allow_backtracking: Pact.like(true)
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it_behaves_like 'a http patch request to quiz_api', testrail_id: %w[3402551] do
|
32
|
+
let(:service_name) { :quiz_service }
|
33
|
+
let(:request_description) { 'a request to update a quiz' }
|
34
|
+
let(:quizzes_api_path) { '/api/quizzes/1' }
|
35
|
+
let(:provider_state) { 'a quiz' }
|
36
|
+
let(:scope) { 'quiz.build' }
|
37
|
+
let(:title) { 'some new title' }
|
38
|
+
let(:params) do
|
39
|
+
{
|
40
|
+
id: '1',
|
41
|
+
title: title
|
42
|
+
}
|
43
|
+
end
|
44
|
+
let(:resource_id) { '1' }
|
45
|
+
let(:body) { { quiz: params } }
|
46
|
+
let(:response_body) do
|
47
|
+
{
|
48
|
+
id: Pact.like('1'),
|
49
|
+
title: title,
|
50
|
+
instructions: Pact.like('quiz instructions'),
|
51
|
+
context_id: Pact.like('1'),
|
52
|
+
owner: Pact.like('teacher1'),
|
53
|
+
has_time_limit: Pact.like(false),
|
54
|
+
allow_backtracking: Pact.like(true),
|
55
|
+
one_at_a_time_type: 'question',
|
56
|
+
session_time_limit_in_seconds: 0,
|
57
|
+
outcome_alignment_set_guid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a'),
|
58
|
+
require_student_access_code: Pact.like(false),
|
59
|
+
filter_ip_address: Pact.like(false),
|
60
|
+
shuffle_questions: Pact.like(false),
|
61
|
+
shuffle_answers: Pact.like(false),
|
62
|
+
status: 'unpublished',
|
63
|
+
student_access_code: Pact.like('3uXc15S3B'),
|
64
|
+
filters: Pact.like({})
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|