2012-05-16 19:05:24 +00:00
|
|
|
# Copyright 2012 Google Inc.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
require 'google/api_client'
|
|
|
|
require 'google/api_client/version'
|
|
|
|
|
|
|
|
describe Google::APIClient::BatchRequest do
|
2012-10-25 21:28:16 +00:00
|
|
|
CLIENT = Google::APIClient.new unless defined?(CLIENT)
|
2012-07-31 20:56:13 +00:00
|
|
|
|
|
|
|
after do
|
|
|
|
# Reset client to not-quite-pristine state
|
|
|
|
CLIENT.key = nil
|
|
|
|
CLIENT.user_ip = nil
|
|
|
|
end
|
2012-05-16 19:05:24 +00:00
|
|
|
|
|
|
|
it 'should raise an error if making an empty batch request' do
|
|
|
|
batch = Google::APIClient::BatchRequest.new
|
|
|
|
|
|
|
|
(lambda do
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.execute(batch)
|
2012-05-16 19:05:24 +00:00
|
|
|
end).should raise_error(Google::APIClient::BatchError)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'with the discovery API' do
|
|
|
|
before do
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.authorization = nil
|
|
|
|
@discovery = CLIENT.discovered_api('discovery', 'v1')
|
2012-05-16 19:05:24 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'with two valid requests' do
|
|
|
|
before do
|
|
|
|
@call1 = {
|
|
|
|
:api_method => @discovery.apis.get_rest,
|
|
|
|
:parameters => {
|
|
|
|
'api' => 'adsense',
|
|
|
|
'version' => 'v1'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@call2 = {
|
|
|
|
:api_method => @discovery.apis.get_rest,
|
|
|
|
:parameters => {
|
|
|
|
'api' => 'discovery',
|
|
|
|
'version' => 'v1'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should execute both when using a global callback' do
|
|
|
|
block_called = 0
|
|
|
|
ids = ['first_call', 'second_call']
|
|
|
|
expected_ids = ids.clone
|
|
|
|
batch = Google::APIClient::BatchRequest.new do |result|
|
|
|
|
block_called += 1
|
|
|
|
result.status.should == 200
|
|
|
|
expected_ids.should include(result.response.call_id)
|
|
|
|
expected_ids.delete(result.response.call_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
batch.add(@call1, ids[0])
|
|
|
|
batch.add(@call2, ids[1])
|
|
|
|
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.execute(batch)
|
2012-05-16 19:05:24 +00:00
|
|
|
block_called.should == 2
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should execute both when using individual callbacks' do
|
|
|
|
batch = Google::APIClient::BatchRequest.new
|
|
|
|
|
|
|
|
call1_returned, call2_returned = false, false
|
|
|
|
batch.add(@call1) do |result|
|
|
|
|
call1_returned = true
|
|
|
|
result.status.should == 200
|
|
|
|
end
|
|
|
|
batch.add(@call2) do |result|
|
|
|
|
call2_returned = true
|
|
|
|
result.status.should == 200
|
|
|
|
end
|
|
|
|
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.execute(batch)
|
2012-05-16 19:05:24 +00:00
|
|
|
call1_returned.should == true
|
|
|
|
call2_returned.should == true
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should raise an error if using the same call ID more than once' do
|
|
|
|
batch = Google::APIClient::BatchRequest.new
|
|
|
|
|
|
|
|
(lambda do
|
|
|
|
batch.add(@call1, 'my_id')
|
|
|
|
batch.add(@call2, 'my_id')
|
|
|
|
end).should raise_error(Google::APIClient::BatchError)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'with a valid request and an invalid one' do
|
|
|
|
before do
|
|
|
|
@call1 = {
|
|
|
|
:api_method => @discovery.apis.get_rest,
|
|
|
|
:parameters => {
|
|
|
|
'api' => 'adsense',
|
|
|
|
'version' => 'v1'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@call2 = {
|
|
|
|
:api_method => @discovery.apis.get_rest,
|
|
|
|
:parameters => {
|
|
|
|
'api' => 0,
|
|
|
|
'version' => 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should execute both when using a global callback' do
|
|
|
|
block_called = 0
|
|
|
|
ids = ['first_call', 'second_call']
|
|
|
|
expected_ids = ids.clone
|
|
|
|
batch = Google::APIClient::BatchRequest.new do |result|
|
|
|
|
block_called += 1
|
|
|
|
expected_ids.should include(result.response.call_id)
|
|
|
|
expected_ids.delete(result.response.call_id)
|
|
|
|
if result.response.call_id == ids[0]
|
|
|
|
result.status.should == 200
|
|
|
|
else
|
|
|
|
result.status.should >= 400
|
|
|
|
result.status.should < 500
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
batch.add(@call1, ids[0])
|
|
|
|
batch.add(@call2, ids[1])
|
|
|
|
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.execute(batch)
|
2012-05-16 19:05:24 +00:00
|
|
|
block_called.should == 2
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should execute both when using individual callbacks' do
|
|
|
|
batch = Google::APIClient::BatchRequest.new
|
|
|
|
|
|
|
|
call1_returned, call2_returned = false, false
|
|
|
|
batch.add(@call1) do |result|
|
|
|
|
call1_returned = true
|
|
|
|
result.status.should == 200
|
|
|
|
end
|
|
|
|
batch.add(@call2) do |result|
|
|
|
|
call2_returned = true
|
|
|
|
result.status.should >= 400
|
|
|
|
result.status.should < 500
|
|
|
|
end
|
|
|
|
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.execute(batch)
|
2012-05-16 19:05:24 +00:00
|
|
|
call1_returned.should == true
|
|
|
|
call2_returned.should == true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'with the calendar API' do
|
|
|
|
before do
|
2012-07-31 20:56:13 +00:00
|
|
|
CLIENT.authorization = nil
|
|
|
|
@calendar = CLIENT.discovered_api('calendar', 'v3')
|
2012-05-16 19:05:24 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'with two valid requests' do
|
|
|
|
before do
|
|
|
|
event1 = {
|
|
|
|
'summary' => 'Appointment 1',
|
|
|
|
'location' => 'Somewhere',
|
|
|
|
'start' => {
|
|
|
|
'dateTime' => '2011-01-01T10:00:00.000-07:00'
|
|
|
|
},
|
|
|
|
'end' => {
|
|
|
|
'dateTime' => '2011-01-01T10:25:00.000-07:00'
|
|
|
|
},
|
|
|
|
'attendees' => [
|
|
|
|
{
|
|
|
|
'email' => 'myemail@mydomain.tld'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
event2 = {
|
|
|
|
'summary' => 'Appointment 2',
|
|
|
|
'location' => 'Somewhere as well',
|
|
|
|
'start' => {
|
|
|
|
'dateTime' => '2011-01-02T10:00:00.000-07:00'
|
|
|
|
},
|
|
|
|
'end' => {
|
|
|
|
'dateTime' => '2011-01-02T10:25:00.000-07:00'
|
|
|
|
},
|
|
|
|
'attendees' => [
|
|
|
|
{
|
|
|
|
'email' => 'myemail@mydomain.tld'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
@call1 = {
|
|
|
|
:api_method => @calendar.events.insert,
|
|
|
|
:parameters => {'calendarId' => 'myemail@mydomain.tld'},
|
2012-07-21 10:50:48 +00:00
|
|
|
:body => MultiJson.dump(event1),
|
2012-05-16 19:05:24 +00:00
|
|
|
:headers => {'Content-Type' => 'application/json'}
|
|
|
|
}
|
|
|
|
|
|
|
|
@call2 = {
|
|
|
|
:api_method => @calendar.events.insert,
|
|
|
|
:parameters => {'calendarId' => 'myemail@mydomain.tld'},
|
2012-07-21 10:50:48 +00:00
|
|
|
:body => MultiJson.dump(event2),
|
2012-05-16 19:05:24 +00:00
|
|
|
:headers => {'Content-Type' => 'application/json'}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should convert to a correct HTTP request' do
|
|
|
|
batch = Google::APIClient::BatchRequest.new { |result| }
|
|
|
|
batch.add(@call1, '1').add(@call2, '2')
|
2012-09-24 23:09:17 +00:00
|
|
|
request = batch.to_env(Faraday.default_connection)
|
2012-05-16 19:05:24 +00:00
|
|
|
boundary = Google::APIClient::BatchRequest::BATCH_BOUNDARY
|
2012-09-11 18:04:21 +00:00
|
|
|
request[:method].to_s.downcase.should == 'post'
|
|
|
|
request[:url].to_s.should == 'https://www.googleapis.com/batch'
|
|
|
|
request[:request_headers]['Content-Type'].should == "multipart/mixed;boundary=#{boundary}"
|
|
|
|
# TODO - Fix headers
|
|
|
|
#expected_body = /--#{Regexp.escape(boundary)}\nContent-Type: +application\/http\nContent-ID: +<[\w-]+\+1>\n\nPOST +https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/myemail@mydomain.tld\/events +HTTP\/1.1\nContent-Type: +application\/json\n\n#{Regexp.escape(@call1[:body])}\n\n--#{boundary}\nContent-Type: +application\/http\nContent-ID: +<[\w-]+\+2>\n\nPOST +https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/myemail@mydomain.tld\/events HTTP\/1.1\nContent-Type: +application\/json\n\n#{Regexp.escape(@call2[:body])}\n\n--#{Regexp.escape(boundary)}--/
|
|
|
|
#request[:body].read.gsub("\r", "").should =~ expected_body
|
2012-05-16 19:05:24 +00:00
|
|
|
end
|
|
|
|
end
|
2012-09-11 18:04:21 +00:00
|
|
|
|
2012-05-16 19:05:24 +00:00
|
|
|
end
|
|
|
|
end
|