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
@@ -0,0 +1,77 @@
1
+ describe QuizApiClient::Services::QuizCloneJobsService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#create' do
7
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_clone_jobs" }
8
+ let(:params) { { quiz_id: 1 } }
9
+ let(:stubbed_response) { { 'id' => '1' } }
10
+
11
+ context 'on success' do
12
+ before do
13
+ stub_request(:post, expected_url)
14
+ .to_return(
15
+ status: 200,
16
+ body: stubbed_response.to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'posts to /api/quizzes/:quiz_id/quiz_clone_job' do
22
+ result = subject.create(params: params, token: 'token')
23
+ expect(result.parsed_response).to eql(stubbed_response)
24
+ end
25
+ end
26
+
27
+ context 'on failure' do
28
+ let(:status_code) { 401 }
29
+
30
+ before do
31
+ stub_request(:post, expected_url)
32
+ .to_return(status: status_code)
33
+ end
34
+
35
+ it 'returns a response with the correct code' do
36
+ response = subject.create(params: params, token: 'token')
37
+ expect(response.code).to eq(status_code)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe '#create_batch' do
43
+ let(:expected_url) { "https://#{host}/api/quiz_clone_jobs/create_batch" }
44
+ let(:body) { { quiz_ids: [1, 2] } }
45
+ let(:stubbed_response) { { 'id' => '1' } }
46
+
47
+ context 'on success' do
48
+ before do
49
+ stub_request(:post, expected_url)
50
+ .to_return(
51
+ status: 200,
52
+ body: stubbed_response.to_json,
53
+ headers: { 'Content-Type' => 'application/json' }
54
+ )
55
+ end
56
+
57
+ it 'posts to /api/quiz_clone_jobs/create_batch' do
58
+ result = subject.create_batch(body: body, token: 'token')
59
+ expect(result.parsed_response).to eql(stubbed_response)
60
+ end
61
+ end
62
+
63
+ context 'on failure' do
64
+ let(:status_code) { 401 }
65
+
66
+ before do
67
+ stub_request(:post, expected_url)
68
+ .to_return(status: status_code)
69
+ end
70
+
71
+ it 'returns a response with the correct code' do
72
+ response = subject.create_batch(body: body, token: 'token')
73
+ expect(response.code).to eq(status_code)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,71 @@
1
+ describe QuizApiClient::Services::QuizEntriesService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#list' do
7
+ let(:params) { { id: 1 } }
8
+ let(:stubbed_response) { { 'id' => 1, 'entry' => { 'id' => 1 } } }
9
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:id]}/quiz_entries" }
10
+ let(:status_code) { 200 }
11
+
12
+ before do
13
+ stub_request(:get, expected_url)
14
+ .to_return(
15
+ status: status_code,
16
+ body: stubbed_response.to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'gets from quiz_api/api/quizzes/{id}/quiz_entries and returns the response' do
22
+ result = subject.list(params: params, token: 'token')
23
+ expect(result.parsed_response).to eql(stubbed_response)
24
+ end
25
+ end
26
+
27
+ describe '#create' do
28
+ let(:params) do
29
+ { id: 1, entry_id: 1, entry_type: 'Item', points_possible: 1 }
30
+ end
31
+ let(:stubbed_response) { { 'id' => 1, 'entry' => { 'id' => 1 } } }
32
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:id]}/quiz_entries" }
33
+ let(:status_code) { 201 }
34
+
35
+ before do
36
+ stub_request(:post, expected_url)
37
+ .to_return(
38
+ status: status_code,
39
+ body: stubbed_response.to_json,
40
+ headers: { 'Content-Type' => 'application/json' }
41
+ )
42
+ end
43
+
44
+ it 'posts to quiz_api/api/quizzes/{id}/quiz_entries and returns the response' do
45
+ result = subject.create(params: params, token: 'token')
46
+ expect(result.parsed_response).to eql(stubbed_response)
47
+ end
48
+ end
49
+
50
+ describe '#destroy' do
51
+ let(:params) do
52
+ { id: 6, quiz_id: 1 }
53
+ end
54
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_entries/#{params[:id]}" }
55
+ let(:status_code) { 200 }
56
+
57
+ before do
58
+ stub_request(:delete, expected_url)
59
+ .to_return(
60
+ status: status_code,
61
+ body: nil,
62
+ headers: { 'Content-Type' => 'application/json' }
63
+ )
64
+ end
65
+
66
+ it 'issues a DELETE to quiz_api/api/quizzes/{quiz_id}/quiz_entries/{id} and returns the response' do
67
+ result = subject.destroy(params: params, token: 'token')
68
+ expect(result.parsed_response).to eql(nil)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,49 @@
1
+ describe QuizApiClient::Services::QuizService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#update' do
7
+ let(:params) { { id: 1, title: 'some new title' } }
8
+ let(:stubbed_response) { { 'id' => 1, 'title' => 'some new title' } }
9
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:id]}" }
10
+ let(:expected_body) { { quiz: params }.to_json }
11
+ let(:status_code) { 200 }
12
+
13
+ before do
14
+ stub_request(:patch, expected_url)
15
+ .with(body: expected_body)
16
+ .to_return(
17
+ status: status_code,
18
+ body: stubbed_response.to_json,
19
+ headers: { 'Content-Type' => 'application/json' }
20
+ )
21
+ end
22
+
23
+ it 'patches to quiz_api/api/quizzes and returns the response' do
24
+ result = subject.update(params: params, token: 'token')
25
+ expect(result.parsed_response).to eql(stubbed_response)
26
+ end
27
+ end
28
+
29
+ describe '#show' do
30
+ let(:params) { { id: 1 } }
31
+ let(:stubbed_response) { { 'id' => 1, 'title' => 'some title' } }
32
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:id]}" }
33
+ let(:status_code) { 200 }
34
+
35
+ before do
36
+ stub_request(:get, expected_url)
37
+ .to_return(
38
+ status: status_code,
39
+ body: stubbed_response.to_json,
40
+ headers: { 'Content-Type' => 'application/json' }
41
+ )
42
+ end
43
+
44
+ it 'gets from quiz_api/api/quizzes and returns the response' do
45
+ result = subject.show(params: params, token: 'token')
46
+ expect(result.parsed_response).to eql(stubbed_response)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,42 @@
1
+ describe QuizApiClient::Services::QuizSessionEventsService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#list' do
7
+ let(:params) { { quiz_session_id: 1 } }
8
+ let(:stubbed_response) { { 'id' => '1' } }
9
+ let(:expected_url) { "https://#{host}/api/quiz_sessions/#{params[:quiz_session_id]}/quiz_session_events" }
10
+ let(:expected_body) { '' }
11
+ let(:status_code) { 200 }
12
+
13
+ before do
14
+ stub_request(:get, expected_url)
15
+ .with(body: expected_body)
16
+ .to_return(
17
+ status: status_code,
18
+ body: stubbed_response.to_json,
19
+ headers: { 'Content-Type' => 'application/json' }
20
+ )
21
+ end
22
+
23
+ it 'posts to quiz_api/api/quizzes and returns the response' do
24
+ response = subject.list(params: params, token: 'token')
25
+ expect(response.parsed_response).to eql(stubbed_response)
26
+ end
27
+
28
+ it 'raises an error when no quiz_session_id is specified' do
29
+ params = {}
30
+ expect do
31
+ subject.list(params: params, token: 'token')
32
+ end.to raise_error 'Quiz Session Id Required'
33
+ end
34
+
35
+ context 'response' do
36
+ it 'returns the response with the correct status code' do
37
+ response = subject.list(params: params, token: 'token')
38
+ expect(response.code).to eq(status_code)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ describe QuizApiClient::Services::QuizSessionResultService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#show' do
7
+ let(:params) { { id: 1 } }
8
+ let(:stubbed_response) { { 'id' => 1, 'score' => 10 } }
9
+ let(:expected_url) { "https://#{host}/api/results/#{params[:id]}" }
10
+ let(:status_code) { 200 }
11
+
12
+ before do
13
+ stub_request(:get, expected_url)
14
+ .to_return(
15
+ status: status_code,
16
+ body: stubbed_response.to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'gets from quiz_api/api/results and returns the response' do
22
+ response = subject.show(params: params, token: 'token')
23
+ expect(response.parsed_response).to eql(stubbed_response)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,49 @@
1
+ describe QuizApiClient::Services::QuizSessionService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#update' do
7
+ let(:params) { { id: 1, time_limit_seconds: 10 } }
8
+ let(:stubbed_response) { { 'id' => '1' } }
9
+ let(:expected_url) { "https://#{host}/api/quiz_sessions/#{params[:id]}" }
10
+ let(:expected_body) { { quiz_session: { id: 1, time_limit_seconds: 10 } }.to_json }
11
+ let(:status_code) { 200 }
12
+
13
+ before do
14
+ stub_request(:patch, expected_url)
15
+ .with(body: expected_body)
16
+ .to_return(
17
+ status: status_code,
18
+ body: stubbed_response.to_json,
19
+ headers: { 'Content-Type' => 'application/json' }
20
+ )
21
+ end
22
+
23
+ it 'patches to quiz_api/api/quiz_sessions and returns the response' do
24
+ response = subject.update(params: params, token: 'token')
25
+ expect(response.parsed_response).to eql(stubbed_response)
26
+ end
27
+ end
28
+
29
+ describe '#show' do
30
+ let(:params) { { id: 1 } }
31
+ let(:stubbed_response) { { 'id' => 1, 'time_limit_seconds' => 10 } }
32
+ let(:expected_url) { "https://#{host}/api/quiz_sessions/#{params[:id]}" }
33
+ let(:status_code) { 200 }
34
+
35
+ before do
36
+ stub_request(:get, expected_url)
37
+ .to_return(
38
+ status: status_code,
39
+ body: stubbed_response.to_json,
40
+ headers: { 'Content-Type' => 'application/json' }
41
+ )
42
+ end
43
+
44
+ it 'gets from quiz_api/api/quiz_sessions and returns the response' do
45
+ response = subject.show(params: params, token: 'token')
46
+ expect(response.parsed_response).to eql(stubbed_response)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,42 @@
1
+ describe QuizApiClient::Services::QuizSessionsService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#create' do
7
+ let(:params) { { quiz_id: 1 } }
8
+ let(:stubbed_response) { { 'id' => '1' } }
9
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_sessions" }
10
+ let(:expected_body) { { quiz_session: { quiz_id: 1 } }.to_json }
11
+ let(:status_code) { 200 }
12
+
13
+ before do
14
+ stub_request(:post, expected_url)
15
+ .with(body: expected_body)
16
+ .to_return(
17
+ status: status_code,
18
+ body: stubbed_response.to_json,
19
+ headers: { 'Content-Type' => 'application/json' }
20
+ )
21
+ end
22
+
23
+ it 'posts to quiz_api/api/quizzes and returns the response' do
24
+ result = subject.create(params: params, token: 'token')
25
+ expect(result.parsed_response).to eql(stubbed_response)
26
+ end
27
+
28
+ it 'raises an error when no quiz_id is specified' do
29
+ params = {}
30
+ expect do
31
+ subject.create(params: params, token: 'token')
32
+ end.to raise_error 'Quiz Id Required'
33
+ end
34
+
35
+ context 'response' do
36
+ it 'returns the response with the correct status code' do
37
+ response = subject.create(params: params, token: 'token')
38
+ expect(response.code).to eq(status_code)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,41 @@
1
+ describe QuizApiClient::Services::QuizSyncJobService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#show' do
7
+ let(:expected_url) { "https://#{host}/api/quiz_sync_jobs/#{params[:id]}" }
8
+ let(:params) { { id: 1 } }
9
+ let(:stubbed_response) { { 'id' => 1, 'original_quiz_id' => 666, 'status' => 'completed' } }
10
+
11
+ context 'on success' do
12
+ before do
13
+ stub_request(:get, expected_url)
14
+ .to_return(
15
+ status: 200,
16
+ body: stubbed_response.to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'gets from /api/quiz_sync_jobs/:id' do
22
+ result = subject.show(params: params, token: 'token')
23
+ expect(result.parsed_response).to eql(stubbed_response)
24
+ end
25
+ end
26
+
27
+ context 'on failure' do
28
+ let(:status_code) { 401 }
29
+
30
+ before do
31
+ stub_request(:get, expected_url)
32
+ .to_return(status: status_code)
33
+ end
34
+
35
+ it 'returns a response with the correct code' do
36
+ response = subject.show(params: params, token: 'token')
37
+ expect(response.code).to eq(status_code)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,77 @@
1
+ describe QuizApiClient::Services::QuizCloneJobsService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#create' do
7
+ let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_clone_jobs" }
8
+ let(:params) { { quiz_id: 1 } }
9
+ let(:stubbed_response) { { 'id' => '1' } }
10
+
11
+ context 'on success' do
12
+ before do
13
+ stub_request(:post, expected_url)
14
+ .to_return(
15
+ status: 200,
16
+ body: stubbed_response.to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'posts to /api/quizzes/:quiz_id/quiz_clone_job' do
22
+ result = subject.create(params: params, token: 'token')
23
+ expect(result.parsed_response).to eql(stubbed_response)
24
+ end
25
+ end
26
+
27
+ context 'on failure' do
28
+ let(:status_code) { 401 }
29
+
30
+ before do
31
+ stub_request(:post, expected_url)
32
+ .to_return(status: status_code)
33
+ end
34
+
35
+ it 'returns a response with the correct code' do
36
+ response = subject.create(params: params, token: 'token')
37
+ expect(response.code).to eq(status_code)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe '#create_batch' do
43
+ let(:expected_url) { "https://#{host}/api/quiz_clone_jobs/create_batch" }
44
+ let(:body) { { quiz_ids: [1, 2] } }
45
+ let(:stubbed_response) { { 'id' => '1' } }
46
+
47
+ context 'on success' do
48
+ before do
49
+ stub_request(:post, expected_url)
50
+ .to_return(
51
+ status: 200,
52
+ body: stubbed_response.to_json,
53
+ headers: { 'Content-Type' => 'application/json' }
54
+ )
55
+ end
56
+
57
+ it 'posts to /api/quiz_clone_jobs/create_batch' do
58
+ result = subject.create_batch(body: body, token: 'token')
59
+ expect(result.parsed_response).to eql(stubbed_response)
60
+ end
61
+ end
62
+
63
+ context 'on failure' do
64
+ let(:status_code) { 401 }
65
+
66
+ before do
67
+ stub_request(:post, expected_url)
68
+ .to_return(status: status_code)
69
+ end
70
+
71
+ it 'returns a response with the correct code' do
72
+ response = subject.create_batch(body: body, token: 'token')
73
+ expect(response.code).to eq(status_code)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,71 @@
1
+ describe QuizApiClient::Services::QuizzesService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#list' do
7
+ let(:params) { { context_id: 1 } }
8
+ let(:stubbed_response) { { 'id' => '1' } }
9
+
10
+ context 'on success' do
11
+ before do
12
+ expected_url = "https://#{host}/api/quizzes?context_id=1"
13
+ stub_request(:get, expected_url)
14
+ .to_return(
15
+ status: 200,
16
+ body: [stubbed_response].to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'gets quiz_api/api/quizzes and returns the response' do
22
+ result = subject.list(params: params, token: 'token')
23
+ expect(result.parsed_response[0]).to eql(stubbed_response)
24
+ end
25
+ end
26
+
27
+ context 'on failure' do
28
+ let(:status_code) { 401 }
29
+ before do
30
+ expected_url = "https://#{host}/api/quizzes"
31
+ stub_request(:get, expected_url)
32
+ .to_return(status: status_code)
33
+ end
34
+
35
+ it 'returns the response with the correct code' do
36
+ response = subject.list(params: nil, token: 'token')
37
+ expect(response.code).to eq(status_code)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe '#create' do
43
+ let(:params) { { title: 'Untitled Quiz', owner: 'owner' } }
44
+ let(:stubbed_response) { { 'id' => '1' } }
45
+ let(:expected_url) { "https://#{host}/api/quizzes" }
46
+ let(:expected_body) { { quiz: { title: 'Untitled Quiz', owner: 'owner' } }.to_json }
47
+ let(:status_code) { 200 }
48
+
49
+ before do
50
+ stub_request(:post, expected_url)
51
+ .with(body: expected_body)
52
+ .to_return(
53
+ status: 200,
54
+ body: stubbed_response.to_json,
55
+ headers: { 'Content-Type' => 'application/json' }
56
+ )
57
+ end
58
+
59
+ it 'posts to quiz_api/api/quizzes and returns the response' do
60
+ response = subject.create(params: params, token: 'token')
61
+ expect(response.parsed_response).to eql(stubbed_response)
62
+ end
63
+
64
+ context 'response' do
65
+ it 'returns the response with the correct code' do
66
+ response = subject.create(params: params, token: 'token')
67
+ expect(response.code).to eq(status_code)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,33 @@
1
+ describe QuizApiClient::Services::SessionItemResultsService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#index' do
7
+ let(:params) { { quiz_session_id: 1, quiz_session_result_id: 1 } }
8
+ let(:stubbed_response) { { 'id' => '1_1', 'item' => { 'id' => '1' } } }
9
+ let(:expected_url) do
10
+ format(
11
+ 'https://%<host>s/api/quiz_sessions/%<session>d/results/%<result>d/session_item_results',
12
+ host: host,
13
+ session: params[:quiz_session_id],
14
+ result: params[:quiz_session_result_id]
15
+ )
16
+ end
17
+ let(:status_code) { 200 }
18
+
19
+ before do
20
+ stub_request(:get, expected_url)
21
+ .to_return(
22
+ status: status_code,
23
+ body: stubbed_response.to_json,
24
+ headers: { 'Content-Type' => 'application/json' }
25
+ )
26
+ end
27
+
28
+ it 'gets session_item_results and returns the response' do
29
+ response = subject.list(params: params, token: 'token')
30
+ expect(response.parsed_response).to eql(stubbed_response)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ describe QuizApiClient::Services::SessionItemsService do
2
+ let(:host) { 'api.host' }
3
+ let(:config) { QuizApiClient::Config.new { |c| c.host = host } }
4
+ let(:subject) { described_class.new(config) }
5
+
6
+ describe '#index' do
7
+ let(:params) { { quiz_session_id: 1 } }
8
+ let(:stubbed_response) { { 'id' => '1_1', 'item' => { 'id' => '1' } } }
9
+ let(:expected_url) { "https://#{host}/api/quiz_sessions/#{params[:quiz_session_id]}/session_items" }
10
+ let(:status_code) { 200 }
11
+
12
+ before do
13
+ stub_request(:get, expected_url)
14
+ .to_return(
15
+ status: status_code,
16
+ body: stubbed_response.to_json,
17
+ headers: { 'Content-Type' => 'application/json' }
18
+ )
19
+ end
20
+
21
+ it 'gets from quiz_api/api/quiz_sessions/:id/session_items and returns the response' do
22
+ result = subject.list(params: params, token: 'token')
23
+ expect(result.parsed_response).to eql(stubbed_response)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ require 'pact/consumer/rspec'
2
+ require 'pry'
3
+ require 'simplecov'
4
+ require 'webmock/rspec'
5
+
6
+ SimpleCov.start do
7
+ add_filter '/spec/'
8
+ end
9
+
10
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
11
+ require 'quiz_api_client'
12
+
13
+ Dir[File.dirname(__FILE__) + '/support/*.rb'].each { |f| require f }
14
+ Dir[File.dirname(__FILE__) + '/contracts/shared_examples/*.rb'].each { |f| require f }
15
+
16
+ WebMock.disable_net_connect!(
17
+ allow_localhost: true,
18
+ allow: [PactConfig.broker_host]
19
+ )
20
+
21
+ # see https://github.com/realestate-com-au/pact/blob/master/documentation/configuration.md
22
+ Pact.configure do |config|
23
+ config.diff_formatter = :list
24
+ config.logger.level = Logger::DEBUG
25
+ config.pact_dir = 'pacts'
26
+ config.pactfile_write_mode = :overwrite
27
+ config.pactfile_write_order = :chronological
28
+ end
29
+
30
+ Pact.service_consumer PactConfig::QUIZ_API_CLIENT_RUBY do
31
+ has_pact_with PactConfig::Providers::QUIZ_API do
32
+ mock_service :quiz_api do
33
+ port 1234
34
+ pact_specification_version '2.0.0'
35
+ end
36
+ end
37
+ end
38
+
39
+ RSpec.configure do |config|
40
+ config.filter_run_excluding :pact
41
+ config.before { allow_any_instance_of(::Logger).to receive(:info) }
42
+ end