Improving testing and coverage.
authorBob Aman <bobaman@google.com>
Thu, 30 Sep 2010 21:33:23 +0000 (21:33 +0000)
committerBob Aman <bobaman@google.com>
Thu, 30 Sep 2010 21:33:23 +0000 (21:33 +0000)
git-svn-id: https://google-api-ruby-client.googlecode.com/svn/trunk@37 c1d61fac-ed7f-fcc1-18f7-ff78120a04ef

lib/google/api_client.rb
spec/google/api_client/discovery_spec.rb

index c5c5d475ee09206e26a3aabeccba0627eea16a5b..1bfd6eee04fad09b5e3e8327c4f761f435552841 100644 (file)
@@ -33,6 +33,11 @@ module Google #:nodoc:
       @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
 
     ##
@@ -135,6 +140,11 @@ module Google #:nodoc:
     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
@@ -145,6 +155,11 @@ module Google #:nodoc:
     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.
@@ -156,6 +171,11 @@ module Google #:nodoc:
     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
@@ -174,15 +194,18 @@ module Google #:nodoc:
         :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)
@@ -202,15 +225,9 @@ module Google #:nodoc:
     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
index a9254affa89a6a7596d8c6561a91a015f76587dd..0edf4806952093df1797d8b90ae081f7f6d64925 100644 (file)
@@ -45,6 +45,14 @@ describe Google::APIClient, 'configured for a bogus API' do
   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')
@@ -59,8 +67,60 @@ describe Google::APIClient, 'configured for the prediction API' do
     @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
@@ -111,6 +171,19 @@ describe Google::APIClient, 'configured for the prediction API' 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'
@@ -140,4 +213,92 @@ describe Google::APIClient, 'configured for the prediction API' do
     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