koala 0.10.0 → 1.0.0

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.
Files changed (51) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +37 -7
  3. data/Gemfile +3 -0
  4. data/LICENSE +1 -1
  5. data/Manifest +8 -1
  6. data/Rakefile +13 -14
  7. data/koala.gemspec +36 -19
  8. data/lib/koala/graph_api.rb +188 -123
  9. data/lib/koala/http_services.rb +93 -18
  10. data/lib/koala/rest_api.rb +73 -6
  11. data/lib/koala/test_users.rb +21 -8
  12. data/lib/koala/uploadable_io.rb +115 -0
  13. data/lib/koala.rb +104 -120
  14. data/readme.md +29 -16
  15. data/spec/cases/api_base_spec.rb +101 -0
  16. data/spec/cases/graph_and_rest_api_spec.rb +31 -0
  17. data/spec/cases/graph_api_spec.rb +25 -0
  18. data/spec/cases/http_services/http_service_spec.rb +54 -0
  19. data/spec/cases/http_services/net_http_service_spec.rb +350 -0
  20. data/spec/cases/http_services/typhoeus_service_spec.rb +144 -0
  21. data/spec/cases/oauth_spec.rb +409 -0
  22. data/spec/cases/realtime_updates_spec.rb +184 -0
  23. data/spec/cases/rest_api_spec.rb +25 -0
  24. data/spec/{koala/test_users/test_users_tests.rb → cases/test_users_spec.rb} +78 -72
  25. data/spec/cases/uploadable_io_spec.rb +151 -0
  26. data/spec/fixtures/beach.jpg +0 -0
  27. data/spec/{facebook_data.yml → fixtures/facebook_data.yml} +13 -9
  28. data/spec/{mock_facebook_responses.yml → fixtures/mock_facebook_responses.yml} +314 -289
  29. data/spec/spec_helper.rb +18 -0
  30. data/spec/support/graph_api_shared_examples.rb +424 -0
  31. data/spec/{koala → support}/live_testing_data_helper.rb +39 -42
  32. data/spec/{mock_http_service.rb → support/mock_http_service.rb} +94 -81
  33. data/spec/support/rest_api_shared_examples.rb +161 -0
  34. data/spec/support/setup_mocks_or_live.rb +52 -0
  35. data/spec/support/uploadable_io_shared_examples.rb +76 -0
  36. metadata +127 -43
  37. data/init.rb +0 -2
  38. data/spec/koala/api_base_tests.rb +0 -102
  39. data/spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb +0 -10
  40. data/spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb +0 -11
  41. data/spec/koala/graph_api/graph_api_no_access_token_tests.rb +0 -114
  42. data/spec/koala/graph_api/graph_api_with_access_token_tests.rb +0 -150
  43. data/spec/koala/graph_api/graph_collection_tests.rb +0 -104
  44. data/spec/koala/net_http_service_tests.rb +0 -186
  45. data/spec/koala/oauth/oauth_tests.rb +0 -438
  46. data/spec/koala/realtime_updates/realtime_updates_tests.rb +0 -187
  47. data/spec/koala/rest_api/rest_api_no_access_token_tests.rb +0 -94
  48. data/spec/koala/rest_api/rest_api_with_access_token_tests.rb +0 -36
  49. data/spec/koala_spec.rb +0 -18
  50. data/spec/koala_spec_helper.rb +0 -48
  51. 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