koala 1.0.0.beta2.1 → 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.
Files changed (50) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +6 -1
  3. data/Gemfile +3 -0
  4. data/Rakefile +13 -14
  5. data/koala.gemspec +35 -20
  6. data/lib/koala.rb +8 -17
  7. data/lib/koala/graph_api.rb +2 -2
  8. data/lib/koala/http_services.rb +32 -27
  9. data/lib/koala/test_users.rb +4 -4
  10. data/lib/koala/uploadable_io.rb +1 -1
  11. data/spec/cases/api_base_spec.rb +101 -0
  12. data/spec/cases/graph_and_rest_api_spec.rb +31 -0
  13. data/spec/cases/graph_api_spec.rb +25 -0
  14. data/spec/{koala/http_services/http_service_tests.rb → cases/http_services/http_service_spec.rb} +8 -5
  15. data/spec/cases/http_services/net_http_service_spec.rb +350 -0
  16. data/spec/cases/http_services/typhoeus_service_spec.rb +144 -0
  17. data/spec/cases/oauth_spec.rb +374 -0
  18. data/spec/cases/realtime_updates_spec.rb +184 -0
  19. data/spec/cases/rest_api_spec.rb +25 -0
  20. data/spec/{koala/test_users/test_users_tests.rb → cases/test_users_spec.rb} +34 -29
  21. data/spec/cases/uploadable_io_spec.rb +151 -0
  22. data/spec/{koala/assets → fixtures}/beach.jpg +0 -0
  23. data/spec/{facebook_data.yml → fixtures/facebook_data.yml} +5 -5
  24. data/spec/{mock_facebook_responses.yml → fixtures/mock_facebook_responses.yml} +311 -311
  25. data/spec/spec_helper.rb +18 -0
  26. data/spec/support/graph_api_shared_examples.rb +424 -0
  27. data/spec/{koala → support}/live_testing_data_helper.rb +39 -42
  28. data/spec/{mock_http_service.rb → support/mock_http_service.rb} +94 -94
  29. data/spec/{koala/rest_api/rest_api_tests.rb → support/rest_api_shared_examples.rb} +43 -0
  30. data/spec/support/setup_mocks_or_live.rb +52 -0
  31. data/spec/support/uploadable_io_shared_examples.rb +76 -0
  32. metadata +109 -53
  33. data/init.rb +0 -2
  34. data/spec/koala/api_base_tests.rb +0 -102
  35. data/spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb +0 -14
  36. data/spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb +0 -16
  37. data/spec/koala/graph_api/graph_api_no_access_token_tests.rb +0 -65
  38. data/spec/koala/graph_api/graph_api_tests.rb +0 -85
  39. data/spec/koala/graph_api/graph_api_with_access_token_tests.rb +0 -194
  40. data/spec/koala/graph_api/graph_collection_tests.rb +0 -104
  41. data/spec/koala/http_services/net_http_service_tests.rb +0 -339
  42. data/spec/koala/http_services/typhoeus_service_tests.rb +0 -162
  43. data/spec/koala/oauth/oauth_tests.rb +0 -372
  44. data/spec/koala/realtime_updates/realtime_updates_tests.rb +0 -187
  45. data/spec/koala/rest_api/rest_api_no_access_token_tests.rb +0 -25
  46. data/spec/koala/rest_api/rest_api_with_access_token_tests.rb +0 -38
  47. data/spec/koala/uploadable_io/uploadable_io_tests.rb +0 -246
  48. data/spec/koala_spec.rb +0 -18
  49. data/spec/koala_spec_helper.rb +0 -74
  50. data/spec/koala_spec_without_mocks.rb +0 -19
data/init.rb DELETED
@@ -1,2 +0,0 @@
1
- # init.rb
2
- require 'koala'
@@ -1,102 +0,0 @@
1
- class ApiBaseTests < Test::Unit::TestCase
2
-
3
- describe "Koala API base class" do
4
- before(:each) do
5
- @service = Koala::Facebook::API.new
6
- end
7
-
8
- it "should not include an access token if none was given" do
9
- Koala.should_receive(:make_request).with(
10
- anything,
11
- hash_not_including('access_token' => 1),
12
- anything,
13
- anything
14
- ).and_return(Koala::Response.new(200, "", ""))
15
-
16
- @service.api('anything')
17
- end
18
-
19
- it "should include an access token if given" do
20
- token = 'adfadf'
21
- service = Koala::Facebook::API.new token
22
-
23
- Koala.should_receive(:make_request).with(
24
- anything,
25
- hash_including('access_token' => token),
26
- anything,
27
- anything
28
- ).and_return(Koala::Response.new(200, "", ""))
29
-
30
- service.api('anything')
31
- end
32
-
33
- it "should have an attr_reader for access token" do
34
- token = 'adfadf'
35
- service = Koala::Facebook::API.new token
36
- service.access_token.should == token
37
- end
38
-
39
- it "should get the attribute of a Koala::Response given by the http_component parameter" do
40
- http_component = :method_name
41
-
42
- response = mock('Mock KoalaResponse', :body => '', :status => 200)
43
- response.should_receive(http_component).and_return('')
44
-
45
- Koala.stub(:make_request).and_return(response)
46
-
47
- @service.api('anything', 'get', {}, :http_component => http_component)
48
- end
49
-
50
- it "should return the body of the request as JSON if no http_component is given" do
51
- response = stub('response', :body => 'body', :status => 200)
52
- Koala.stub(:make_request).and_return(response)
53
-
54
- json_body = mock('JSON body')
55
- JSON.stub(:parse).and_return([json_body])
56
-
57
- @service.api('anything').should == json_body
58
- end
59
-
60
- it "should execute a block with the response body if passed one" do
61
- body = '{}'
62
- Koala.stub(:make_request).and_return(Koala::Response.new(200, body, {}))
63
-
64
- yield_test = mock('Yield Tester')
65
- yield_test.should_receive(:pass)
66
-
67
- @service.api('anything') do |arg|
68
- yield_test.pass
69
- arg.should == JSON.parse(body)
70
- end
71
- end
72
-
73
- it "should raise an API error if the HTTP response code is greater than or equal to 500" do
74
- Koala.stub(:make_request).and_return(Koala::Response.new(500, 'response body', {}))
75
-
76
- lambda { @service.api('anything') }.should raise_exception(Koala::Facebook::APIError)
77
- end
78
-
79
- it "should handle rogue true/false as responses" do
80
- Koala.should_receive(:make_request).and_return(Koala::Response.new(200, 'true', {}))
81
- @service.api('anything').should be_true
82
-
83
- Koala.should_receive(:make_request).and_return(Koala::Response.new(200, 'false', {}))
84
- @service.api('anything').should be_false
85
- end
86
-
87
- describe "with regard to leading slashes" do
88
- it "should add a leading / to the path if not present" do
89
- path = "anything"
90
- Koala.should_receive(:make_request).with("/#{path}", anything, anything, anything).and_return(Koala::Response.new(200, 'true', {}))
91
- @service.api(path)
92
- end
93
-
94
- it "shouldn't change the path if a leading / is present" do
95
- path = "/anything"
96
- Koala.should_receive(:make_request).with(path, anything, anything, anything).and_return(Koala::Response.new(200, 'true', {}))
97
- @service.api(path)
98
- end
99
- end
100
-
101
- end
102
- end
@@ -1,14 +0,0 @@
1
- class GraphAndRestAPINoTokenTests < Test::Unit::TestCase
2
- describe "Koala GraphAndRestAPI without an access token" do
3
- before(:each) do
4
- @api = Koala::Facebook::GraphAndRestAPI.new
5
- end
6
-
7
- it_should_behave_like "Koala RestAPI"
8
- it_should_behave_like "Koala RestAPI without an access token"
9
-
10
- it_should_behave_like "Koala GraphAPI"
11
- it_should_behave_like "Koala GraphAPI without an access token"
12
- it_should_behave_like "Koala GraphAPI with GraphCollection"
13
- end
14
- end
@@ -1,16 +0,0 @@
1
- class GraphAndRestAPIWithTokenTests < Test::Unit::TestCase
2
- describe "Koala GraphAndRestAPI without an access token" do
3
- include LiveTestingDataHelper
4
-
5
- before(:each) do
6
- @api = Koala::Facebook::GraphAndRestAPI.new(@token)
7
- end
8
-
9
- it_should_behave_like "Koala RestAPI"
10
- it_should_behave_like "Koala RestAPI with an access token"
11
-
12
- it_should_behave_like "Koala GraphAPI"
13
- it_should_behave_like "Koala GraphAPI with an access token"
14
- it_should_behave_like "Koala GraphAPI with GraphCollection"
15
- end
16
- end
@@ -1,65 +0,0 @@
1
- shared_examples_for "Koala GraphAPI without an access token" do
2
-
3
- it "should not get private data about a user" do
4
- result = @api.get_object("koppel")
5
- # updated_time should be a pretty fixed test case
6
- result["updated_time"].should be_nil
7
- end
8
-
9
- it "should not be able to get data about 'me'" do
10
- lambda { @api.get_object("me") }.should raise_error(Koala::Facebook::APIError)
11
- end
12
-
13
- it "shouldn't be able to access connections from users" do
14
- lambda { @api.get_connections("lukeshepard", "likes") }.should raise_error(Koala::Facebook::APIError)
15
- end
16
-
17
- it "should not be able to put an object" do
18
- lambda { @result = @api.put_object("lukeshepard", "feed", :message => "Hello, world") }.should raise_error(Koala::Facebook::APIError)
19
- puts "Error! Object #{@result.inspect} somehow put onto Luke Shepard's wall!" if @result
20
- end
21
-
22
- # these are not strictly necessary as the other put methods resolve to put_object, but are here for completeness
23
- it "should not be able to post to a feed" do
24
- (lambda do
25
- attachment = {:name => "OAuth Playground", :link => "http://www.oauth.twoalex.com/"}
26
- @result = @api.put_wall_post("Hello, world", attachment, "contextoptional")
27
- end).should raise_error(Koala::Facebook::APIError)
28
- puts "Error! Object #{@result.inspect} somehow put onto Context Optional's wall!" if @result
29
- end
30
-
31
- it "should not be able to comment on an object" do
32
- # random public post on the ContextOptional wall
33
- lambda { @result = @api.put_comment("7204941866_119776748033392", "The hackathon was great!") }.should raise_error(Koala::Facebook::APIError)
34
- puts "Error! Object #{@result.inspect} somehow commented on post 7204941866_119776748033392!" if @result
35
- end
36
-
37
- it "should not be able to like an object" do
38
- lambda { @api.put_like("7204941866_119776748033392") }.should raise_error(Koala::Facebook::APIError)
39
- end
40
-
41
- # DELETE
42
- it "should not be able to delete posts" do
43
- # test post on the Ruby SDK Test application
44
- lambda { @result = @api.delete_object("115349521819193_113815981982767") }.should raise_error(Koala::Facebook::APIError)
45
- end
46
-
47
- it "should not be able to delete a like" do
48
- lambda { @api.delete_like("7204941866_119776748033392") }.should raise_error(Koala::Facebook::APIError)
49
- end
50
- end
51
-
52
- class FacebookNoAccessTokenTests < Test::Unit::TestCase
53
- describe "Koala GraphAPI without an access token" do
54
- include LiveTestingDataHelper
55
-
56
- before :each do
57
- @api = Koala::Facebook::GraphAPI.new
58
- end
59
-
60
- it_should_behave_like "Koala GraphAPI"
61
- it_should_behave_like "Koala GraphAPI without an access token"
62
- it_should_behave_like "Koala GraphAPI with GraphCollection"
63
-
64
- end
65
- end
@@ -1,85 +0,0 @@
1
- shared_examples_for "Koala GraphAPI" do
2
- # all Graph API instances should pass these tests, regardless of configuration
3
-
4
- # API
5
- it "should never use the rest api server" do
6
- Koala.should_receive(:make_request).with(
7
- anything,
8
- anything,
9
- anything,
10
- hash_not_including(:rest_api => true)
11
- ).and_return(Koala::Response.new(200, "", {}))
12
-
13
- @api.api("anything")
14
- end
15
-
16
- # GRAPH CALL
17
- describe "graph_call" do
18
- it "should pass all arguments to the api method" do
19
- args = ["koppel", {}, "get", {:a => :b}]
20
-
21
- @api.should_receive(:api).with(*args)
22
-
23
- @api.graph_call(*args)
24
- end
25
-
26
- it "should throw an APIError if the result hash has an error key" do
27
- Koala.stub(:make_request).and_return(Koala::Response.new(500, {"error" => "An error occurred!"}, {}))
28
- lambda { @api.graph_call("koppel", {}) }.should raise_exception(Koala::Facebook::APIError)
29
- end
30
- end
31
-
32
- # SEARCH
33
- it "should be able to search" do
34
- result = @api.search("facebook")
35
- result.length.should be_an(Integer)
36
- end
37
-
38
- # DATA
39
- # access public info
40
-
41
- # get_object
42
- it "should get public data about a user" do
43
- result = @api.get_object("koppel")
44
- # the results should have an ID and a name, among other things
45
- (result["id"] && result["name"]).should_not be_nil
46
- end
47
-
48
- it "should get public data about a Page" do
49
- result = @api.get_object("contextoptional")
50
- # the results should have an ID and a name, among other things
51
- (result["id"] && result["name"]).should
52
- end
53
-
54
- it "should be able to get multiple objects" do
55
- results = @api.get_objects(["contextoptional", "naitik"])
56
- results.length.should == 2
57
- end
58
-
59
- it "should be able to access a user's picture" do
60
- @api.get_picture("chris.baclig").should =~ /http\:\/\//
61
- end
62
-
63
- it "should be able to access a user's picture, given a picture type" do
64
- @api.get_picture("chris.baclig", {:type => 'large'}).should =~ /^http\:\/\//
65
- end
66
-
67
- it "should be able to access connections from public Pages" do
68
- result = @api.get_connections("contextoptional", "photos")
69
- result.should be_a(Array)
70
- end
71
-
72
- # SEARCH
73
- it "should be able to search" do
74
- result = @api.search("facebook")
75
- result.length.should be_an(Integer)
76
- end
77
-
78
- # PAGING THROUGH COLLECTIONS
79
- # see also graph_collection_tests
80
- it "should make a request for a page when provided a specific set of page params" do
81
- query = [1, 2]
82
- @api.should_receive(:graph_call).with(*query)
83
- @api.get_page(query)
84
- end
85
- end
@@ -1,194 +0,0 @@
1
- shared_examples_for "Koala GraphAPI with an access token" do
2
-
3
- it "should get private data about a user" do
4
- result = @api.get_object("koppel")
5
- # updated_time should be a pretty fixed test case
6
- result["updated_time"].should_not be_nil
7
- end
8
-
9
- it "should get data about 'me'" do
10
- result = @api.get_object("me")
11
- result["updated_time"].should
12
- end
13
-
14
- it "should be able to get multiple objects" do
15
- result = @api.get_objects(["contextoptional", "naitik"])
16
- result.length.should == 2
17
- end
18
- it "should be able to access connections from users" do
19
- result = @api.get_connections("lukeshepard", "likes")
20
- result.length.should > 0
21
- end
22
-
23
- # PUT
24
- it "should be able to write an object to the graph" do
25
- result = @api.put_wall_post("Hello, world, from the test suite!")
26
- @temporary_object_id = result["id"]
27
- @temporary_object_id.should_not be_nil
28
- end
29
-
30
- # DELETE
31
- it "should be able to delete posts" do
32
- result = @api.put_wall_post("Hello, world, from the test suite delete method!")
33
- object_id_to_delete = result["id"]
34
- delete_result = @api.delete_object(object_id_to_delete)
35
- delete_result.should == true
36
- end
37
-
38
- it "should be able to delete likes" do
39
- result = @api.put_wall_post("Hello, world, from the test suite delete method!")
40
- @temporary_object_id = result["id"]
41
- @api.put_like(@temporary_object_id)
42
- delete_like_result = @api.delete_like(@temporary_object_id)
43
- delete_like_result.should == true
44
- end
45
-
46
- # additional put tests
47
- it "should be able to verify messages posted to a wall" do
48
- message = "the cats are asleep"
49
- put_result = @api.put_wall_post(message)
50
- @temporary_object_id = put_result["id"]
51
- get_result = @api.get_object(@temporary_object_id)
52
-
53
- # make sure the message we sent is the message that got posted
54
- get_result["message"].should == message
55
- end
56
-
57
- it "should be able to post a message with an attachment to a feed" do
58
- result = @api.put_wall_post("Hello, world, from the test suite again!", {:name => "OAuth Playground", :link => "http://oauth.twoalex.com/"})
59
- @temporary_object_id = result["id"]
60
- @temporary_object_id.should_not be_nil
61
- end
62
-
63
- it "should be able to post photos to the user's wall with an open file object" do
64
- content_type = "image/jpg"
65
- file = File.open(File.join(File.dirname(__FILE__), "..", "assets", "beach.jpg"))
66
-
67
- result = @api.put_picture(file, content_type)
68
- @temporary_object_id = result["id"]
69
- @temporary_object_id.should_not be_nil
70
- end
71
-
72
- it "should be able to post photos to the user's wall without an open file object" do
73
- content_type = "image/jpg",
74
- file_path = File.join(File.dirname(__FILE__), "..", "assets", "beach.jpg")
75
-
76
- result = @api.put_picture(file_path, content_type)
77
- @temporary_object_id = result["id"]
78
- @temporary_object_id.should_not be_nil
79
- end
80
-
81
- it "should be able to verify a photo posted to a user's wall" do
82
- content_type = "image/jpg",
83
- file_path = File.join(File.dirname(__FILE__), "..", "assets", "beach.jpg")
84
-
85
- expected_message = "This is the test message"
86
-
87
- result = @api.put_picture(file_path, content_type, :message => expected_message)
88
- @temporary_object_id = result["id"]
89
- @temporary_object_id.should_not be_nil
90
-
91
- get_result = @api.get_object(@temporary_object_id)
92
- get_result["name"].should == expected_message
93
- end
94
-
95
- it "should be able to verify a message with an attachment posted to a feed" do
96
- attachment = {"name" => "OAuth Playground", "link" => "http://oauth.twoalex.com/"}
97
- result = @api.put_wall_post("Hello, world, from the test suite again!", attachment)
98
- @temporary_object_id = result["id"]
99
- get_result = @api.get_object(@temporary_object_id)
100
-
101
- # make sure the result we fetch includes all the parameters we sent
102
- it_matches = attachment.inject(true) {|valid, param| valid && (get_result[param[0]] == attachment[param[0]])}
103
- it_matches.should == true
104
- end
105
-
106
- it "should be able to comment on an object" do
107
- result = @api.put_wall_post("Hello, world, from the test suite, testing comments!")
108
- @temporary_object_id = result["id"]
109
-
110
- # this will be deleted when the post gets deleted
111
- comment_result = @api.put_comment(@temporary_object_id, "it's my comment!")
112
- comment_result.should_not be_nil
113
- end
114
-
115
- it "should be able to verify a comment posted about an object" do
116
- message_text = "Hello, world, from the test suite, testing comments!"
117
- result = @api.put_wall_post(message_text)
118
- @temporary_object_id = result["id"]
119
-
120
- # this will be deleted when the post gets deleted
121
- comment_text = "it's my comment!"
122
- comment_result = @api.put_comment(@temporary_object_id, comment_text)
123
- get_result = @api.get_object(comment_result["id"])
124
-
125
- # make sure the text of the comment matches what we sent
126
- get_result["message"].should == comment_text
127
- end
128
-
129
- it "should be able to like an object" do
130
- result = @api.put_wall_post("Hello, world, from the test suite, testing comments!")
131
- @temporary_object_id = result["id"]
132
- like_result = @api.put_like(@temporary_object_id)
133
- like_result.should be_true
134
- end
135
-
136
-
137
- # test all methods to make sure they pass data through to the API
138
- # we run the tests here (rather than in the common shared example group)
139
- # since some require access tokens
140
- describe "HTTP options" do
141
- # Each of the below methods should take an options hash as their last argument
142
- # ideally we'd use introspection to determine how many arguments a method has
143
- # but some methods require specially formatted arguments for processing
144
- # (and anyway, Ruby 1.8's arity method fails (for this) for methods w/ 2+ optional arguments)
145
- # (Ruby 1.9's parameters method is perfect, but only in 1.9)
146
- # so we have to double-document
147
- {
148
- :get_object => 3, :put_object => 4, :delete_object => 2,
149
- :get_connections => 4, :put_connections => 4, :delete_connections => 4,
150
- :put_wall_post => 4,
151
- :put_comment => 3,
152
- :put_like => 2, :delete_like => 2,
153
- :search => 3,
154
- # methods that have special arguments
155
- :put_picture => ["x.jpg", "image/jpg", {}, "me"],
156
- :get_objects => [["x"], {}]
157
- }.each_pair do |method_name, params|
158
- it "should pass http options through for #{method_name}" do
159
- options = {:a => 2}
160
- # graph call should ultimately receive options as the fourth argument
161
- @api.should_receive(:graph_call).with(anything, anything, anything, options)
162
-
163
- # if we supply args, use them (since some methods process params)
164
- # the method should receive as args n-1 anythings and then options
165
- args = (params.is_a?(Integer) ? ([{}] * (params - 1)) : params) + [options]
166
-
167
- @api.send(method_name, *args)
168
- end
169
- end
170
-
171
- # also test get_picture, which merges a parameter into options
172
- it "should pass http options through for get_picture" do
173
- options = {:a => 2}
174
- # graph call should ultimately receive options as the fourth argument
175
- @api.should_receive(:graph_call).with(anything, anything, anything, hash_including(options)).and_return({})
176
- @api.send(:get_picture, "x", {}, options)
177
- end
178
- end
179
- end
180
-
181
- class FacebookWithAccessTokenTests < Test::Unit::TestCase
182
- describe "Koala GraphAPI with an access token" do
183
- include LiveTestingDataHelper
184
-
185
- before :each do
186
- @api = Koala::Facebook::GraphAPI.new(@token)
187
- end
188
-
189
- it_should_behave_like "Koala GraphAPI"
190
- it_should_behave_like "Koala GraphAPI with an access token"
191
- it_should_behave_like "Koala GraphAPI with GraphCollection"
192
-
193
- end
194
- end