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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/lib/quiz_api_client/services/items_service.rb +11 -0
  3. data/lib/quiz_api_client/version.rb +1 -1
  4. data/spec/config_spec.rb +66 -0
  5. data/spec/contracts/interaction_types_service_spec.rb +22 -0
  6. data/spec/contracts/item_analyses_service_spec.rb +59 -0
  7. data/spec/contracts/items_service_spec.rb +59 -0
  8. data/spec/contracts/qti_imports_service_spec.rb +34 -0
  9. data/spec/contracts/quiz_clone_job_service_spec.rb +20 -0
  10. data/spec/contracts/quiz_clone_jobs_service_spec.rb +21 -0
  11. data/spec/contracts/quiz_entries_service_spec.rb +125 -0
  12. data/spec/contracts/quiz_service_spec.rb +68 -0
  13. data/spec/contracts/quiz_session_events_service_spec.rb +30 -0
  14. data/spec/contracts/quiz_session_result_service_spec.rb +42 -0
  15. data/spec/contracts/quiz_session_service_spec.rb +56 -0
  16. data/spec/contracts/quiz_sessions_service_spec.rb +28 -0
  17. data/spec/contracts/quizzes_service_spec.rb +80 -0
  18. data/spec/contracts/session_item_results_service_spec.rb +60 -0
  19. data/spec/contracts/session_items_service_spec.rb +21 -0
  20. data/spec/contracts/shared_banks_spec.rb +366 -0
  21. data/spec/contracts/shared_examples/http_delete_example.rb +56 -0
  22. data/spec/contracts/shared_examples/http_get_example.rb +139 -0
  23. data/spec/contracts/shared_examples/http_patch_example.rb +60 -0
  24. data/spec/contracts/shared_examples/http_post_example.rb +60 -0
  25. data/spec/contracts/shared_examples/http_put_example.rb +60 -0
  26. data/spec/http_client_spec.rb +347 -0
  27. data/spec/json_formatter_spec.rb +32 -0
  28. data/spec/quiz_api_client/http_request/failure_spec.rb +100 -0
  29. data/spec/quiz_api_client/http_request/metrics_spec.rb +75 -0
  30. data/spec/quiz_api_client_spec.rb +117 -0
  31. data/spec/services/base_api_service_spec.rb +50 -0
  32. data/spec/services/interaction_types_service_spec.rb +25 -0
  33. data/spec/services/item_analyses_service_spec.rb +76 -0
  34. data/spec/services/items_service_spec.rb +56 -0
  35. data/spec/services/jwt_service_spec.rb +66 -0
  36. data/spec/services/qti_imports_service_spec.rb +114 -0
  37. data/spec/services/quiz_analyses_service_spec.rb +44 -0
  38. data/spec/services/quiz_clone_job_service_spec.rb +41 -0
  39. data/spec/services/quiz_clone_jobs_service_spec.rb +41 -0
  40. data/spec/services/quiz_entries_service_spec.rb +71 -0
  41. data/spec/services/quiz_service_spec.rb +49 -0
  42. data/spec/services/quiz_session_events_service_spec.rb +42 -0
  43. data/spec/services/quiz_session_result_service_spec.rb +26 -0
  44. data/spec/services/quiz_session_service_spec.rb +49 -0
  45. data/spec/services/quiz_sessions_service_spec.rb +42 -0
  46. data/spec/services/quizzes_service_spec.rb +71 -0
  47. data/spec/services/session_item_results_service_spec.rb +33 -0
  48. data/spec/services/session_items_service_spec.rb +26 -0
  49. data/spec/spec_helper.rb +42 -0
  50. data/spec/support/pact_config.rb +64 -0
  51. data/spec/support/pact_helper.rb +19 -0
  52. metadata +108 -39
  53. data/.dockerignore +0 -7
  54. data/.editorconfig +0 -16
  55. data/.gitignore +0 -13
  56. data/.rspec +0 -3
  57. data/.rubocop.yml +0 -72
  58. data/CHANGELOG.md +0 -35
  59. data/Dockerfile +0 -12
  60. data/Gemfile +0 -5
  61. data/Jenkinsfile +0 -86
  62. data/bin/console +0 -7
  63. data/bin/contracts-generate +0 -26
  64. data/bin/setup +0 -65
  65. data/docker-compose.dev.override.yml +0 -11
  66. data/docker-compose.yml +0 -10
  67. data/quiz_api_client.gemspec +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9191c8a80cb0e2a654139c30e5e6ad3662e7589f6bf34a5b9f00b4517de22f99
4
- data.tar.gz: 875e4bc7336dac500bbf699438ce9ad457680d6d3ce736b6aff3077efc495dfd
3
+ metadata.gz: e2f68d04f56475db3135d3b6f74e36d19a3300c213622c6829cad7066c7f77a2
4
+ data.tar.gz: ddea88d65b109c9b5c685c4c5f54c7de741d27fe236ce6164e6a6f5a01a180a1
5
5
  SHA512:
6
- metadata.gz: bf91a4c19851e9c1e4569f25be567ffae06bb91666da2d56cfc28fea0569cf55ce2706e18ebbb5ad38ce1ea9246eb348806f2fd05243250baa8573379ac9a843
7
- data.tar.gz: aa366eff458ec1045bab8abae45d5a99bc374327a2d085a70fce32963e730b31d7a1f58ad5150f8978326b0b7608bb27c74b4a4ddde5e5bf3cbd25717ed463ff
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(
@@ -1,3 +1,3 @@
1
1
  module QuizApiClient
2
- VERSION = '4.2.0'.freeze
2
+ VERSION = '4.2.1'.freeze
3
3
  end
@@ -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