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