RSpec 3 syntax
[arvados.git] / spec / google / api_client / result_spec.rb
index 51bec7440678efb46c1bbbbf8d582ef754eef0d0..67c63b77cfcc34472ad02226949c70f8d068c00e 100644 (file)
 require 'spec_helper'
 
 require 'google/api_client'
-require 'google/api_client/version'
 
-describe Google::APIClient::Result do
-  let(:client) { Google::APIClient.new }
+RSpec.describe Google::APIClient::Result do
+  CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT)
 
   describe 'with the plus API' do
     before do
-      client.authorization = nil
-      @plus = client.discovered_api('plus', 'v1')
+      CLIENT.authorization = nil
+      @plus = CLIENT.discovered_api('plus', 'v1')
       @reference = Google::APIClient::Reference.new({
         :api_method => @plus.activities.list,
         :parameters => {
@@ -32,12 +31,12 @@ describe Google::APIClient::Result do
           'maxResults' => 20
         }
       })
-      @request = @reference.to_request
+      @request = @reference.to_http_request
 
-      # Response stub
-      @response = stub("response")
-      @response.stub(:status).and_return(200)
-      @response.stub(:headers).and_return({
+      # Response double
+      @response = double("response")
+      allow(@response).to receive(:status).and_return(200)
+      allow(@response).to receive(:headers).and_return({
         'etag' => '12345',
         'x-google-apiary-auth-scopes' =>
           'https://www.googleapis.com/auth/plus.me',
@@ -51,7 +50,7 @@ describe Google::APIClient::Result do
 
     describe 'with a next page token' do
       before do
-        @response.stub(:body).and_return(
+        allow(@response).to receive(:body).and_return(
           <<-END_OF_STRING
           {
             "kind": "plus#activityFeed",
@@ -61,52 +60,58 @@ describe Google::APIClient::Result do
             "nextLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN",
             "title": "Plus Public Activity Feed for ",
             "updated": "2012-04-23T00:00:00.000Z",
-            "id": "tag:google.com,2010:/plus/people/foo/activities/public",
+            "id": "123456790",
             "items": []
           }
           END_OF_STRING
         )
-        @result = Google::APIClient::Result.new(@reference, @request, @response)
+        @result = Google::APIClient::Result.new(@reference, @response)
+      end
+
+      it 'should indicate a successful response' do
+        expect(@result.error?).to be_falsey
       end
 
       it 'should return the correct next page token' do
-        @result.next_page_token.should == 'NEXT+PAGE+TOKEN'
+        expect(@result.next_page_token).to eq('NEXT+PAGE+TOKEN')
       end
 
       it 'should escape the next page token when calling next_page' do
         reference = @result.next_page
-        Hash[reference.parameters].should include('pageToken')
-        Hash[reference.parameters]['pageToken'].should == 'NEXT+PAGE+TOKEN'
-        url = reference.to_request.to_env(Faraday.default_connection)[:url]
-        url.to_s.should include('pageToken=NEXT%2BPAGE%2BTOKEN')
+        expect(Hash[reference.parameters]).to include('pageToken')
+        expect(Hash[reference.parameters]['pageToken']).to eq('NEXT+PAGE+TOKEN')
+        url = reference.to_env(CLIENT.connection)[:url]
+        expect(url.to_s).to include('pageToken=NEXT%2BPAGE%2BTOKEN')
       end
 
       it 'should return content type correctly' do
-        @result.media_type.should == 'application/json'
+        expect(@result.media_type).to eq('application/json')
       end
 
       it 'should return the result data correctly' do
-        @result.data?.should be_true
-        @result.data.class.to_s.should ==
+        expect(@result.data?).to be_truthy
+        expect(@result.data.class.to_s).to eq(
             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
-        @result.data.kind.should == 'plus#activityFeed'
-        @result.data.etag.should == 'FOO'
-        @result.data.nextPageToken.should == 'NEXT+PAGE+TOKEN'
-        @result.data.selfLink.should ==
+        )
+        expect(@result.data.kind).to eq('plus#activityFeed')
+        expect(@result.data.etag).to eq('FOO')
+        expect(@result.data.nextPageToken).to eq('NEXT+PAGE+TOKEN')
+        expect(@result.data.selfLink).to eq(
             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
-        @result.data.nextLink.should ==
+        )
+        expect(@result.data.nextLink).to eq(
             'https://www.googleapis.com/plus/v1/people/foo/activities/public?' +
             'maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN'
-        @result.data.title.should == 'Plus Public Activity Feed for '
-        @result.data.id.should ==
-            'tag:google.com,2010:/plus/people/foo/activities/public'
-        @result.data.items.should be_empty
+        )
+        expect(@result.data.title).to eq('Plus Public Activity Feed for ')
+        expect(@result.data.id).to eq("123456790")
+        expect(@result.data.items).to be_empty
       end
     end
 
     describe 'without a next page token' do
       before do
-        @response.stub(:body).and_return(
+        allow(@response).to receive(:body).and_return(
           <<-END_OF_STRING
           {
             "kind": "plus#activityFeed",
@@ -114,34 +119,88 @@ describe Google::APIClient::Result do
             "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?",
             "title": "Plus Public Activity Feed for ",
             "updated": "2012-04-23T00:00:00.000Z",
-            "id": "tag:google.com,2010:/plus/people/foo/activities/public",
+            "id": "123456790",
             "items": []
           }
           END_OF_STRING
         )
-        @result = Google::APIClient::Result.new(@reference, @request, @response)
+        @result = Google::APIClient::Result.new(@reference, @response)
       end
 
       it 'should not return a next page token' do
-        @result.next_page_token.should == nil
+        expect(@result.next_page_token).to eq(nil)
       end
 
       it 'should return content type correctly' do
-        @result.media_type.should == 'application/json'
+        expect(@result.media_type).to eq('application/json')
       end
 
       it 'should return the result data correctly' do
-        @result.data?.should be_true
-        @result.data.class.to_s.should ==
+        expect(@result.data?).to be_truthy
+        expect(@result.data.class.to_s).to eq(
             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
-        @result.data.kind.should == 'plus#activityFeed'
-        @result.data.etag.should == 'FOO'
-        @result.data.selfLink.should ==
+        )
+        expect(@result.data.kind).to eq('plus#activityFeed')
+        expect(@result.data.etag).to eq('FOO')
+        expect(@result.data.selfLink).to eq(
             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
-        @result.data.title.should == 'Plus Public Activity Feed for '
-        @result.data.id.should ==
-            'tag:google.com,2010:/plus/people/foo/activities/public'
-        @result.data.items.should be_empty
+        )
+        expect(@result.data.title).to eq('Plus Public Activity Feed for ')
+        expect(@result.data.id).to eq("123456790")
+        expect(@result.data.items).to be_empty
+      end
+    end
+
+    describe 'with JSON error response' do
+      before do
+        allow(@response).to receive(:body).and_return(
+         <<-END_OF_STRING
+         {
+          "error": {
+           "errors": [
+            {
+             "domain": "global",
+             "reason": "parseError",
+             "message": "Parse Error"
+            }
+           ],
+           "code": 400,
+           "message": "Parse Error"
+          }
+         }
+         END_OF_STRING
+        )
+        allow(@response).to receive(:status).and_return(400)
+        @result = Google::APIClient::Result.new(@reference, @response)
+      end
+
+      it 'should return error status correctly' do
+        expect(@result.error?).to be_truthy
+      end
+
+      it 'should return the correct error message' do
+        expect(@result.error_message).to eq('Parse Error')
+      end
+    end
+
+    describe 'with 204 No Content response' do
+      before do
+        allow(@response).to receive(:body).and_return('')
+        allow(@response).to receive(:status).and_return(204)
+        allow(@response).to receive(:headers).and_return({})
+        @result = Google::APIClient::Result.new(@reference, @response)
+      end
+
+      it 'should indicate no data is available' do
+        expect(@result.data?).to be_falsey
+      end
+
+      it 'should return nil for data' do
+        expect(@result.data).to eq(nil)
+      end
+
+      it 'should return nil for media_type' do
+        expect(@result.media_type).to eq(nil)
       end
     end
   end