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