google-api-client 0.7.1 → 0.8.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 (56) hide show
  1. checksums.yaml +13 -5
  2. data/CHANGELOG.md +14 -0
  3. data/Gemfile +0 -36
  4. data/README.md +12 -1
  5. data/Rakefile +1 -8
  6. data/google-api-client.gemspec +40 -0
  7. data/lib/google/api_client.rb +98 -30
  8. data/lib/google/api_client/auth/compute_service_account.rb +1 -1
  9. data/lib/google/api_client/auth/file_storage.rb +19 -44
  10. data/lib/google/api_client/auth/installed_app.rb +11 -7
  11. data/lib/google/api_client/auth/storage.rb +101 -0
  12. data/lib/google/api_client/auth/storages/file_store.rb +58 -0
  13. data/lib/google/api_client/auth/storages/redis_store.rb +54 -0
  14. data/lib/google/api_client/batch.rb +13 -11
  15. data/lib/google/api_client/charset.rb +33 -0
  16. data/lib/google/api_client/client_secrets.rb +9 -6
  17. data/lib/google/api_client/discovery/api.rb +3 -3
  18. data/lib/google/api_client/discovery/resource.rb +3 -3
  19. data/lib/google/api_client/discovery/schema.rb +3 -5
  20. data/lib/google/api_client/errors.rb +5 -0
  21. data/lib/google/api_client/railtie.rb +2 -1
  22. data/lib/google/api_client/request.rb +1 -2
  23. data/lib/google/api_client/result.rb +4 -2
  24. data/lib/google/api_client/service.rb +2 -2
  25. data/lib/google/api_client/service/batch.rb +7 -0
  26. data/lib/google/api_client/service/stub_generator.rb +4 -2
  27. data/lib/google/api_client/service_account.rb +3 -0
  28. data/lib/google/api_client/version.rb +8 -13
  29. data/spec/google/api_client/auth/storage_spec.rb +122 -0
  30. data/spec/google/api_client/auth/storages/file_store_spec.rb +40 -0
  31. data/spec/google/api_client/auth/storages/redis_store_spec.rb +70 -0
  32. data/spec/google/api_client/batch_spec.rb +29 -30
  33. data/spec/google/api_client/client_secrets_spec.rb +53 -0
  34. data/spec/google/api_client/discovery_spec.rb +101 -91
  35. data/spec/google/api_client/gzip_spec.rb +21 -9
  36. data/spec/google/api_client/media_spec.rb +31 -32
  37. data/spec/google/api_client/request_spec.rb +3 -4
  38. data/spec/google/api_client/result_spec.rb +51 -47
  39. data/spec/google/api_client/service_account_spec.rb +40 -35
  40. data/spec/google/api_client/service_spec.rb +144 -112
  41. data/spec/google/api_client/simple_file_store_spec.rb +30 -34
  42. data/spec/google/api_client_spec.rb +139 -40
  43. data/spec/spec_helper.rb +9 -1
  44. metadata +111 -88
  45. data/CONTRIBUTING.md +0 -32
  46. data/lib/cacerts.pem +0 -2183
  47. data/lib/google/inflection.rb +0 -28
  48. data/spec/fixtures/files/privatekey.p12 +0 -0
  49. data/spec/fixtures/files/sample.txt +0 -33
  50. data/spec/fixtures/files/secret.pem +0 -19
  51. data/tasks/gem.rake +0 -97
  52. data/tasks/git.rake +0 -45
  53. data/tasks/metrics.rake +0 -22
  54. data/tasks/spec.rake +0 -57
  55. data/tasks/wiki.rake +0 -82
  56. data/tasks/yard.rake +0 -29
@@ -43,6 +43,11 @@ module Google
43
43
  class ClientError < TransmissionError
44
44
  end
45
45
 
46
+ ##
47
+ # A 401 HTTP error occurred.
48
+ class AuthorizationError < ClientError
49
+ end
50
+
46
51
  ##
47
52
  # A 5xx class HTTP error occurred.
48
53
  class ServerError < TransmissionError
@@ -1,3 +1,4 @@
1
+ require 'rails/railtie'
1
2
  require 'google/api_client/logging'
2
3
 
3
4
  module Google
@@ -9,7 +10,7 @@ module Google
9
10
  #
10
11
  class Railtie < Rails::Railtie
11
12
  initializer 'google-api-client' do |app|
12
- Google::APIClient.logger = Rails.logger
13
+ Google::APIClient.logger = app.logger
13
14
  end
14
15
  end
15
16
  end
@@ -14,7 +14,6 @@
14
14
 
15
15
  require 'faraday'
16
16
  require 'faraday/request/multipart'
17
- require 'multi_json'
18
17
  require 'compat/multi_json'
19
18
  require 'addressable/uri'
20
19
  require 'stringio'
@@ -168,7 +167,7 @@ module Google
168
167
 
169
168
  # Resumamble slightly different than other upload protocols in that it requires at least
170
169
  # 2 requests.
171
- if result.status == 200 && self.upload_type == 'resumable'
170
+ if result.status == 200 && self.upload_type == 'resumable' && self.media
172
171
  upload = result.resumable_upload
173
172
  unless upload.complete?
174
173
  logger.debug { "#{self.class} Sending upload body" }
@@ -182,8 +182,9 @@ module Google
182
182
  # Build a request for fetching the next page of data
183
183
  #
184
184
  # @return [Google::APIClient::Request]
185
- # API request for retrieving next page
185
+ # API request for retrieving next page, nil if no page token available
186
186
  def next_page
187
+ return nil unless self.next_page_token
187
188
  merged_parameters = Hash[self.reference.parameters].merge({
188
189
  self.page_token_param => self.next_page_token
189
190
  })
@@ -215,8 +216,9 @@ module Google
215
216
  # Build a request for fetching the previous page of data
216
217
  #
217
218
  # @return [Google::APIClient::Request]
218
- # API request for retrieving previous page
219
+ # API request for retrieving previous page, nil if no page token available
219
220
  def prev_page
221
+ return nil unless self.prev_page_token
220
222
  merged_parameters = Hash[self.reference.parameters].merge({
221
223
  self.page_token_param => self.prev_page_token
222
224
  })
@@ -120,7 +120,7 @@ module Google
120
120
  if options.include? :cache_store
121
121
  @cache_store = options[:cache_store]
122
122
  else
123
- cache_exists = File.exist?(DEFAULT_CACHE_FILE)
123
+ cache_exists = File.exists?(DEFAULT_CACHE_FILE)
124
124
  if (cache_exists && File.writable?(DEFAULT_CACHE_FILE)) ||
125
125
  (!cache_exists && File.writable?(Dir.pwd))
126
126
  @cache_store = Google::APIClient::Service::SimpleFileStore.new(
@@ -225,7 +225,7 @@ module Google
225
225
  result = @client.execute(params)
226
226
  return Google::APIClient::Service::Result.new(request, result)
227
227
  elsif request.instance_of? Google::APIClient::Service::BatchRequest
228
- @client.execute(request.base_batch)
228
+ @client.execute(request.base_batch, {:connection => @connection})
229
229
  end
230
230
  end
231
231
  end
@@ -80,6 +80,13 @@ module Google
80
80
  :api_method => call.method,
81
81
  :parameters => call.parameters
82
82
  }
83
+ if call.respond_to? :body
84
+ if call.body.respond_to? :to_hash
85
+ base_call[:body_object] = call.body
86
+ else
87
+ base_call[:body] = call.body
88
+ end
89
+ end
83
90
  @base_batch.add(base_call) do |base_result|
84
91
  result = Google::APIClient::Service::BatchedCallResult.new(
85
92
  call, base_result)
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'active_support/inflector'
16
+
15
17
  module Google
16
18
  class APIClient
17
19
  class Service
@@ -25,7 +27,7 @@ module Google
25
27
 
26
28
  # Handle resources.
27
29
  root.discovered_resources.each do |resource|
28
- method_name = Google::INFLECTOR.underscore(resource.name).to_sym
30
+ method_name = ActiveSupport::Inflector.underscore(resource.name).to_sym
29
31
  if !self.respond_to?(method_name)
30
32
  metaclass.send(:define_method, method_name) do
31
33
  Google::APIClient::Service::Resource.new(service, resource)
@@ -35,7 +37,7 @@ module Google
35
37
 
36
38
  # Handle methods.
37
39
  root.discovered_methods.each do |method|
38
- method_name = Google::INFLECTOR.underscore(method.name).to_sym
40
+ method_name = ActiveSupport::Inflector.underscore(method.name).to_sym
39
41
  if !self.respond_to?(method_name)
40
42
  metaclass.send(:define_method, method_name) do |*args|
41
43
  if args.length > 1
@@ -16,3 +16,6 @@ require 'google/api_client/auth/pkcs12'
16
16
  require 'google/api_client/auth/jwt_asserter'
17
17
  require 'google/api_client/auth/key_utils'
18
18
  require 'google/api_client/auth/compute_service_account'
19
+ require 'google/api_client/auth/storage'
20
+ require 'google/api_client/auth/storages/redis_store'
21
+ require 'google/api_client/auth/storages/file_store'
@@ -13,19 +13,14 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- # Used to prevent the class/module from being loaded more than once
17
- if !defined?(::Google::APIClient::VERSION)
18
-
19
-
20
- module Google
21
- class APIClient
22
- module VERSION
23
- MAJOR = 0
24
- MINOR = 7
25
- TINY = 1
26
- PATCH = nil
27
- STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
28
- end
16
+ module Google
17
+ class APIClient
18
+ module VERSION
19
+ MAJOR = 0
20
+ MINOR = 8
21
+ TINY = 0
22
+ PATCH = nil
23
+ STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
29
24
  end
30
25
  end
31
26
  end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ require 'google/api_client'
4
+ require 'google/api_client/version'
5
+
6
+ describe Google::APIClient::Storage do
7
+ let(:client) { Google::APIClient.new(:application_name => 'API Client Tests') }
8
+ let(:root_path) { File.expand_path(File.join(__FILE__, '..', '..', '..')) }
9
+ let(:json_file) { File.expand_path(File.join(root_path, 'fixtures', 'files', 'auth_stored_credentials.json')) }
10
+
11
+ let(:store) { double }
12
+ let(:client_stub) { double }
13
+ subject { Google::APIClient::Storage.new(store) }
14
+
15
+ describe 'authorize' do
16
+ it 'should authorize' do
17
+ expect(subject).to respond_to(:authorization)
18
+ expect(subject.store).to be == store
19
+ end
20
+ end
21
+
22
+ describe 'authorize' do
23
+ describe 'with credentials' do
24
+
25
+ it 'should initialize a new OAuth Client' do
26
+ expect(subject).to receive(:load_credentials).and_return({:first => 'a dummy'})
27
+ expect(client_stub).to receive(:issued_at=)
28
+ expect(client_stub).to receive(:expired?).and_return(false)
29
+ expect(Signet::OAuth2::Client).to receive(:new).and_return(client_stub)
30
+ expect(subject).not_to receive(:refresh_authorization)
31
+ subject.authorize
32
+ end
33
+
34
+ it 'should refresh authorization' do
35
+ expect(subject).to receive(:load_credentials).and_return({:first => 'a dummy'})
36
+ expect(client_stub).to receive(:issued_at=)
37
+ expect(client_stub).to receive(:expired?).and_return(true)
38
+ expect(Signet::OAuth2::Client).to receive(:new).and_return(client_stub)
39
+ expect(subject).to receive(:refresh_authorization)
40
+ auth = subject.authorize
41
+ expect(auth).to be == subject.authorization
42
+ expect(auth).not_to be_nil
43
+ end
44
+ end
45
+
46
+ describe 'without credentials' do
47
+
48
+ it 'should return nil' do
49
+ expect(subject.authorization).to be_nil
50
+ expect(subject).to receive(:load_credentials).and_return({})
51
+ expect(subject.authorize).to be_nil
52
+ expect(subject.authorization).to be_nil
53
+ end
54
+ end
55
+ end
56
+
57
+ describe 'write_credentials' do
58
+ it 'should call store to write credentials' do
59
+ authorization_stub = double
60
+ expect(authorization_stub).to receive(:refresh_token).and_return(true)
61
+ expect(subject).to receive(:credentials_hash)
62
+ expect(subject.store).to receive(:write_credentials)
63
+ subject.write_credentials(authorization_stub)
64
+ expect(subject.authorization).to be == authorization_stub
65
+ end
66
+
67
+ it 'should not call store to write credentials' do
68
+ expect(subject).not_to receive(:credentials_hash)
69
+ expect(subject.store).not_to receive(:write_credentials)
70
+ expect {
71
+ subject.write_credentials()
72
+ }.not_to raise_error
73
+ end
74
+ it 'should not call store to write credentials' do
75
+ expect(subject).not_to receive(:credentials_hash)
76
+ expect(subject.store).not_to receive(:write_credentials)
77
+ expect {
78
+ subject.write_credentials('something')
79
+ }.not_to raise_error
80
+ end
81
+
82
+ end
83
+
84
+ describe 'refresh_authorization' do
85
+ it 'should call refresh and write credentials' do
86
+ expect(subject).to receive(:write_credentials)
87
+ authorization_stub = double
88
+ expect(subject).to receive(:authorization).and_return(authorization_stub)
89
+ expect(authorization_stub).to receive(:refresh!).and_return(true)
90
+ subject.refresh_authorization
91
+ end
92
+ end
93
+
94
+ describe 'load_credentials' do
95
+ it 'should call store to load credentials' do
96
+ expect(subject.store).to receive(:load_credentials)
97
+ subject.send(:load_credentials)
98
+ end
99
+ end
100
+
101
+ describe 'credentials_hash' do
102
+ it 'should return an hash' do
103
+ authorization_stub = double
104
+ expect(authorization_stub).to receive(:access_token)
105
+ expect(authorization_stub).to receive(:client_id)
106
+ expect(authorization_stub).to receive(:client_secret)
107
+ expect(authorization_stub).to receive(:expires_in)
108
+ expect(authorization_stub).to receive(:refresh_token)
109
+ expect(authorization_stub).to receive(:issued_at).and_return('100')
110
+ allow(subject).to receive(:authorization).and_return(authorization_stub)
111
+ credentials = subject.send(:credentials_hash)
112
+ expect(credentials).to include(:access_token)
113
+ expect(credentials).to include(:authorization_uri)
114
+ expect(credentials).to include(:client_id)
115
+ expect(credentials).to include(:client_secret)
116
+ expect(credentials).to include(:expires_in)
117
+ expect(credentials).to include(:refresh_token)
118
+ expect(credentials).to include(:token_credential_uri)
119
+ expect(credentials).to include(:issued_at)
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ require 'google/api_client'
4
+ require 'google/api_client/version'
5
+
6
+ describe Google::APIClient::FileStore do
7
+ let(:root_path) { File.expand_path(File.join(__FILE__, '..','..','..', '..','..')) }
8
+ let(:json_file) { File.expand_path(File.join(root_path, 'fixtures', 'files', 'auth_stored_credentials.json')) }
9
+
10
+ let(:credentials_hash) {{
11
+ "access_token"=>"my_access_token",
12
+ "authorization_uri"=>"https://accounts.google.com/o/oauth2/auth",
13
+ "client_id"=>"123456_test_client_id@.apps.googleusercontent.com",
14
+ "client_secret"=>"123456_client_secret",
15
+ "expires_in"=>3600,
16
+ "refresh_token"=>"my_refresh_token",
17
+ "token_credential_uri"=>"https://accounts.google.com/o/oauth2/token",
18
+ "issued_at"=>1384440275
19
+ }}
20
+
21
+ subject{Google::APIClient::FileStore.new('a file path')}
22
+
23
+ it 'should have a path' do
24
+ expect(subject.path).to be == 'a file path'
25
+ subject.path = 'an other file path'
26
+ expect(subject.path).to be == 'an other file path'
27
+ end
28
+
29
+ it 'should load credentials' do
30
+ subject.path = json_file
31
+ credentials = subject.load_credentials
32
+ expect(credentials).to include('access_token', 'authorization_uri', 'refresh_token')
33
+ end
34
+
35
+ it 'should write credentials' do
36
+ io_stub = StringIO.new
37
+ expect(subject).to receive(:open).and_return(io_stub)
38
+ subject.write_credentials(credentials_hash)
39
+ end
40
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ require 'google/api_client'
4
+ require 'google/api_client/version'
5
+
6
+
7
+ describe Google::APIClient::RedisStore do
8
+ let(:root_path) { File.expand_path(File.join(__FILE__, '..', '..', '..', '..', '..')) }
9
+ let(:json_file) { File.expand_path(File.join(root_path, 'fixtures', 'files', 'auth_stored_credentials.json')) }
10
+ let(:redis) {double}
11
+
12
+ let(:credentials_hash) { {
13
+ "access_token" => "my_access_token",
14
+ "authorization_uri" => "https://accounts.google.com/o/oauth2/auth",
15
+ "client_id" => "123456_test_client_id@.apps.googleusercontent.com",
16
+ "client_secret" => "123456_client_secret",
17
+ "expires_in" => 3600,
18
+ "refresh_token" => "my_refresh_token",
19
+ "token_credential_uri" => "https://accounts.google.com/o/oauth2/token",
20
+ "issued_at" => 1384440275
21
+ } }
22
+
23
+ subject { Google::APIClient::RedisStore.new('a redis instance') }
24
+
25
+ it 'should have a redis instance' do
26
+ expect(subject.redis).to be == 'a redis instance'
27
+ subject.redis = 'an other redis instance'
28
+ expect(subject.redis).to be == 'an other redis instance'
29
+ end
30
+
31
+ describe 'load_credentials' do
32
+
33
+ it 'should load credentials' do
34
+ subject.redis= redis
35
+ expect(redis).to receive(:get).and_return(credentials_hash.to_json)
36
+ expect(subject.load_credentials).to be == credentials_hash
37
+ end
38
+
39
+ it 'should return nil' do
40
+ subject.redis= redis
41
+ expect(redis).to receive(:get).and_return(nil)
42
+ expect(subject.load_credentials).to be_nil
43
+ end
44
+ end
45
+
46
+ describe 'redis_credentials_key' do
47
+ context 'without given key' do
48
+ it 'should return default key' do
49
+ expect(subject.redis_credentials_key).to be == "google_api_credentials"
50
+ end
51
+ end
52
+ context 'with given key' do
53
+ let(:redis_store) { Google::APIClient::RedisStore.new('a redis instance', 'another_google_api_credentials') }
54
+ it 'should use given key' do
55
+ expect(redis_store.redis_credentials_key).to be == "another_google_api_credentials"
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ describe 'write credentials' do
62
+
63
+ it 'should write credentials' do
64
+ subject.redis= redis
65
+ expect(redis).to receive(:set).and_return('ok')
66
+ expect(subject.write_credentials(credentials_hash)).to be_truthy
67
+ end
68
+ end
69
+
70
+ end
@@ -14,9 +14,8 @@
14
14
 
15
15
  require 'spec_helper'
16
16
  require 'google/api_client'
17
- require 'google/api_client/version'
18
17
 
19
- describe Google::APIClient::BatchRequest do
18
+ RSpec.describe Google::APIClient::BatchRequest do
20
19
  CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT)
21
20
 
22
21
  after do
@@ -28,9 +27,9 @@ describe Google::APIClient::BatchRequest do
28
27
  it 'should raise an error if making an empty batch request' do
29
28
  batch = Google::APIClient::BatchRequest.new
30
29
 
31
- (lambda do
30
+ expect(lambda do
32
31
  CLIENT.execute(batch)
33
- end).should raise_error(Google::APIClient::BatchError)
32
+ end).to raise_error(Google::APIClient::BatchError)
34
33
  end
35
34
 
36
35
  it 'should allow query parameters in batch requests' do
@@ -39,7 +38,7 @@ describe Google::APIClient::BatchRequest do
39
38
  'a' => '12345'
40
39
  })
41
40
  method, uri, headers, body = batch.to_http_request
42
- body.read.should include("/?a=12345")
41
+ expect(body.read).to include("/?a=12345")
43
42
  end
44
43
 
45
44
  describe 'with the discovery API' do
@@ -73,8 +72,8 @@ describe Google::APIClient::BatchRequest do
73
72
  expected_ids = ids.clone
74
73
  batch = Google::APIClient::BatchRequest.new do |result|
75
74
  block_called += 1
76
- result.status.should == 200
77
- expected_ids.should include(result.response.call_id)
75
+ expect(result.status).to eq(200)
76
+ expect(expected_ids).to include(result.response.call_id)
78
77
  expected_ids.delete(result.response.call_id)
79
78
  end
80
79
 
@@ -82,7 +81,7 @@ describe Google::APIClient::BatchRequest do
82
81
  batch.add(@call2, ids[1])
83
82
 
84
83
  CLIENT.execute(batch)
85
- block_called.should == 2
84
+ expect(block_called).to eq(2)
86
85
  end
87
86
 
88
87
  it 'should execute both when using individual callbacks' do
@@ -91,25 +90,25 @@ describe Google::APIClient::BatchRequest do
91
90
  call1_returned, call2_returned = false, false
92
91
  batch.add(@call1) do |result|
93
92
  call1_returned = true
94
- result.status.should == 200
93
+ expect(result.status).to eq(200)
95
94
  end
96
95
  batch.add(@call2) do |result|
97
96
  call2_returned = true
98
- result.status.should == 200
97
+ expect(result.status).to eq(200)
99
98
  end
100
99
 
101
100
  CLIENT.execute(batch)
102
- call1_returned.should == true
103
- call2_returned.should == true
101
+ expect(call1_returned).to be_truthy
102
+ expect(call2_returned).to be_truthy
104
103
  end
105
104
 
106
105
  it 'should raise an error if using the same call ID more than once' do
107
106
  batch = Google::APIClient::BatchRequest.new
108
107
 
109
- (lambda do
108
+ expect(lambda do
110
109
  batch.add(@call1, 'my_id')
111
110
  batch.add(@call2, 'my_id')
112
- end).should raise_error(Google::APIClient::BatchError)
111
+ end).to raise_error(Google::APIClient::BatchError)
113
112
  end
114
113
  end
115
114
 
@@ -138,13 +137,13 @@ describe Google::APIClient::BatchRequest do
138
137
  expected_ids = ids.clone
139
138
  batch = Google::APIClient::BatchRequest.new do |result|
140
139
  block_called += 1
141
- expected_ids.should include(result.response.call_id)
140
+ expect(expected_ids).to include(result.response.call_id)
142
141
  expected_ids.delete(result.response.call_id)
143
142
  if result.response.call_id == ids[0]
144
- result.status.should == 200
143
+ expect(result.status).to eq(200)
145
144
  else
146
- result.status.should >= 400
147
- result.status.should < 500
145
+ expect(result.status).to be >= 400
146
+ expect(result.status).to be < 500
148
147
  end
149
148
  end
150
149
 
@@ -152,7 +151,7 @@ describe Google::APIClient::BatchRequest do
152
151
  batch.add(@call2, ids[1])
153
152
 
154
153
  CLIENT.execute(batch)
155
- block_called.should == 2
154
+ expect(block_called).to eq(2)
156
155
  end
157
156
 
158
157
  it 'should execute both when using individual callbacks' do
@@ -161,17 +160,17 @@ describe Google::APIClient::BatchRequest do
161
160
  call1_returned, call2_returned = false, false
162
161
  batch.add(@call1) do |result|
163
162
  call1_returned = true
164
- result.status.should == 200
163
+ expect(result.status).to eq(200)
165
164
  end
166
165
  batch.add(@call2) do |result|
167
166
  call2_returned = true
168
- result.status.should >= 400
169
- result.status.should < 500
167
+ expect(result.status).to be >= 400
168
+ expect(result.status).to be < 500
170
169
  end
171
170
 
172
171
  CLIENT.execute(batch)
173
- call1_returned.should == true
174
- call2_returned.should == true
172
+ expect(call1_returned).to be_truthy
173
+ expect(call2_returned).to be_truthy
175
174
  end
176
175
  end
177
176
  end
@@ -236,12 +235,12 @@ describe Google::APIClient::BatchRequest do
236
235
  batch.add(@call1, '1').add(@call2, '2')
237
236
  request = batch.to_env(CLIENT.connection)
238
237
  boundary = Google::APIClient::BatchRequest::BATCH_BOUNDARY
239
- request[:method].to_s.downcase.should == 'post'
240
- request[:url].to_s.should == 'https://www.googleapis.com/batch'
241
- request[:request_headers]['Content-Type'].should == "multipart/mixed;boundary=#{boundary}"
242
- # TODO - Fix headers
243
- #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)}--/
244
- #request[:body].read.gsub("\r", "").should =~ expected_body
238
+ expect(request[:method].to_s.downcase).to eq('post')
239
+ expect(request[:url].to_s).to eq('https://www.googleapis.com/batch')
240
+ expect(request[:request_headers]['Content-Type']).to eq("multipart/mixed;boundary=#{boundary}")
241
+ body = request[:body].read
242
+ expect(body).to include(@call1[:body])
243
+ expect(body).to include(@call2[:body])
245
244
  end
246
245
  end
247
246