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.
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