Adding batch support to new service interface
[arvados.git] / spec / google / api_client / result_spec.rb
1 # Copyright 2012 Google Inc.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 require 'spec_helper'
16
17 require 'google/api_client'
18 require 'google/api_client/version'
19
20 describe Google::APIClient::Result do
21   CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT)
22
23   describe 'with the plus API' do
24     before do
25       CLIENT.authorization = nil
26       @plus = CLIENT.discovered_api('plus', 'v1')
27       @reference = Google::APIClient::Reference.new({
28         :api_method => @plus.activities.list,
29         :parameters => {
30           'userId' => 'me',
31           'collection' => 'public',
32           'maxResults' => 20
33         }
34       })
35       @request = @reference.to_http_request
36
37       # Response double
38       @response = double("response")
39       @response.stub(:status).and_return(200)
40       @response.stub(:headers).and_return({
41         'etag' => '12345',
42         'x-google-apiary-auth-scopes' =>
43           'https://www.googleapis.com/auth/plus.me',
44         'content-type' => 'application/json; charset=UTF-8',
45         'date' => 'Mon, 23 Apr 2012 00:00:00 GMT',
46         'cache-control' => 'private, max-age=0, must-revalidate, no-transform',
47         'server' => 'GSE',
48         'connection' => 'close'
49       })
50     end
51
52     describe 'with a next page token' do
53       before do
54         @response.stub(:body).and_return(
55           <<-END_OF_STRING
56           {
57             "kind": "plus#activityFeed",
58             "etag": "FOO",
59             "nextPageToken": "NEXT+PAGE+TOKEN",
60             "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?",
61             "nextLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN",
62             "title": "Plus Public Activity Feed for ",
63             "updated": "2012-04-23T00:00:00.000Z",
64             "id": "123456790",
65             "items": []
66           }
67           END_OF_STRING
68         )
69         @result = Google::APIClient::Result.new(@reference, @response)
70       end
71
72       it 'should indicate a successful response' do
73         @result.error?.should be_false
74       end
75
76       it 'should return the correct next page token' do
77         @result.next_page_token.should == 'NEXT+PAGE+TOKEN'
78       end
79
80       it 'should escape the next page token when calling next_page' do
81         reference = @result.next_page
82         Hash[reference.parameters].should include('pageToken')
83         Hash[reference.parameters]['pageToken'].should == 'NEXT+PAGE+TOKEN'
84         url = reference.to_env(CLIENT.connection)[:url]
85         url.to_s.should include('pageToken=NEXT%2BPAGE%2BTOKEN')
86       end
87
88       it 'should return content type correctly' do
89         @result.media_type.should == 'application/json'
90       end
91
92       it 'should return the result data correctly' do
93         @result.data?.should be_true
94         @result.data.class.to_s.should ==
95             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
96         @result.data.kind.should == 'plus#activityFeed'
97         @result.data.etag.should == 'FOO'
98         @result.data.nextPageToken.should == 'NEXT+PAGE+TOKEN'
99         @result.data.selfLink.should ==
100             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
101         @result.data.nextLink.should ==
102             'https://www.googleapis.com/plus/v1/people/foo/activities/public?' +
103             'maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN'
104         @result.data.title.should == 'Plus Public Activity Feed for '
105         @result.data.id.should == "123456790"
106         @result.data.items.should be_empty
107       end
108     end
109
110     describe 'without a next page token' do
111       before do
112         @response.stub(:body).and_return(
113           <<-END_OF_STRING
114           {
115             "kind": "plus#activityFeed",
116             "etag": "FOO",
117             "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?",
118             "title": "Plus Public Activity Feed for ",
119             "updated": "2012-04-23T00:00:00.000Z",
120             "id": "123456790",
121             "items": []
122           }
123           END_OF_STRING
124         )
125         @result = Google::APIClient::Result.new(@reference, @response)
126       end
127
128       it 'should not return a next page token' do
129         @result.next_page_token.should == nil
130       end
131
132       it 'should return content type correctly' do
133         @result.media_type.should == 'application/json'
134       end
135
136       it 'should return the result data correctly' do
137         @result.data?.should be_true
138         @result.data.class.to_s.should ==
139             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
140         @result.data.kind.should == 'plus#activityFeed'
141         @result.data.etag.should == 'FOO'
142         @result.data.selfLink.should ==
143             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
144         @result.data.title.should == 'Plus Public Activity Feed for '
145         @result.data.id.should == "123456790"
146         @result.data.items.should be_empty
147       end
148     end
149     
150     describe 'with JSON error response' do
151       before do
152         @response.stub(:body).and_return(
153          <<-END_OF_STRING
154          {
155           "error": {
156            "errors": [
157             {
158              "domain": "global",
159              "reason": "parseError",
160              "message": "Parse Error"
161             }
162            ],
163            "code": 400,
164            "message": "Parse Error"
165           }
166          }
167          END_OF_STRING
168         )
169         @response.stub(:status).and_return(400)
170         @result = Google::APIClient::Result.new(@reference, @response)
171       end
172       
173       it 'should return error status correctly' do
174         @result.error?.should be_true
175       end
176
177       it 'should return the correct error message' do
178         @result.error_message.should == 'Parse Error'
179       end
180     end
181     
182     describe 'with 204 No Content response' do
183       before do
184         @response.stub(:body).and_return('')
185         @response.stub(:status).and_return(204)
186         @response.stub(:headers).and_return({})
187         @result = Google::APIClient::Result.new(@reference, @response)
188       end
189
190       it 'should indicate no data is available' do
191         @result.data?.should be_false
192       end
193       
194       it 'should return nil for data' do
195         @result.data.should == nil
196       end
197       
198       it 'should return nil for media_type' do
199         @result.media_type.should == nil
200       end
201     end
202   end
203 end