koala 0.10.0 → 1.0.0.rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/CHANGELOG +39 -7
- data/Gemfile +3 -0
- data/Manifest +8 -1
- data/Rakefile +13 -14
- data/koala.gemspec +36 -19
- data/lib/koala/graph_api.rb +188 -123
- data/lib/koala/http_services.rb +93 -18
- data/lib/koala/rest_api.rb +73 -6
- data/lib/koala/test_users.rb +21 -8
- data/lib/koala/uploadable_io.rb +115 -0
- data/lib/koala.rb +86 -86
- data/readme.md +18 -12
- data/spec/cases/api_base_spec.rb +101 -0
- data/spec/cases/graph_and_rest_api_spec.rb +31 -0
- data/spec/cases/graph_api_spec.rb +25 -0
- data/spec/cases/http_services/http_service_spec.rb +54 -0
- data/spec/cases/http_services/net_http_service_spec.rb +350 -0
- data/spec/cases/http_services/typhoeus_service_spec.rb +144 -0
- data/spec/cases/oauth_spec.rb +374 -0
- data/spec/cases/realtime_updates_spec.rb +184 -0
- data/spec/cases/rest_api_spec.rb +25 -0
- data/spec/{koala/test_users/test_users_tests.rb → cases/test_users_spec.rb} +78 -72
- data/spec/cases/uploadable_io_spec.rb +151 -0
- data/spec/fixtures/beach.jpg +0 -0
- data/spec/{facebook_data.yml → fixtures/facebook_data.yml} +13 -9
- data/spec/{mock_facebook_responses.yml → fixtures/mock_facebook_responses.yml} +312 -289
- data/spec/spec_helper.rb +18 -0
- data/spec/support/graph_api_shared_examples.rb +424 -0
- data/spec/{koala → support}/live_testing_data_helper.rb +39 -42
- data/spec/{mock_http_service.rb → support/mock_http_service.rb} +94 -81
- data/spec/support/rest_api_shared_examples.rb +161 -0
- data/spec/support/setup_mocks_or_live.rb +52 -0
- data/spec/support/uploadable_io_shared_examples.rb +76 -0
- metadata +130 -43
- data/init.rb +0 -2
- data/spec/koala/api_base_tests.rb +0 -102
- data/spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb +0 -10
- data/spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb +0 -11
- data/spec/koala/graph_api/graph_api_no_access_token_tests.rb +0 -114
- data/spec/koala/graph_api/graph_api_with_access_token_tests.rb +0 -150
- data/spec/koala/graph_api/graph_collection_tests.rb +0 -104
- data/spec/koala/net_http_service_tests.rb +0 -186
- data/spec/koala/oauth/oauth_tests.rb +0 -438
- data/spec/koala/realtime_updates/realtime_updates_tests.rb +0 -187
- data/spec/koala/rest_api/rest_api_no_access_token_tests.rb +0 -94
- data/spec/koala/rest_api/rest_api_with_access_token_tests.rb +0 -36
- data/spec/koala_spec.rb +0 -18
- data/spec/koala_spec_helper.rb +0 -48
- data/spec/koala_spec_without_mocks.rb +0 -19
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# GraphCollection
|
|
2
|
-
shared_examples_for "Koala GraphAPI with GraphCollection" do
|
|
3
|
-
|
|
4
|
-
it "should create an array-like object" do
|
|
5
|
-
call = @api.graph_call("contextoptional/photos")
|
|
6
|
-
Koala::Facebook::GraphCollection.new(call, @api).should be_an(Array)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
describe "when getting a collection" do
|
|
10
|
-
# GraphCollection methods
|
|
11
|
-
it "should get a GraphCollection when getting connections" do
|
|
12
|
-
@result = @api.get_connections("contextoptional", "photos")
|
|
13
|
-
@result.should be_a(Koala::Facebook::GraphCollection)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it "should return nil if the get_collections call fails with nil" do
|
|
17
|
-
# this happens sometimes
|
|
18
|
-
@api.should_receive(:graph_call).and_return(nil)
|
|
19
|
-
@api.get_connections("contextoptional", "photos").should be_nil
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should get a GraphCollection when searching" do
|
|
23
|
-
result = @api.search("facebook")
|
|
24
|
-
result.should be_a(Koala::Facebook::GraphCollection)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "should return nil if the search call fails with nil" do
|
|
28
|
-
# this happens sometimes
|
|
29
|
-
@api.should_receive(:graph_call).and_return(nil)
|
|
30
|
-
@api.search("facebook").should be_nil
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should get a GraphCollection when paging through results" do
|
|
34
|
-
@results = @api.get_page(["search", {"q"=>"facebook", "limit"=>"25", "until"=>"2010-09-23T21:17:33+0000"}])
|
|
35
|
-
@results.should be_a(Koala::Facebook::GraphCollection)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should return nil if the page call fails with nil" do
|
|
39
|
-
# this happens sometimes
|
|
40
|
-
@api.should_receive(:graph_call).and_return(nil)
|
|
41
|
-
@api.get_page(["search", {"q"=>"facebook", "limit"=>"25", "until"=>"2010-09-23T21:17:33+0000"}]).should be_nil
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# GraphCollection attributes
|
|
45
|
-
describe "the GraphCollection" do
|
|
46
|
-
before(:each) do
|
|
47
|
-
@result = @api.get_connections("contextoptional", "photos")
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should have a read-only paging attribute" do
|
|
51
|
-
lambda { @result.paging }.should_not raise_error
|
|
52
|
-
lambda { @result.paging = "paging" }.should raise_error(NoMethodError)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
describe "when getting a whole page" do
|
|
56
|
-
before(:each) do
|
|
57
|
-
@second_page = stub("page of Fb graph results")
|
|
58
|
-
@base = stub("base")
|
|
59
|
-
@args = stub("args")
|
|
60
|
-
@page_of_results = stub("page of results")
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should return the previous page of results" do
|
|
64
|
-
@result.should_receive(:previous_page_params).and_return([@base, @args])
|
|
65
|
-
@api.should_receive(:graph_call).with(@base, @args).and_return(@second_page)
|
|
66
|
-
Koala::Facebook::GraphCollection.should_receive(:new).with(@second_page, @api).and_return(@page_of_results)
|
|
67
|
-
|
|
68
|
-
@result.previous_page.should == @page_of_results
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "should return the next page of results" do
|
|
72
|
-
@result.should_receive(:next_page_params).and_return([@base, @args])
|
|
73
|
-
@api.should_receive(:graph_call).with(@base, @args).and_return(@second_page)
|
|
74
|
-
Koala::Facebook::GraphCollection.should_receive(:new).with(@second_page, @api).and_return(@page_of_results)
|
|
75
|
-
|
|
76
|
-
@result.next_page.should == @page_of_results
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "should return nil it there are no other pages" do
|
|
80
|
-
%w{next previous}.each do |this|
|
|
81
|
-
@result.should_receive("#{this}_page_params".to_sym).and_return(nil)
|
|
82
|
-
@result.send("#{this}_page").should == nil
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
describe "when parsing page paramters" do
|
|
88
|
-
before(:each) do
|
|
89
|
-
@graph_collection = Koala::Facebook::GraphCollection.new({"data" => []}, Koala::Facebook::GraphAPI.new)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "should return the base as the first array entry" do
|
|
93
|
-
base = "url_path"
|
|
94
|
-
@graph_collection.parse_page_url("anything.com/#{base}?anything").first.should == base
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "should return the arguments as a hash as the last array entry" do
|
|
98
|
-
args_hash = {"one" => "val_one", "two" => "val_two"}
|
|
99
|
-
@graph_collection.parse_page_url("anything.com/anything?#{args_hash.map {|k,v| "#{k}=#{v}" }.join("&")}").last.should == args_hash
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
require 'koala/http_services'
|
|
2
|
-
class NetHTTPServiceTests < Test::Unit::TestCase
|
|
3
|
-
module Bear
|
|
4
|
-
include Koala::NetHTTPService
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
describe "NetHTTPService module holder class Bear" do
|
|
8
|
-
it "should define a make_request static module method" do
|
|
9
|
-
Bear.respond_to?(:make_request).should be_true
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
describe "when making a request" do
|
|
13
|
-
before(:each) do
|
|
14
|
-
# Setup stubs for make_request to execute without exceptions
|
|
15
|
-
@mock_http_response = stub('Net::HTTPResponse', :code => 1)
|
|
16
|
-
@mock_body = stub('Net::HTTPResponse body')
|
|
17
|
-
@http_request_result = [@mock_http_response, @mock_body]
|
|
18
|
-
|
|
19
|
-
# to_ary is called in Ruby 1.9 to provide backwards compatibility
|
|
20
|
-
# with the response, body = http.get() syntax we use
|
|
21
|
-
@mock_http_response.stub!(:to_ary).and_return(@http_request_result)
|
|
22
|
-
|
|
23
|
-
@http_yield_mock = mock('Net::HTTP start yielded object')
|
|
24
|
-
|
|
25
|
-
@http_yield_mock.stub(:post).and_return(@http_request_result)
|
|
26
|
-
@http_yield_mock.stub(:get).and_return(@http_request_result)
|
|
27
|
-
|
|
28
|
-
@http_mock = stub('Net::HTTP object', 'use_ssl=' => true, 'verify_mode=' => true)
|
|
29
|
-
@http_mock.stub(:start).and_yield(@http_yield_mock)
|
|
30
|
-
|
|
31
|
-
Net::HTTP.stub(:new).and_return(@http_mock)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should use POST if verb is not GET" do
|
|
35
|
-
@http_yield_mock.should_receive(:post).and_return(@mock_http_response)
|
|
36
|
-
@http_mock.should_receive(:start).and_yield(@http_yield_mock)
|
|
37
|
-
|
|
38
|
-
Bear.make_request('anything', {}, 'anything')
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "should use port 443" do
|
|
42
|
-
Net::HTTP.should_receive(:new).with(anything, 443).and_return(@http_mock)
|
|
43
|
-
|
|
44
|
-
Bear.make_request('anything', {}, 'anything')
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "should use SSL" do
|
|
48
|
-
@http_mock.should_receive('use_ssl=').with(true)
|
|
49
|
-
|
|
50
|
-
Bear.make_request('anything', {}, 'anything')
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "should use the graph server by default" do
|
|
54
|
-
Net::HTTP.should_receive(:new).with(Koala::Facebook::GRAPH_SERVER, anything).and_return(@http_mock)
|
|
55
|
-
Bear.make_request('anything', {}, 'anything')
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "should use the REST server if the :rest_api option is true" do
|
|
59
|
-
Net::HTTP.should_receive(:new).with(Koala::Facebook::REST_SERVER, anything).and_return(@http_mock)
|
|
60
|
-
Bear.make_request('anything', {}, 'anything', :rest_api => true)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should turn off vertificate validaiton warnings" do
|
|
64
|
-
@http_mock.should_receive('verify_mode=').with(OpenSSL::SSL::VERIFY_NONE)
|
|
65
|
-
|
|
66
|
-
Bear.make_request('anything', {}, 'anything')
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "should start an HTTP connection" do
|
|
70
|
-
@http_mock.should_receive(:start).and_yield(@http_yield_mock)
|
|
71
|
-
Bear.make_request('anything', {}, 'anything')
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
describe "via POST" do
|
|
75
|
-
it "should use Net::HTTP to make a POST request" do
|
|
76
|
-
@http_yield_mock.should_receive(:post).and_return(@http_request_result)
|
|
77
|
-
|
|
78
|
-
Bear.make_request('anything', {}, 'post')
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should go to the specified path adding a / if it doesn't exist" do
|
|
82
|
-
path = mock('Path')
|
|
83
|
-
@http_yield_mock.should_receive(:post).with(path, anything).and_return(@http_request_result)
|
|
84
|
-
|
|
85
|
-
Bear.make_request(path, {}, 'post')
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should use encoded parameters" do
|
|
89
|
-
args = {}
|
|
90
|
-
params = mock('Encoded parameters')
|
|
91
|
-
Bear.should_receive(:encode_params).with(args).and_return(params)
|
|
92
|
-
|
|
93
|
-
@http_yield_mock.should_receive(:post).with(anything, params).and_return(@http_request_result)
|
|
94
|
-
|
|
95
|
-
Bear.make_request('anything', args, 'post')
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
describe "via GET" do
|
|
100
|
-
it "should use Net::HTTP to make a GET request" do
|
|
101
|
-
@http_yield_mock.should_receive(:get).and_return(@http_request_result)
|
|
102
|
-
|
|
103
|
-
Bear.make_request('anything', {}, 'get')
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "should use the correct path, including arguments" do
|
|
107
|
-
path = mock('Path')
|
|
108
|
-
params = mock('Encoded parameters')
|
|
109
|
-
args = {}
|
|
110
|
-
|
|
111
|
-
Bear.should_receive(:encode_params).with(args).and_return(params)
|
|
112
|
-
@http_yield_mock.should_receive(:get).with("#{path}?#{params}").and_return(@http_request_result)
|
|
113
|
-
|
|
114
|
-
Bear.make_request(path, args, 'get')
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
describe "the returned value" do
|
|
119
|
-
before(:each) do
|
|
120
|
-
@response = Bear.make_request('anything', {}, 'anything')
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
it "should return a Koala::Response object" do
|
|
124
|
-
@response.class.should == Koala::Response
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
it "should return a Koala::Response with the right status" do
|
|
128
|
-
@response.status.should == @mock_http_response.code
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "should reutrn a Koala::Response with the right body" do
|
|
132
|
-
@response.body.should == @mock_body
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it "should return a Koala::Response with the Net::HTTPResponse object as headers" do
|
|
136
|
-
@response.headers.should == @mock_http_response
|
|
137
|
-
end
|
|
138
|
-
end # describe return value
|
|
139
|
-
end # describe when making a request
|
|
140
|
-
|
|
141
|
-
describe "when encoding parameters" do
|
|
142
|
-
it "should return an empty string if param_hash evaluates to false" do
|
|
143
|
-
Bear.encode_params(nil).should == ''
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
it "should convert values to JSON if the value is not a String" do
|
|
147
|
-
val = 'json_value'
|
|
148
|
-
not_a_string = 'not_a_string'
|
|
149
|
-
not_a_string.stub(:class).and_return('NotAString')
|
|
150
|
-
not_a_string.should_receive(:to_json).and_return(val)
|
|
151
|
-
|
|
152
|
-
string = "hi"
|
|
153
|
-
|
|
154
|
-
args = {
|
|
155
|
-
not_a_string => not_a_string,
|
|
156
|
-
string => string
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
result = Bear.encode_params(args)
|
|
160
|
-
result.split('&').find do |key_and_val|
|
|
161
|
-
key_and_val.match("#{not_a_string}=#{val}")
|
|
162
|
-
end.should be_true
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
it "should escape all values" do
|
|
166
|
-
args = Hash[*(1..4).map {|i| [i.to_s, "Value #{i}($"]}.flatten]
|
|
167
|
-
|
|
168
|
-
result = Bear.encode_params(args)
|
|
169
|
-
result.split('&').each do |key_val|
|
|
170
|
-
key, val = key_val.split('=')
|
|
171
|
-
val.should == CGI.escape(args[key])
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
it "should convert all keys to Strings" do
|
|
176
|
-
args = Hash[*(1..4).map {|i| [i, "val#{i}"]}.flatten]
|
|
177
|
-
|
|
178
|
-
result = Bear.encode_params(args)
|
|
179
|
-
result.split('&').each do |key_val|
|
|
180
|
-
key, val = key_val.split('=')
|
|
181
|
-
key.should == args.find{|key_val_arr| key_val_arr.last == val}.first.to_s
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|