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