@options = {
# TODO: What configuration options need to go here?
}.merge(options)
+ if !self.authorization.respond_to?(:generate_authenticated_request)
+ raise TypeError,
+ 'Expected authorization mechanism to respond to ' +
+ '#generate_authenticated_request.'
+ end
end
##
end
def discovered_service(service_name, service_version='v1')
+ if !service_name.kind_of?(String) && !service_name.kind_of?(Symbol)
+ raise TypeError,
+ "Expected String or Symbol, got #{service_name.class}."
+ end
+ service_name = service_name.to_s
for service in self.discovered_services
if service.name == service_name &&
service.version.to_s == service_version.to_s
end
def discovered_method(rpc_name, service_version='v1')
+ if !rpc_name.kind_of?(String) && !rpc_name.kind_of?(Symbol)
+ raise TypeError,
+ "Expected String or Symbol, got #{rpc_name.class}."
+ end
+ rpc_name = rpc_name.to_s
for service in self.discovered_services
# This looks kinda weird, but is not a real problem because there's
# almost always only one service, and this is memoized anyhow.
end
def latest_service(service_name)
+ if !service_name.kind_of?(String) && !service_name.kind_of?(Symbol)
+ raise TypeError,
+ "Expected String or Symbol, got #{service_name.class}."
+ end
+ service_name = service_name.to_s
versions = {}
for service in self.discovered_services
next if service.name != service_name
:parser => self.parser,
:service_version => 'v1'
}.merge(options)
- if api_method.kind_of?(String)
+ if api_method.kind_of?(String) || api_method.kind_of?(Symbol)
api_method = self.discovered_method(
- api_method, options[:service_version]
+ api_method.to_s, options[:service_version]
)
elsif !api_method.kind_of?(::Google::APIClient::Service)
raise TypeError,
- "Expected String or Google::APIClient::Service, " +
+ "Expected String, Symbol, or Google::APIClient::Service, " +
"got #{api_method.class}."
end
+ unless api_method
+ raise ArgumentError, "API method does not exist."
+ end
request = api_method.generate_request(parameters, body, headers)
if options[:signed]
request = self.sign_request(request)
end
def sign_request(request)
- if self.authorization.respond_to?(:generate_authenticated_request)
- return self.authorization.generate_authenticated_request(
- :request => request
- )
- else
- raise TypeError,
- 'Expected authorization mechanism to respond to ' +
- '#generate_authenticated_request.'
- end
+ return self.authorization.generate_authenticated_request(
+ :request => request
+ )
end
end
end
end
end
+describe Google::APIClient, 'configured for bogus authorization' do
+ it 'should raise a type error' do
+ (lambda do
+ Google::APIClient.new(:service => 'prediction', :authorization => 42)
+ end).should raise_error(TypeError)
+ end
+end
+
describe Google::APIClient, 'configured for the prediction API' do
before do
@client = Google::APIClient.new(:service => 'prediction')
@client.discovered_services.size.should > 1
end
+ it 'should find APIs that are in the discovery document' do
+ @client.discovered_service('prediction').name.should == 'prediction'
+ @client.discovered_service('prediction').version.should == 'v1'
+ @client.discovered_service(:prediction).name.should == 'prediction'
+ @client.discovered_service(:prediction).version.should == 'v1'
+ end
+
+ it 'should find API versions that are in the discovery document' do
+ @client.discovered_service('prediction', 'v1.1').version.should == 'v1.1'
+ end
+
+ it 'should not find APIs that are not in the discovery document' do
+ @client.discovered_service('bogus').should == nil
+ end
+
+ it 'should raise an error for bogus services' do
+ (lambda do
+ @client.discovered_service(42)
+ end).should raise_error(TypeError)
+ end
+
+ it 'should find methods that are in the discovery document' do
+ @client.discovered_method('prediction.training.insert').name.should ==
+ 'insert'
+ @client.discovered_method(:'prediction.training.insert').name.should ==
+ 'insert'
+ end
+
+ it 'should find methods for versions that are in the discovery document' do
+ @client.discovered_method(
+ 'prediction.training.delete', 'v1.1'
+ ).should_not == nil
+ end
+
+ it 'should not find methods that are not in the discovery document' do
+ @client.discovered_method('prediction.training.delete', 'v1').should == nil
+ @client.discovered_method('prediction.bogus').should == nil
+ end
+
+ it 'should raise an error for bogus methods' do
+ (lambda do
+ @client.discovered_method(42)
+ end).should raise_error(TypeError)
+ end
+
it 'should correctly determine the latest version' do
@client.latest_service('prediction').version.should_not == 'v1'
+ @client.latest_service(:prediction).version.should_not == 'v1'
+ end
+
+ it 'should raise an error for bogus services' do
+ (lambda do
+ @client.latest_service(42)
+ end).should raise_error(TypeError)
end
it 'should correctly determine the latest version' do
'https://www.googleapis.com/prediction/v1/training?query=12345'
end
+ it 'should generate requests against the correct URIs' do
+ request = @client.generate_request(
+ :'prediction.training.insert',
+ {'query' => '12345'},
+ '',
+ [],
+ {:signed => false}
+ )
+ method, uri, headers, body = request
+ uri.should ==
+ 'https://www.googleapis.com/prediction/v1/training?query=12345'
+ end
+
it 'should generate signed requests' do
@client.authorization.token_credential_key = '12345'
@client.authorization.token_credential_secret = '12345'
status, headers, body = response
status.should == 401
end
+
+ it 'should raise an error for bogus methods' do
+ (lambda do
+ @client.generate_request(42)
+ end).should raise_error(TypeError)
+ end
+end
+
+describe Google::APIClient, 'configured for the buzz API' do
+ before do
+ @client = Google::APIClient.new(:service => 'buzz')
+ end
+
+ it 'should correctly determine the discovery URI' do
+ @client.discovery_uri.should ===
+ 'http://www.googleapis.com/discovery/0.1/describe?api=buzz'
+ end
+
+ it 'should find APIs that are in the discovery document' do
+ @client.discovered_service('buzz').name.should == 'buzz'
+ @client.discovered_service('buzz').version.should == 'v1'
+ end
+
+ it 'should not find APIs that are not in the discovery document' do
+ @client.discovered_service('bogus').should == nil
+ end
+
+ it 'should find methods that are in the discovery document' do
+ # TODO(bobaman) Fix this when the RPC names are correct
+ @client.discovered_method('chili.activities.list').name.should == 'list'
+ end
+
+ it 'should not find methods that are not in the discovery document' do
+ @client.discovered_method('buzz.bogus').should == nil
+ end
+
+ it 'should generate requests against the correct URIs' do
+ # TODO(bobaman) Fix this when the RPC names are correct
+ request = @client.generate_request(
+ 'chili.activities.list',
+ {'userId' => 'hikingfan', 'scope' => '@public'},
+ '',
+ [],
+ {:signed => false}
+ )
+ method, uri, headers, body = request
+ uri.should ==
+ 'https://www.googleapis.com/buzz/v1/activities/hikingfan/@public'
+ end
+
+ it 'should correctly validate parameters' do
+ # TODO(bobaman) Fix this when the RPC names are correct
+ (lambda do
+ @client.generate_request(
+ 'chili.activities.list',
+ {'alt' => 'json'},
+ '',
+ [],
+ {:signed => false}
+ )
+ end).should raise_error(ArgumentError)
+ end
+
+ it 'should correctly validate parameters' do
+ # TODO(bobaman) Fix this when the RPC names are correct
+ (lambda do
+ @client.generate_request(
+ 'chili.activities.list',
+ {'userId' => 'hikingfan', 'scope' => '@bogus'},
+ '',
+ [],
+ {:signed => false}
+ )
+ end).should raise_error(ArgumentError)
+ end
+
+ it 'should be able to execute requests without authorization' do
+ # TODO(bobaman) Fix this when the RPC names are correct
+ response = @client.execute(
+ 'chili.activities.list',
+ {'alt' => 'json', 'userId' => 'hikingfan', 'scope' => '@public'},
+ '',
+ [],
+ {:signed => false}
+ )
+ status, headers, body = response
+ status.should == 200
+ end
end