quiz_api_client 4.1.0 → 4.3.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/lib/quiz_api_client/config.rb +29 -8
  4. data/lib/quiz_api_client/http_client.rb +11 -40
  5. data/lib/quiz_api_client/http_request/failure.rb +65 -0
  6. data/lib/quiz_api_client/http_request/metrics.rb +67 -0
  7. data/lib/quiz_api_client/services/items_service.rb +11 -0
  8. data/lib/quiz_api_client/services/quiz_clone_jobs_service.rb +11 -0
  9. data/lib/quiz_api_client/services/quiz_sync_job_service.rb +17 -0
  10. data/lib/quiz_api_client/services/quiz_sync_jobs_service.rb +16 -0
  11. data/lib/quiz_api_client/version.rb +1 -1
  12. data/lib/quiz_api_client.rb +12 -0
  13. data/spec/config_spec.rb +66 -0
  14. data/spec/contracts/interaction_types_service_spec.rb +22 -0
  15. data/spec/contracts/item_analyses_service_spec.rb +59 -0
  16. data/spec/contracts/items_service_spec.rb +59 -0
  17. data/spec/contracts/qti_imports_service_spec.rb +34 -0
  18. data/spec/contracts/quiz_clone_job_service_spec.rb +20 -0
  19. data/spec/contracts/quiz_clone_jobs_service_spec.rb +21 -0
  20. data/spec/contracts/quiz_entries_service_spec.rb +125 -0
  21. data/spec/contracts/quiz_service_spec.rb +68 -0
  22. data/spec/contracts/quiz_session_events_service_spec.rb +30 -0
  23. data/spec/contracts/quiz_session_result_service_spec.rb +42 -0
  24. data/spec/contracts/quiz_session_service_spec.rb +56 -0
  25. data/spec/contracts/quiz_sessions_service_spec.rb +28 -0
  26. data/spec/contracts/quiz_sync_job_service_spec.rb +21 -0
  27. data/spec/contracts/quiz_sync_jobs_service_spec.rb +21 -0
  28. data/spec/contracts/quizzes_service_spec.rb +80 -0
  29. data/spec/contracts/session_item_results_service_spec.rb +60 -0
  30. data/spec/contracts/session_items_service_spec.rb +21 -0
  31. data/spec/contracts/shared_banks_spec.rb +366 -0
  32. data/spec/contracts/shared_examples/http_delete_example.rb +56 -0
  33. data/spec/contracts/shared_examples/http_get_example.rb +139 -0
  34. data/spec/contracts/shared_examples/http_patch_example.rb +60 -0
  35. data/spec/contracts/shared_examples/http_post_example.rb +68 -0
  36. data/spec/contracts/shared_examples/http_put_example.rb +60 -0
  37. data/spec/http_client_spec.rb +347 -0
  38. data/spec/json_formatter_spec.rb +32 -0
  39. data/spec/quiz_api_client/http_request/failure_spec.rb +100 -0
  40. data/spec/quiz_api_client/http_request/metrics_spec.rb +75 -0
  41. data/spec/quiz_api_client_spec.rb +117 -0
  42. data/spec/services/base_api_service_spec.rb +50 -0
  43. data/spec/services/interaction_types_service_spec.rb +25 -0
  44. data/spec/services/item_analyses_service_spec.rb +76 -0
  45. data/spec/services/items_service_spec.rb +56 -0
  46. data/spec/services/jwt_service_spec.rb +66 -0
  47. data/spec/services/qti_imports_service_spec.rb +114 -0
  48. data/spec/services/quiz_analyses_service_spec.rb +44 -0
  49. data/spec/services/quiz_clone_job_service_spec.rb +41 -0
  50. data/spec/services/quiz_clone_jobs_service_spec.rb +77 -0
  51. data/spec/services/quiz_entries_service_spec.rb +71 -0
  52. data/spec/services/quiz_service_spec.rb +49 -0
  53. data/spec/services/quiz_session_events_service_spec.rb +42 -0
  54. data/spec/services/quiz_session_result_service_spec.rb +26 -0
  55. data/spec/services/quiz_session_service_spec.rb +49 -0
  56. data/spec/services/quiz_sessions_service_spec.rb +42 -0
  57. data/spec/services/quiz_sync_job_service_spec.rb +41 -0
  58. data/spec/services/quiz_sync_jobs_service_spec.rb +77 -0
  59. data/spec/services/quizzes_service_spec.rb +71 -0
  60. data/spec/services/session_item_results_service_spec.rb +33 -0
  61. data/spec/services/session_items_service_spec.rb +26 -0
  62. data/spec/spec_helper.rb +42 -0
  63. data/spec/support/pact_config.rb +64 -0
  64. data/spec/support/pact_helper.rb +19 -0
  65. metadata +130 -35
  66. data/.dockerignore +0 -7
  67. data/.editorconfig +0 -16
  68. data/.gitignore +0 -13
  69. data/.rspec +0 -3
  70. data/.rubocop.yml +0 -72
  71. data/CHANGELOG.md +0 -28
  72. data/Dockerfile +0 -12
  73. data/Gemfile +0 -5
  74. data/Jenkinsfile +0 -86
  75. data/bin/console +0 -7
  76. data/bin/contracts-generate +0 -26
  77. data/bin/setup +0 -65
  78. data/docker-compose.dev.override.yml +0 -11
  79. data/docker-compose.yml +0 -10
  80. data/quiz_api_client.gemspec +0 -59
@@ -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
@@ -0,0 +1,21 @@
1
+ describe QuizApiClient::Services::QuizSyncJobService, :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 sync job' }
6
+ let(:quizzes_api_path) { "/api/quiz_sync_jobs/#{resource_id}" }
7
+ let(:provider_state) { 'a quiz sync job' }
8
+ let(:scope) { 'quiz_sync_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
+ cloned_quiz_id: Pact.like('2'),
16
+ status: Pact.like('scheduled')
17
+ }
18
+ end
19
+ let(:service_name) { :quiz_sync_job_service }
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ describe QuizApiClient::Services::QuizSyncJobsService, :pact do
2
+ include PactHelper
3
+
4
+ it_behaves_like 'a http post request to quiz_api' do
5
+ let(:batch) { true }
6
+ let(:request_description) { 'a request to sync many quizzes' }
7
+ let(:quizzes_api_path) { '/api/quiz_sync_jobs/create_batch' }
8
+ let(:provider_state) { 'a completed quiz clone job' }
9
+ let(:scope) { 'quiz_sync_job.create_batch' }
10
+ let(:params) { { quiz_ids: ['1'] } }
11
+ let(:body) { { quiz_ids: ['1'] } }
12
+ let(:response_body) do
13
+ [
14
+ {
15
+ id: Pact.like('1')
16
+ }
17
+ ]
18
+ end
19
+ let(:service_name) { :quiz_sync_jobs_service }
20
+ end
21
+ end
@@ -0,0 +1,80 @@
1
+ describe QuizApiClient::Services::QuizzesService, :pact do
2
+ include PactHelper
3
+
4
+ it_behaves_like 'a http get request to quiz_api collection endpoint', testrail_id: %w[3402557] do
5
+ let(:request_description) { 'a request specifying a quiz id' }
6
+ let(:quizzes_api_path) { '/api/quizzes' }
7
+ let(:provider_state) { 'a quiz' }
8
+ let(:scope) { 'quiz.list' }
9
+ let(:params) { { 'id' => '1' } }
10
+ let(:query_params) { { 'id' => '1' } }
11
+ let(:response_body) do
12
+ [
13
+ {
14
+ # TODO: figure out why Pact specs' responses for GET requests from
15
+ # quiz_api have integers for *ID fields given quiz_api actually returns strings
16
+ id: Pact.like(1),
17
+ title: Pact.like('quiz title'),
18
+ context_id: Pact.like(1),
19
+ outcome_declaration: nil,
20
+ session_time_limit_in_seconds: Pact.like(1),
21
+ quiz_type: nil,
22
+ minimum_passing_score: nil,
23
+ lti_resource_id: nil,
24
+ created_at: Pact.like('2017-06-15T22:14:51.215Z'),
25
+ updated_at: Pact.like('2017-06-15T22:14:51.215Z'),
26
+ instructions: Pact.like('quiz instructions'),
27
+ shuffle_questions: Pact.like(false),
28
+ shuffle_answers: Pact.like(false),
29
+ status: 'uninitialized',
30
+ owner: Pact.like('teacher'),
31
+ has_time_limit: Pact.like(false),
32
+ outcome_alignment_set_guid: Pact.like('cbedd9b0-d1ab-43a9-a3b2-89c3134a722a'),
33
+ one_at_a_time_type: 'question',
34
+ allow_backtracking: Pact.like(true)
35
+ }
36
+ ]
37
+ end
38
+ let(:service_name) { :quizzes_service }
39
+ end
40
+
41
+ it_behaves_like 'a http post request to quiz_api', testrails_id: %w[3402558] do
42
+ let(:request_description) { 'a request to create a quiz' }
43
+ let(:quizzes_api_path) { '/api/quizzes' }
44
+ let(:provider_state) { 'a context' }
45
+ let(:scope) { 'quiz.create' }
46
+ let(:title) { 'Pop Quiz' }
47
+ let(:instructions) { 'Select the best answer.' }
48
+ let(:context_id) { '1' }
49
+ let(:params) do
50
+ {
51
+ 'title' => title,
52
+ 'instructions' => instructions,
53
+ 'context_id' => context_id
54
+ }
55
+ end
56
+ let(:body) { { quiz: params } }
57
+ let(:response_body) do
58
+ {
59
+ id: Pact.like('1'),
60
+ title: title,
61
+ instructions: instructions,
62
+ context_id: context_id,
63
+ owner: Pact.like('teacher1'),
64
+ has_time_limit: Pact.like(false),
65
+ allow_backtracking: Pact.like(true),
66
+ one_at_a_time_type: 'none',
67
+ session_time_limit_in_seconds: 0,
68
+ outcome_alignment_set_guid: nil,
69
+ require_student_access_code: Pact.like(false),
70
+ filter_ip_address: Pact.like(false),
71
+ shuffle_questions: Pact.like(false),
72
+ shuffle_answers: Pact.like(false),
73
+ status: 'uninitialized',
74
+ student_access_code: nil,
75
+ filters: Pact.like({})
76
+ }
77
+ end
78
+ let(:service_name) { :quizzes_service }
79
+ end
80
+ end
@@ -0,0 +1,60 @@
1
+ describe QuizApiClient::Services::SessionItemResultsService, :pact do
2
+ include PactHelper
3
+ it_behaves_like 'a http get request to quiz_api collection endpoint', testrail_id: %w[3402559] do
4
+ let(:request_description) { 'a request to retrieve a session item result' }
5
+ let(:quizzes_api_path) { '/api/quiz_sessions/1/results/1/session_item_results' }
6
+ let(:provider_state) { 'a set of session_item_results' }
7
+ let(:resource_id) { '1' }
8
+ let(:scope) { 'quiz_session.results' }
9
+ let(:params) { { quiz_session_id: '1', quiz_session_result_id: '1' } }
10
+ let(:response_body) do
11
+ [
12
+ {
13
+ position: Pact.like(1),
14
+ attempt: Pact.like(1),
15
+ item_id: Pact.like('1'),
16
+ graded_at: Pact.like('2017-06-15T22:14:51.215Z'),
17
+ grading_method: 'autograde',
18
+ points_possible: Pact.like(1.0),
19
+ score: Pact.like(1.0),
20
+ scored_data: {},
21
+ feedback: {}
22
+ }
23
+ ]
24
+ end
25
+ let(:service_name) { :session_item_results_service }
26
+ end
27
+
28
+ it_behaves_like 'a http get request to quiz_api collection endpoint' do
29
+ let(:request_description) { 'a request to retrieve a session item result for all interaction_types' }
30
+ let(:quizzes_api_path) { '/api/quiz_sessions/1/results/1/session_item_results' }
31
+ let(:provider_state) { 'a set of session_item_results of autograded interaction_types' }
32
+ let(:resource_id) { '1' }
33
+ let(:scope) { 'quiz_session.results' }
34
+ let(:params) { { quiz_session_id: '1', quiz_session_result_id: '1' } }
35
+ let(:response_body) do
36
+ Pact.each_like(
37
+ grading_method: 'autograde',
38
+ score: Pact.like(1.0)
39
+ )
40
+ end
41
+ let(:service_name) { :session_item_results_service }
42
+ end
43
+
44
+ it_behaves_like 'a http get request to quiz_api collection endpoint' do
45
+ let(:request_description) { 'a request to retrieve a session item result for manually graded interaction_types' }
46
+ let(:quizzes_api_path) { '/api/quiz_sessions/1/results/1/session_item_results' }
47
+ let(:provider_state) { 'a set of session_item_results of manually graded interaction_types' }
48
+ let(:resource_id) { '1' }
49
+ let(:scope) { 'quiz_session.results' }
50
+ let(:params) { { quiz_session_id: '1', quiz_session_result_id: '1' } }
51
+ let(:response_body) do
52
+ Pact.each_like(
53
+ graded_at: Pact.like('2017-06-15T22:14:51.215Z'),
54
+ grading_method: 'manual_grading',
55
+ score: Pact.like(1.0)
56
+ )
57
+ end
58
+ let(:service_name) { :session_item_results_service }
59
+ end
60
+ end
@@ -0,0 +1,21 @@
1
+ describe QuizApiClient::Services::SessionItemsService, :pact do
2
+ include PactHelper
3
+ it_behaves_like 'a http get request to quiz_api collection endpoint', testrail_id: %w[3402560] do
4
+ let(:request_description) { 'a request to retrieve a session item' }
5
+ let(:quizzes_api_path) { '/api/quiz_sessions/1/session_items' }
6
+ let(:provider_state) { 'a set of session_items' }
7
+ let(:scope) { 'quiz_session.results' }
8
+ let(:resource_id) { '1' }
9
+ let(:params) { { quiz_session_id: '1' } }
10
+ let(:response_body) do
11
+ [
12
+ {
13
+ position: Pact.like(1),
14
+ item: {},
15
+ points_possible: Pact.like(1.0)
16
+ }
17
+ ]
18
+ end
19
+ let(:service_name) { :session_items_service }
20
+ end
21
+ end