d7c3326c203911f9820d4d118ac0cab1c9610760
[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
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_request
36
37       # Response stub
38       @response = stub("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": "tag:google.com,2010:/plus/people/foo/activities/public",
65             "items": []
66           }
67           END_OF_STRING
68         )
69         @result = Google::APIClient::Result.new(@reference, @request, @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_request.to_env(Faraday.default_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 ==
106             'tag:google.com,2010:/plus/people/foo/activities/public'
107         @result.data.items.should be_empty
108       end
109     end
110
111     describe 'without a next page token' do
112       before do
113         @response.stub(:body).and_return(
114           <<-END_OF_STRING
115           {
116             "kind": "plus#activityFeed",
117             "etag": "FOO",
118             "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?",
119             "title": "Plus Public Activity Feed for ",
120             "updated": "2012-04-23T00:00:00.000Z",
121             "id": "tag:google.com,2010:/plus/people/foo/activities/public",
122             "items": []
123           }
124           END_OF_STRING
125         )
126         @result = Google::APIClient::Result.new(@reference, @request, @response)
127       end
128
129       it 'should not return a next page token' do
130         @result.next_page_token.should == nil
131       end
132
133       it 'should return content type correctly' do
134         @result.media_type.should == 'application/json'
135       end
136
137       it 'should return the result data correctly' do
138         @result.data?.should be_true
139         @result.data.class.to_s.should ==
140             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
141         @result.data.kind.should == 'plus#activityFeed'
142         @result.data.etag.should == 'FOO'
143         @result.data.selfLink.should ==
144             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
145         @result.data.title.should == 'Plus Public Activity Feed for '
146         @result.data.id.should ==
147             'tag:google.com,2010:/plus/people/foo/activities/public'
148         @result.data.items.should be_empty
149       end
150     end
151     
152     describe 'with JSON error response' do
153       before do
154         @response.stub(:body).and_return(
155          <<-END_OF_STRING
156          {
157           "error": {
158            "errors": [
159             {
160              "domain": "global",
161              "reason": "parseError",
162              "message": "Parse Error"
163             }
164            ],
165            "code": 400,
166            "message": "Parse Error"
167           }
168          }
169          END_OF_STRING
170         )
171         @response.stub(:status).and_return(400)
172         @result = Google::APIClient::Result.new(@reference, @request, @response)
173       end
174       
175       it 'should return error status correctly' do
176         @result.error?.should be_true
177       end
178
179       it 'should return the correct error message' do
180         @result.error_message.should == 'Parse Error'
181       end
182
183     end
184   end
185 end