describe QuizApiClient::Services::QuizEntriesService do let(:host) { 'api.host' } let(:config) { QuizApiClient::Config.new { |c| c.host = host } } let(:subject) { described_class.new(config) } describe '#list' do let(:params) { { id: 1 } } let(:stubbed_response) { { 'id' => 1, 'entry' => { 'id' => 1 } } } let(:expected_url) { "https://#{host}/api/quizzes/#{params[:id]}/quiz_entries" } let(:status_code) { 200 } before do stub_request(:get, expected_url) .to_return( status: status_code, body: stubbed_response.to_json, headers: { 'Content-Type' => 'application/json' } ) end it 'gets from quiz_api/api/quizzes/{id}/quiz_entries and returns the response' do result = subject.list(params: params, token: 'token') expect(result.parsed_response).to eql(stubbed_response) end end describe '#show' do let(:params) { { quiz_id: 1, entry_id: 1 } } let(:stubbed_response) { { 'id' => 1, 'entry' => { 'id' => 1 } } } let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_entries/#{params[:entry_id]}" } let(:status_code) { 200 } before do stub_request(:get, expected_url) .to_return( status: status_code, body: stubbed_response.to_json, headers: { 'Content-Type' => 'application/json' } ) end it 'gets from quiz_api/api/quizzes/{quiz_id}/quiz_entries/{entry_id} and returns the response' do result = subject.show(params: params, token: 'token') expect(result.parsed_response).to eql(stubbed_response) end it 'raises errors on missing ids' do expect { subject.update(params: {}, token: 'token') }.to raise_error('Quiz Id Required') expect { subject.update(params: { quiz_id: 1 }, token: 'token') }.to raise_error('Entry Id Required') end end describe '#create' do let(:params) do { id: 1, entry_id: 1, entry_type: 'Item', points_possible: 1 } end let(:stubbed_response) { { 'id' => 1, 'entry' => { 'id' => 1 } } } let(:expected_url) { "https://#{host}/api/quizzes/#{params[:id]}/quiz_entries" } let(:status_code) { 201 } before do stub_request(:post, expected_url) .to_return( status: status_code, body: stubbed_response.to_json, headers: { 'Content-Type' => 'application/json' } ) end it 'posts to quiz_api/api/quizzes/{id}/quiz_entries and returns the response' do result = subject.create(params: params, token: 'token') expect(result.parsed_response).to eql(stubbed_response) end end describe '#update' do let(:params) { { quiz_id: 1, entry_id: 1, points_possible: 1 } } let(:stubbed_response) { { 'id' => 1, 'entry' => { 'id' => 1 } } } let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_entries/#{params[:entry_id]}" } let(:status_code) { 200 } before do stub_request(:put, expected_url) .to_return( status: status_code, body: stubbed_response.to_json, headers: { 'Content-Type' => 'application/json' } ) end it 'puts to quiz_api/api/quizzes/{quiz_id}/quiz_entries/{entry_id} and returns the response' do result = subject.update(params: params, token: 'token') expect(result.parsed_response).to eql(stubbed_response) end it 'raises errors on missing ids' do expect { subject.update(params: {}, token: 'token') }.to raise_error('Quiz Id Required') expect { subject.update(params: { quiz_id: 1 }, token: 'token') }.to raise_error('Entry Id Required') end end describe '#destroy' do let(:params) do { id: 6, quiz_id: 1 } end let(:expected_url) { "https://#{host}/api/quizzes/#{params[:quiz_id]}/quiz_entries/#{params[:id]}" } let(:status_code) { 200 } before do stub_request(:delete, expected_url) .to_return( status: status_code, body: nil, headers: { 'Content-Type' => 'application/json' } ) end it 'issues a DELETE to quiz_api/api/quizzes/{quiz_id}/quiz_entries/{id} and returns the response' do result = subject.destroy(params: params, token: 'token') expect(result.parsed_response).to eql(nil) end end end