koala 1.0.0.beta2.1 → 1.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
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