| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | # Copyright 2015 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SPEC_DIR = File.expand_path(File.dirname(__FILE__)) | 
					
						
							|  |  |  | ROOT_DIR = File.expand_path(File.join(SPEC_DIR, '..')) | 
					
						
							|  |  |  | LIB_DIR = File.expand_path(File.join(ROOT_DIR, 'lib')) | 
					
						
							|  |  |  | GENERATED_DIR = File.expand_path(File.join(ROOT_DIR, 'generated')) | 
					
						
							| 
									
										
										
										
											2015-12-17 18:35:02 +00:00
										 |  |  | THIRD_PARTY_DIR = File.expand_path(File.join(ROOT_DIR, 'third_party')) | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | FIXTURES_DIR = File.expand_path(File.join(SPEC_DIR, 'fixtures')) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-05 06:18:56 +00:00
										 |  |  | $LOAD_PATH.uniq! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | if defined?(JRUBY_VERSION) | 
					
						
							|  |  |  |   puts 'Skipping coverage on JRuby' | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |   # set up coverage | 
					
						
							|  |  |  |   require 'simplecov' | 
					
						
							|  |  |  |   require 'coveralls' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SimpleCov.formatters = [ | 
					
						
							|  |  |  |     Coveralls::SimpleCov::Formatter, | 
					
						
							|  |  |  |     SimpleCov::Formatter::HTMLFormatter | 
					
						
							|  |  |  |   ] | 
					
						
							|  |  |  |   SimpleCov.start do | 
					
						
							|  |  |  |     add_filter '/spec/' | 
					
						
							|  |  |  |     add_filter '/generated/' | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'rspec' | 
					
						
							|  |  |  | require 'webmock/rspec' | 
					
						
							| 
									
										
										
										
											2015-08-19 20:57:14 +00:00
										 |  |  | require 'fakefs/spec_helpers' | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | require 'json_spec' | 
					
						
							|  |  |  | require 'logging' | 
					
						
							| 
									
										
										
										
											2020-03-07 00:57:20 +00:00
										 |  |  | require 'ostruct' | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | require 'rspec/logging_helper' | 
					
						
							|  |  |  | require 'google/apis' | 
					
						
							|  |  |  | require 'google/apis/core/base_service' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Configure RSpec to capture log messages for each test. The output from the | 
					
						
							|  |  |  | # logs will be stored in the @log_output variable. It is a StringIO instance. | 
					
						
							|  |  |  | RSpec.configure do |config| | 
					
						
							|  |  |  |   include RSpec::LoggingHelper | 
					
						
							| 
									
										
										
										
											2015-08-19 20:57:14 +00:00
										 |  |  |   config.include FakeFS::SpecHelpers, fakefs: true | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  |   config.include JsonSpec::Helpers | 
					
						
							|  |  |  |   config.include WebMock::API | 
					
						
							|  |  |  |   config.capture_log_messages | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Google::Apis.logger.level = Logger::DEBUG | 
					
						
							| 
									
										
										
										
											2015-10-02 20:31:19 +00:00
										 |  |  |   WebMock::Config.instance.query_values_notation = :flat_array | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [JsonSpec::Matchers::BeJsonEql, | 
					
						
							|  |  |  |  JsonSpec::Matchers::IncludeJson, | 
					
						
							|  |  |  |  JsonSpec::Matchers::HaveJsonType, | 
					
						
							|  |  |  |  JsonSpec::Matchers::HaveJsonSize, | 
					
						
							|  |  |  |  JsonSpec::Matchers::HaveJsonPath].each do |klass| | 
					
						
							|  |  |  |   klass.send(:alias_method, :===, :matches?) | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RSpec.shared_context 'HTTP client' do | 
					
						
							|  |  |  |   let(:client) do | 
					
						
							|  |  |  |     Google::Apis::Core::BaseService.new('', '').client | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module TestHelpers | 
					
						
							|  |  |  |   include WebMock::API | 
					
						
							|  |  |  |   include WebMock::Matchers | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Enable retries for tests | 
					
						
							|  |  |  | Google::Apis::RequestOptions.default.retries = 5
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-18 22:37:21 +00:00
										 |  |  | # Allow testing different adapters | 
					
						
							|  |  |  | Google::Apis::ClientOptions.default.use_net_http = true if ENV['USE_NET_HTTP'] | 
					
						
							| 
									
										
										
										
											2015-04-17 00:28:38 +00:00
										 |  |  | # Temporarily patch WebMock to allow chunked responses for Net::HTTP | 
					
						
							|  |  |  | module Net | 
					
						
							|  |  |  |   module WebMockHTTPResponse | 
					
						
							|  |  |  |     def eval_chunk(chunk) | 
					
						
							|  |  |  |       chunk if chunk.is_a?(String) | 
					
						
							|  |  |  |       chunk.read if chunk.is_a?(IO) | 
					
						
							|  |  |  |       chunk.call if chunk.is_a?(Proc) | 
					
						
							|  |  |  |       fail chunk if chunk.is_a?(Class) | 
					
						
							|  |  |  |       chunk | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def read_body(dest = nil, &block) | 
					
						
							|  |  |  |       if !(defined?(@__read_body_previously_called).nil?) && @__read_body_previously_called | 
					
						
							|  |  |  |         return super | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       return @body if dest.nil? && block.nil? | 
					
						
							|  |  |  |       fail ArgumentError.new('both arg and block given for HTTP method') if dest && block | 
					
						
							|  |  |  |       return nil if @body.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dest ||= ::Net::ReadAdapter.new(block) | 
					
						
							|  |  |  |       body_parts = Array(@body) | 
					
						
							|  |  |  |       body_parts.each do |chunk| | 
					
						
							|  |  |  |         chunk = eval_chunk(chunk) | 
					
						
							|  |  |  |         dest << chunk | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @body = dest | 
					
						
							|  |  |  |     ensure | 
					
						
							|  |  |  |       # allow subsequent calls to #read_body to proceed as normal, without our hack... | 
					
						
							|  |  |  |       @__read_body_previously_called = true | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2015-06-24 20:48:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-18 22:37:21 +00:00
										 |  |  | class WebMockHTTPClient | 
					
						
							|  |  |  |   def eval_chunk(chunk) | 
					
						
							|  |  |  |     chunk if chunk.is_a?(String) | 
					
						
							|  |  |  |     chunk.read if chunk.is_a?(IO) | 
					
						
							|  |  |  |     chunk.call if chunk.is_a?(Proc) | 
					
						
							|  |  |  |     fail HTTPClient::TimeoutError if chunk == ::Timeout::Error | 
					
						
							|  |  |  |     fail chunk if chunk.is_a?(Class) | 
					
						
							|  |  |  |     chunk | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def build_httpclient_response(webmock_response, stream = false, req_header = nil, &block) | 
					
						
							|  |  |  |     body = stream ? StringIO.new(webmock_response.body) : webmock_response.body | 
					
						
							|  |  |  |     response = HTTP::Message.new_response(body, req_header) | 
					
						
							|  |  |  |     response.header.init_response(webmock_response.status[0]) | 
					
						
							|  |  |  |     response.reason = webmock_response.status[1] | 
					
						
							|  |  |  |     webmock_response.headers.to_a.each { |name, value| response.header.set(name, value) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     raise HTTPClient::TimeoutError if webmock_response.should_timeout | 
					
						
							|  |  |  |     webmock_response.raise_error_if_any | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     body_parts = Array(webmock_response.body) | 
					
						
							|  |  |  |     body_parts.each do |chunk| | 
					
						
							|  |  |  |       chunk = eval_chunk(chunk) | 
					
						
							|  |  |  |       block.call(response, chunk) if block | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 20:48:14 +00:00
										 |  |  | def run_integration_tests? | 
					
						
							|  |  |  |   ENV['GOOGLE_APPLICATION_CREDENTIALS'] && ENV['GOOGLE_PROJECT_ID'] | 
					
						
							|  |  |  | end |