Continue internal shuffling...
[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_http_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, @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         pending("This is caused by Faraday's encoding of query parameters.")
82         reference = @result.next_page
83         Hash[reference.parameters].should include('pageToken')
84         Hash[reference.parameters]['pageToken'].should == 'NEXT+PAGE+TOKEN'
85         url = reference.to_env(Faraday.default_connection)[:url]
86         url.to_s.should include('pageToken=NEXT%2BPAGE%2BTOKEN')
87       end
88
89       it 'should return content type correctly' do
90         @result.media_type.should == 'application/json'
91       end
92
93       it 'should return the result data correctly' do
94         @result.data?.should be_true
95         @result.data.class.to_s.should ==
96             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
97         @result.data.kind.should == 'plus#activityFeed'
98         @result.data.etag.should == 'FOO'
99         @result.data.nextPageToken.should == 'NEXT+PAGE+TOKEN'
100         @result.data.selfLink.should ==
101             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
102         @result.data.nextLink.should ==
103             'https://www.googleapis.com/plus/v1/people/foo/activities/public?' +
104             'maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN'
105         @result.data.title.should == 'Plus Public Activity Feed for '
106         @result.data.id.should ==
107             'tag:google.com,2010:/plus/people/foo/activities/public'
108         @result.data.items.should be_empty
109       end
110     end
111
112     describe 'without a next page token' do
113       before do
114         @response.stub(:body).and_return(
115           <<-END_OF_STRING
116           {
117             "kind": "plus#activityFeed",
118             "etag": "FOO",
119             "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?",
120             "title": "Plus Public Activity Feed for ",
121             "updated": "2012-04-23T00:00:00.000Z",
122             "id": "tag:google.com,2010:/plus/people/foo/activities/public",
123             "items": []
124           }
125           END_OF_STRING
126         )
127         @result = Google::APIClient::Result.new(@reference, @response)
128       end
129
130       it 'should not return a next page token' do
131         @result.next_page_token.should == nil
132       end
133
134       it 'should return content type correctly' do
135         @result.media_type.should == 'application/json'
136       end
137
138       it 'should return the result data correctly' do
139         @result.data?.should be_true
140         @result.data.class.to_s.should ==
141             'Google::APIClient::Schema::Plus::V1::ActivityFeed'
142         @result.data.kind.should == 'plus#activityFeed'
143         @result.data.etag.should == 'FOO'
144         @result.data.selfLink.should ==
145             'https://www.googleapis.com/plus/v1/people/foo/activities/public?'
146         @result.data.title.should == 'Plus Public Activity Feed for '
147         @result.data.id.should ==
148             'tag:google.com,2010:/plus/people/foo/activities/public'
149         @result.data.items.should be_empty
150       end
151     end
152     
153     describe 'with JSON error response' do
154       before do
155         @response.stub(:body).and_return(
156          <<-END_OF_STRING
157          {
158           "error": {
159            "errors": [
160             {
161              "domain": "global",
162              "reason": "parseError",
163              "message": "Parse Error"
164             }
165            ],
166            "code": 400,
167            "message": "Parse Error"
168           }
169          }
170          END_OF_STRING
171         )
172         @response.stub(:status).and_return(400)
173         @result = Google::APIClient::Result.new(@reference, @response)
174       end
175       
176       it 'should return error status correctly' do
177         @result.error?.should be_true
178       end
179
180       it 'should return the correct error message' do
181         @result.error_message.should == 'Parse Error'
182       end
183
184     end
185   end
186 end