quiz_api_client 4.2.0 → 4.2.1
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/lib/quiz_api_client/services/items_service.rb +11 -0
- data/lib/quiz_api_client/version.rb +1 -1
- 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/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 +60 -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 +117 -0
- data/spec/services/base_api_service_spec.rb +50 -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 +41 -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/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 +108 -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: e2f68d04f56475db3135d3b6f74e36d19a3300c213622c6829cad7066c7f77a2
|
4
|
+
data.tar.gz: ddea88d65b109c9b5c685c4c5f54c7de741d27fe236ce6164e6a6f5a01a180a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4605af70971e585e3086828448d81903e180cacc99287003471f8c99863b940e719c5bb8735cf48c4bbf9aefb4486ab2ed72139c1d331b8fa8d5b73fdfab8a8f
|
7
|
+
data.tar.gz: f6fc9e7840d04d4ff65f5c442ccbc45b2314b565f801dc6a707c1ba8b13989e0aa57b43d9bd9cb39a947ad3eae08134e09cf82c9189a2d55a52c5bb0792b756f
|
@@ -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(
|
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
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizSessionEventsService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api collection endpoint', testrail_id: %w[3402552] do
|
5
|
+
let(:request_description) { 'a request to retrieve a list of quiz entries' }
|
6
|
+
let(:quiz_session_id) { 1 }
|
7
|
+
let(:quizzes_api_path) { "/api/quiz_sessions/#{quiz_session_id}/quiz_session_events" }
|
8
|
+
let(:provider_state) { 'set of session events' }
|
9
|
+
let(:resource_id) { '1' }
|
10
|
+
let(:scope) { 'quiz_sessions.log' }
|
11
|
+
let(:params) { { quiz_session_id: '1' } }
|
12
|
+
let(:response_body) do
|
13
|
+
[
|
14
|
+
{
|
15
|
+
created_at: Pact.like(''),
|
16
|
+
event_type: Pact.like(''),
|
17
|
+
event_data: {},
|
18
|
+
quiz_session_id: Pact.like('1')
|
19
|
+
},
|
20
|
+
{
|
21
|
+
created_at: Pact.like(''),
|
22
|
+
event_type: Pact.like(''),
|
23
|
+
event_data: {},
|
24
|
+
quiz_session_id: Pact.like('1')
|
25
|
+
}
|
26
|
+
]
|
27
|
+
end
|
28
|
+
let(:service_name) { :quiz_session_events_service }
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizSessionResultService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api', testrail_id: %w[3402553] do
|
5
|
+
let(:request_description) { 'a request to retrieve a quiz session result' }
|
6
|
+
let(:id) { 1 }
|
7
|
+
let(:quizzes_api_path) { "/api/results/#{id}" }
|
8
|
+
let(:provider_state) { 'a quiz session result' }
|
9
|
+
let(:resource_id) { '1' }
|
10
|
+
let(:scope) { 'quiz_session_result.show' }
|
11
|
+
let(:params) { { id: '1' } }
|
12
|
+
let(:response_body) do
|
13
|
+
{
|
14
|
+
created_at: Pact.like(''),
|
15
|
+
fudge_points: Pact.like(1.0),
|
16
|
+
grading_method: 'autograde',
|
17
|
+
id: Pact.like('1'),
|
18
|
+
percentage: Pact.like(1.0),
|
19
|
+
quiz_session_id: Pact.like('1'),
|
20
|
+
score: Pact.like(1.0),
|
21
|
+
status: 'graded',
|
22
|
+
quiz_session: {
|
23
|
+
id: Pact.like('1'),
|
24
|
+
account_uuid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a'),
|
25
|
+
end_at: nil,
|
26
|
+
start_at: Pact.like(''),
|
27
|
+
status: 'graded',
|
28
|
+
metadata: nil,
|
29
|
+
accepted_student_access_code: Pact.like(false),
|
30
|
+
attempt: Pact.like(1),
|
31
|
+
disable_timer: nil,
|
32
|
+
extra_time_in_seconds: nil,
|
33
|
+
timer_multiplier: nil,
|
34
|
+
elapsed_time: Pact.like(3600),
|
35
|
+
allow_backtracking: nil,
|
36
|
+
one_at_a_time_type: nil
|
37
|
+
}
|
38
|
+
}
|
39
|
+
end
|
40
|
+
let(:service_name) { :quiz_session_result_service }
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizSessionService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http get request to quiz_api', testrail_id: %w[3402554] do
|
5
|
+
let(:request_description) { 'a request to retrieve the graded quiz session' }
|
6
|
+
let(:quizzes_api_path) { '/api/quiz_sessions/1' }
|
7
|
+
let(:provider_state) { 'a graded quiz session' }
|
8
|
+
let(:scope) { 'quiz_session.show' }
|
9
|
+
let(:params) { { id: '1' } }
|
10
|
+
let(:resource_id) { '1' }
|
11
|
+
let(:response_body) do
|
12
|
+
{
|
13
|
+
id: Pact.like('1'),
|
14
|
+
account_uuid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a'),
|
15
|
+
end_at: nil,
|
16
|
+
start_at: Pact.like(''),
|
17
|
+
status: 'graded',
|
18
|
+
metadata: nil,
|
19
|
+
accepted_student_access_code: Pact.like(false),
|
20
|
+
attempt: Pact.like(1),
|
21
|
+
disable_timer: nil,
|
22
|
+
extra_time_in_seconds: nil,
|
23
|
+
timer_multiplier: nil,
|
24
|
+
elapsed_time: Pact.like(3600),
|
25
|
+
allow_backtracking: nil,
|
26
|
+
one_at_a_time_type: nil
|
27
|
+
}
|
28
|
+
end
|
29
|
+
let(:service_name) { :quiz_session_service }
|
30
|
+
end
|
31
|
+
|
32
|
+
it_behaves_like 'a http patch request to quiz_api', testrail_id: %w[3402555] do
|
33
|
+
let(:request_description) { 'a request to update a quiz session' }
|
34
|
+
let(:quizzes_api_path) { '/api/quiz_sessions/1' }
|
35
|
+
let(:provider_state) { 'a quiz session' }
|
36
|
+
let(:scope) { 'quiz_session.update' }
|
37
|
+
let(:attempt) { 2 }
|
38
|
+
let(:params) do
|
39
|
+
{
|
40
|
+
id: '1',
|
41
|
+
attempt: { attempt: 2 }
|
42
|
+
}
|
43
|
+
end
|
44
|
+
let(:resource_id) { '1' }
|
45
|
+
let(:body) { { quiz_session: params } }
|
46
|
+
let(:response_body) do
|
47
|
+
{
|
48
|
+
id: Pact.like('1'),
|
49
|
+
status: 'graded',
|
50
|
+
start_at: Pact.like(''),
|
51
|
+
end_at: Pact.like('')
|
52
|
+
}
|
53
|
+
end
|
54
|
+
let(:service_name) { :quiz_session_service }
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
describe QuizApiClient::Services::QuizSessionsService, :pact do
|
2
|
+
include PactHelper
|
3
|
+
|
4
|
+
it_behaves_like 'a http post request to quiz_api', testrail_id: %w[3402556] do
|
5
|
+
let(:request_description) { 'a request to create a quiz session' }
|
6
|
+
let(:provider_state) { 'a quiz' }
|
7
|
+
let(:quiz_id) { 1 }
|
8
|
+
let(:quizzes_api_path) { "/api/quizzes/#{quiz_id}/quiz_sessions" }
|
9
|
+
let(:scope) { 'quiz_session.create' }
|
10
|
+
let(:resource_id) { quiz_id }
|
11
|
+
let(:params) do
|
12
|
+
{
|
13
|
+
quiz_id: quiz_id,
|
14
|
+
attempt: 1
|
15
|
+
}
|
16
|
+
end
|
17
|
+
let(:body) { { quiz_session: params } }
|
18
|
+
let(:response_body) do
|
19
|
+
{
|
20
|
+
id: Pact.like('1'),
|
21
|
+
status: 'pending',
|
22
|
+
start_at: Pact.like(''),
|
23
|
+
end_at: Pact.like('')
|
24
|
+
}
|
25
|
+
end
|
26
|
+
let(:service_name) { :quiz_sessions_service }
|
27
|
+
end
|
28
|
+
end
|