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
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Koala::Facebook::RestAPI" do
4
+
5
+ context "without an access token" do
6
+ before :each do
7
+ @api = Koala::Facebook::RestAPI.new
8
+ end
9
+
10
+ it_should_behave_like "Koala RestAPI"
11
+ it_should_behave_like "Koala RestAPI without an access token"
12
+ end
13
+
14
+ context "with an access token" do
15
+ include LiveTestingDataHelper
16
+
17
+ before :each do
18
+ @api = Koala::Facebook::RestAPI.new(@token)
19
+ end
20
+
21
+ it_should_behave_like "Koala RestAPI"
22
+ it_should_behave_like "Koala RestAPI with an access token"
23
+ end
24
+
25
+ end
@@ -1,7 +1,7 @@
1
- class TestUsersTests < Test::Unit::TestCase
2
- include Koala
1
+ require 'spec_helper'
3
2
 
4
- describe "Koala TestUsers with access token" do
3
+ describe "Koala::Facebook::TestUsers" do
4
+ context "with access token" do
5
5
  include LiveTestingDataHelper
6
6
 
7
7
  before :all do
@@ -22,28 +22,28 @@ class TestUsersTests < Test::Unit::TestCase
22
22
  describe "when initializing" do
23
23
  # basic initialization
24
24
  it "should initialize properly with an app_id and an app_access_token" do
25
- test_users = Facebook::TestUsers.new(:app_id => @app_id, :app_access_token => @app_access_token)
26
- test_users.should be_a(Facebook::TestUsers)
25
+ test_users = Koala::Facebook::TestUsers.new(:app_id => @app_id, :app_access_token => @app_access_token)
26
+ test_users.should be_a(Koala::Facebook::TestUsers)
27
27
  end
28
28
 
29
29
  # init with secret / fetching the token
30
30
  it "should initialize properly with an app_id and a secret" do
31
- test_users = Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
32
- test_users.should be_a(Facebook::TestUsers)
31
+ test_users = Koala::Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
32
+ test_users.should be_a(Koala::Facebook::TestUsers)
33
33
  end
34
34
 
35
35
  it "should use the OAuth class to fetch a token when provided an app_id and a secret" do
36
- oauth = Facebook::OAuth.new(@app_id, @secret)
36
+ oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
37
37
  token = oauth.get_app_access_token
38
38
  oauth.should_receive(:get_app_access_token).and_return(token)
39
- Facebook::OAuth.should_receive(:new).with(@app_id, @secret).and_return(oauth)
40
- test_users = Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
39
+ Koala::Facebook::OAuth.should_receive(:new).with(@app_id, @secret).and_return(oauth)
40
+ test_users = Koala::Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
41
41
  end
42
42
  end
43
43
 
44
44
  describe "when used without network" do
45
45
  before :each do
46
- @test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
46
+ @test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
47
47
  end
48
48
 
49
49
  # TEST USER MANAGEMENT
@@ -62,12 +62,12 @@ class TestUsersTests < Test::Unit::TestCase
62
62
  end
63
63
 
64
64
  it "should accept permissions as a string" do
65
- @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything)
65
+ @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything, anything)
66
66
  result = @test_users.create(true, "read_stream,publish_stream")
67
67
  end
68
68
 
69
69
  it "should accept permissions as an array" do
70
- @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything)
70
+ @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything, anything)
71
71
  result = @test_users.create(true, ["read_stream", "publish_stream"])
72
72
  end
73
73
 
@@ -78,6 +78,18 @@ class TestUsersTests < Test::Unit::TestCase
78
78
  (result["id"] && result["access_token"] && result["login_url"]).should
79
79
  end
80
80
 
81
+ it "lets you specify other graph arguments, like uid and access token" do
82
+ args = {:uid => "some test user ID", :owner_access_token => "some owner access token"}
83
+ @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including(args), anything, anything)
84
+ @test_users.create(true, nil, args)
85
+ end
86
+
87
+ it "lets you specify http options that get passed through to the graph call" do
88
+ options = {:some_http_option => true}
89
+ @test_users.graph_api.should_receive(:graph_call).with(anything, anything, anything, options)
90
+ @test_users.create(true, nil, {}, options)
91
+ end
92
+
81
93
  describe "with a user to delete" do
82
94
  before :each do
83
95
  @user1 = @test_users.create(true, "read_stream")
@@ -85,10 +97,8 @@ class TestUsersTests < Test::Unit::TestCase
85
97
  end
86
98
 
87
99
  after :each do
88
- print "\nCleaning up test users..."
89
100
  @test_users.delete(@user1) if @user1
90
101
  @test_users.delete(@user2) if @user2
91
- puts "done."
92
102
  end
93
103
 
94
104
  it "should delete a user by id" do
@@ -133,22 +143,22 @@ class TestUsersTests < Test::Unit::TestCase
133
143
  (first_user["id"] && first_user["access_token"] && first_user["login_url"]).should
134
144
  (second_user["id"] && second_user["access_token"] && second_user["login_url"]).should
135
145
  end
136
-
146
+
137
147
  it "should make two users into friends with string hashes" do
138
148
  result = @test_users.befriend(@user1, @user2)
139
149
  result.should be_true
140
150
  end
141
-
151
+
142
152
  it "should make two users into friends with symbol hashes" do
143
153
  new_user_1 = {}
144
154
  @user1.each_pair {|k, v| new_user_1[k.to_sym] = v}
145
155
  new_user_2 = {}
146
156
  @user2.each_pair {|k, v| new_user_2[k.to_sym] = v}
147
-
157
+
148
158
  result = @test_users.befriend(new_user_1, new_user_2)
149
159
  result.should be_true
150
160
  end
151
-
161
+
152
162
  it "should not accept user IDs anymore" do
153
163
  lambda { @test_users.befriend(@user1["id"], @user2["id"]) }.should raise_exception
154
164
  end
@@ -158,7 +168,7 @@ class TestUsersTests < Test::Unit::TestCase
158
168
 
159
169
  describe "when creating a network of friends" do
160
170
  before :each do
161
- @test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
171
+ @test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
162
172
  @network = []
163
173
 
164
174
  if @is_mock
@@ -174,17 +184,13 @@ class TestUsersTests < Test::Unit::TestCase
174
184
 
175
185
  describe "tests that create users" do
176
186
  before :each do
177
- print "\nCleaning up test user network..."
178
- test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
187
+ test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
179
188
  test_users.delete_all
180
- puts "done!"
181
189
  end
182
190
 
183
191
  after :each do
184
- print "\nCleaning up test user network..."
185
- test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
192
+ test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
186
193
  test_users.delete_all
187
- puts "done!"
188
194
  end
189
195
 
190
196
  it "should create a 5 person network" do
@@ -211,6 +217,5 @@ class TestUsersTests < Test::Unit::TestCase
211
217
  end
212
218
 
213
219
  end # when creating network
214
-
215
- end # describe Koala TestUsers
216
- end # class
220
+ end
221
+ end # describe Koala TestUsers
@@ -0,0 +1,151 @@
1
+ # fake MIME::Types
2
+ module Koala::MIME
3
+ module Types
4
+ def self.type_for(type)
5
+ # this should be faked out in tests
6
+ nil
7
+ end
8
+ end
9
+ end
10
+
11
+ describe "Koala::UploadableIO" do
12
+ describe "the constructor" do
13
+ describe "when given a file path" do
14
+ before(:each) do
15
+ @koala_io_params = [File.open(BEACH_BALL_PATH)]
16
+ end
17
+
18
+ describe "and a content type" do
19
+ before :each do
20
+ @koala_io_params.concat([stub("image/jpg")])
21
+ end
22
+
23
+ it "should return an UploadIO with the same file path" do
24
+ stub_path = @koala_io_params[0] = "/stub/path/to/file"
25
+ Koala::UploadableIO.new(*@koala_io_params).io_or_path.should == stub_path
26
+ end
27
+
28
+ it "should return an UploadIO with the same content type" do
29
+ stub_type = @koala_io_params[1] = stub('Content Type')
30
+ Koala::UploadableIO.new(*@koala_io_params).content_type.should == stub_type
31
+ end
32
+ end
33
+
34
+ describe "and no content type" do
35
+ it_should_behave_like "determining a mime type"
36
+ end
37
+ end
38
+
39
+ describe "when given a File object" do
40
+ before(:each) do
41
+ @koala_io_params = [File.open(BEACH_BALL_PATH)]
42
+ end
43
+
44
+ describe "and a content type" do
45
+ before :each do
46
+ @koala_io_params.concat(["image/jpg"])
47
+ end
48
+
49
+ it "should return an UploadIO with the same io" do
50
+ Koala::UploadableIO.new(*@koala_io_params).io_or_path.should == @koala_io_params[0]
51
+ end
52
+
53
+ it "should return an UplaodIO with the same content_type" do
54
+ content_stub = @koala_io_params[1] = stub('Content Type')
55
+ Koala::UploadableIO.new(*@koala_io_params).content_type.should == content_stub
56
+ end
57
+ end
58
+
59
+ describe "and no content type" do
60
+ it_should_behave_like "determining a mime type"
61
+ end
62
+ end
63
+
64
+ describe "when given a Rails 3 ActionDispatch::Http::UploadedFile" do
65
+ before(:each) do
66
+ @tempfile = stub('Tempfile', :path => "foo")
67
+ @uploaded_file = stub('ActionDispatch::Http::UploadedFile',
68
+ :content_type => true,
69
+ :tempfile => @tempfile
70
+ )
71
+
72
+ @tempfile.stub!(:respond_to?).with(:path).and_return(true)
73
+ end
74
+
75
+ it "should get the content type via the content_type method" do
76
+ expected_content_type = stub('Content Type')
77
+ @uploaded_file.should_receive(:content_type).and_return(expected_content_type)
78
+ Koala::UploadableIO.new(@uploaded_file).content_type.should == expected_content_type
79
+ end
80
+
81
+ it "should get the path from the tempfile associated with the UploadedFile" do
82
+ expected_path = stub('Tempfile')
83
+ @tempfile.should_receive(:path).and_return(expected_path)
84
+ Koala::UploadableIO.new(@uploaded_file).io_or_path.should == expected_path
85
+ end
86
+ end
87
+
88
+ describe "when given a Sinatra file parameter hash" do
89
+ before(:each) do
90
+ @file_hash = {
91
+ :type => "type",
92
+ :tempfile => "Tempfile"
93
+ }
94
+ end
95
+
96
+ it "should get the content type from the :type key" do
97
+ expected_content_type = stub('Content Type')
98
+ @file_hash[:type] = expected_content_type
99
+
100
+ uploadable = Koala::UploadableIO.new(@file_hash)
101
+ uploadable.content_type.should == expected_content_type
102
+ end
103
+
104
+ it "should get the io_or_path from the :tempfile key" do
105
+ expected_file = stub('File')
106
+ @file_hash[:tempfile] = expected_file
107
+
108
+ uploadable = Koala::UploadableIO.new(@file_hash)
109
+ uploadable.io_or_path.should == expected_file
110
+ end
111
+ end
112
+
113
+ describe "for files with with recognizable MIME types" do
114
+ # what that means is tested below
115
+ it "should accept a file object alone" do
116
+ params = [BEACH_BALL_PATH]
117
+ lambda { Koala::UploadableIO.new(*params) }.should_not raise_exception(Koala::KoalaError)
118
+ end
119
+
120
+ it "should accept a file path alone" do
121
+ params = [BEACH_BALL_PATH]
122
+ lambda { Koala::UploadableIO.new(*params) }.should_not raise_exception(Koala::KoalaError)
123
+ end
124
+ end
125
+ end
126
+
127
+ describe "getting an UploadableIO" do
128
+ before(:each) do
129
+ @upload_io = stub("UploadIO")
130
+ UploadIO.stub!(:new).with(anything, anything, anything).and_return(@upload_io)
131
+ end
132
+
133
+ it "should call the constructor with the content type, file name, and a dummy file name" do
134
+ UploadIO.should_receive(:new).with(BEACH_BALL_PATH, "content/type", anything).and_return(@upload_io)
135
+ Koala::UploadableIO.new(BEACH_BALL_PATH, "content/type").to_upload_io.should == @upload_io
136
+ end
137
+ end
138
+
139
+ describe "getting a file" do
140
+ it "should return the File if initialized with a file" do
141
+ f = File.new(BEACH_BALL_PATH)
142
+ Koala::UploadableIO.new(f).to_file.should == f
143
+ end
144
+
145
+ it "should open up and return a file corresponding to the path if io_or_path is a path" do
146
+ result = stub("File")
147
+ File.should_receive(:open).with(BEACH_BALL_PATH).and_return(result)
148
+ Koala::UploadableIO.new(BEACH_BALL_PATH).to_file.should == result
149
+ end
150
+ end
151
+ end # describe UploadableIO
File without changes
@@ -5,18 +5,18 @@
5
5
 
6
6
  # You must supply this value yourself to test the GraphAPI class.
7
7
  # Your OAuth token should have publish_stream, read_stream, and user_photos permissions.
8
- oauth_token: 119908831367602|2.SzVOt20se6d7VnLzsG3USg__.3600.1302102000-2905623|Qxhc8NPxIQFKuNOaL1XdYNcztAM
8
+ oauth_token:
9
9
 
10
10
  # for testing the OAuth class
11
11
  # baseline app
12
12
  oauth_test_data:
13
13
  # You must supply this value yourself, since they will expire.
14
- code: 2.SzVOt20se6d7VnLzsG3USg__.3600.1302102000-2905623|Z5x3PcJgROjfj6DOwVQpb714nkQ
14
+ code:
15
15
  # easiest way to get session keys: use multiple test accounts with the Javascript login at http://oauth.twoalex.com
16
- session_key: 2.SzVOt20se6d7VnLzsG3USg__.3600.1302102000-2905623
16
+ session_key:
17
17
  multiple_session_keys:
18
- - 2.SzVOt20se6d7VnLzsG3USg__.3600.1302102000-2905623
19
- - 2.SzVOt20se6d7VnLzsG3USg__.3600.1302102000-2905623
18
+ -
19
+ -
20
20
 
21
21
  # These values will work out of the box
22
22
  app_id: 119908831367602
@@ -1,312 +1,312 @@
1
- # Responses by MockHTTPService are taken directly from
2
- # this file.
3
- #
4
- # Structure
5
- # ----------
6
- #
7
- # path:
8
- # arguments: # sorted by key
9
- # method: # HTTP method (GET, POST, DELETE, etc.)
10
- # with_token:
11
- # no_token:
12
-
13
- # ====== REST API =====
14
- rest_api:
15
-
16
- # -- Stubbed Responses --
17
- /method/fql.query:
18
- query=select first_name from user where uid = 216743:
19
- get:
20
- no_token: '[{"first_name":"Chris"}]'
21
- with_token: '[{"first_name":"Chris"}]'
22
- query=select read_stream from permissions where uid = 216743:
23
- get:
24
- with_token: '[{"read_stream":1}]'
25
- no_token: '{"error_code":104,"error_msg":"Requires valid signature","request_args":[{"key":"method","value":"fql.query"},{"key":"format","value":"json"},{"key":"query","value":"select read_stream from permissions where uid = 216743"}]}'
26
-
27
-
28
- # ====== GRAPH API =====
29
- graph_api:
30
-
31
- # -- Common Responses --
32
-
33
- # Error responses for when a token is required, but not given
34
- token_required_responses: &token_required
35
- no_token: '{"error":{"type":"OAuthAccessTokenException", "message":"An access token is required to request this resource."}}'
36
-
37
- # Common mock item responses
38
- item_deleted: &item_deleted
39
- delete:
40
- with_token: 'true'
41
-
42
- # OAuth error response
43
- oauth_error: &oauth_error
44
- no_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
45
-
46
- # Subscription error response
47
- verification_error: &verification_error
48
- with_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
49
-
50
- test_user_no_perms: &test_user_no_perms
51
- post:
52
- with_token: '{"id": "777777777", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
53
-
54
- test_user_befriended: &test_user_befriended
55
- post:
56
- with_token: 'true'
57
-
58
- # -- Stubbed Responses --
59
- root:
60
- ids=contextoptional,naitik:
61
- get:
62
- with_token: '[{}, {}]'
63
- no_token: '[{}, {}]'
64
- /me:
65
- no_args:
66
- get:
67
- <<: *token_required
68
- with_token: '{"updated_time": 1}'
69
- fields=id:
70
- get:
71
- with_token: '{"id": "216743"}'
72
-
73
- /me/feed:
74
- message=Hello, world, from the test suite!:
75
- post:
76
- with_token: '{"id": "MOCK_FEED_ITEM"}'
77
- message=Hello, world, from the test suite, testing comments!:
78
- post:
79
- with_token: '{"id": "MOCK_FEED_ITEM"}'
80
- message=the cats are asleep:
81
- post:
82
- with_token: '{"id": "FEED_ITEM_CATS"}'
83
- message=Hello, world, from the test suite delete method!:
84
- post:
85
- with_token: '{"id": "FEED_ITEM_DELETE"}'
86
- link=http://oauth.twoalex.com/&message=Hello, world, from the test suite again!&name=OAuth Playground:
87
- post:
88
- with_token: '{"id": "FEED_ITEM_CONTEXT"}'
89
- /me/photos:
90
- source=[FILE]:
91
- post:
92
- <<: *token_required
93
- with_token: '{"id": "MOCK_PHOTO"}'
94
- message=This is the test message&source=[FILE]:
95
- post:
96
- <<: *token_required
97
- with_token: '{"id": "MOCK_PHOTO"}'
98
- /koppel:
99
- no_args:
100
- get:
101
- with_token: '{"id": 1, "name": 1, "updated_time": 1}'
102
- no_token: '{"id": 1, "name": 1}'
103
-
104
- /contextoptional:
105
- no_args:
106
- get:
107
- with_token: '{"id": 1, "name": 1}'
108
- no_token: '{"id": 1, "name": 1}'
109
-
110
- /contextoptional/photos:
111
- no_args:
112
- get:
113
- with_token: '{"data": [{}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
114
- no_token: '{"data": [{}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
115
-
116
- /lukeshepard/likes:
117
- no_args:
118
- get:
119
- <<: *token_required
120
- with_token: '{"data": [{}]}'
121
-
122
- /chris.baclig/picture:
123
- no_args:
124
- get:
125
- no_token:
126
- code: 302
127
- headers:
128
- Location: http://facebook.com/
129
- with_token:
130
- code: 302
131
- headers:
132
- Location: http://facebook.com/
133
- type=large:
134
- get:
135
- no_token:
136
- code: 302
137
- headers:
138
- Location: http://facebook.com/large
139
- with_token:
140
- code: 302
141
- headers:
142
- Location: http://facebook.com/large
143
-
144
-
145
- /search:
146
- q=facebook:
147
- get:
148
- with_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
149
- no_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
150
- "limit=25&q=facebook&until=2010-09-23T21:17:33+0000":
151
- get:
152
- with_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
153
- no_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
154
-
155
- '/115349521819193_113815981982767':
156
- no_args:
157
- delete:
158
- <<: *token_required
159
-
160
- # -- OAuth responses --
161
- /oauth/access_token:
162
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=<%= OAUTH_CODE %>&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
163
- get:
164
- no_token: access_token=<%= ACCESS_TOKEN %>
165
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=foo&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
166
- get:
167
- <<: *oauth_error
168
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&type=client_cred:
169
- post:
170
- no_token: access_token=<%= ACCESS_TOKEN %>
171
- /oauth/exchange_sessions:
172
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["session_key"] %>&type=client_cred:
173
- post:
174
- no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
175
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["multiple_session_keys"].join(",") %>&type=client_cred:
176
- post:
177
- no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
178
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= ["foo"].concat(OAUTH_DATA["multiple_session_keys"]).join(",") %>&type=client_cred:
179
- post:
180
- no_token: '[null, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
181
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo,bar&type=client_cred:
182
- post:
183
- no_token: '[null, null]'
184
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo&type=client_cred:
185
- post:
186
- no_token: '[null]'
187
-
188
-
189
-
190
- # -- Subscription Responses --
191
- /<%= APP_ID %>/subscriptions:
192
- callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
193
- post:
194
- with_token:
195
- code: 200
196
- callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
197
- post:
198
- with_token: '{"error":{"type":"Exception","message":"(#2200) subscription validation failed"}}'
199
- callback_url=foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
200
- post:
201
- with_token: '{"error":{"type":"Exception","message":"(#100) callback_url URL is not properly formatted"}}'
202
- object=user:
203
- delete:
204
- with_token:
205
- code: 200
206
- object=kittens:
207
- delete:
208
- with_token: '{"error":{"type":"Exception","message":"(#100) Invalid parameter"}}'
209
- no_args:
210
- delete:
211
- with_token:
212
- code: 200
213
- get:
214
- with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
215
-
216
-
217
- callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>:
218
- get:
219
- with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
220
-
221
- # -- Mock Item Responses --
222
-
223
- /MOCK_FEED_ITEM/likes:
224
- no_args:
225
- post:
226
- with_token: '{"id": "MOCK_LIKE"}'
227
-
228
- /MOCK_FEED_ITEM/comments:
229
- message=it's my comment!:
230
- post:
231
- with_token: '{"id": "MOCK_COMMENT"}'
232
-
233
- /MOCK_FEED_ITEM:
234
- no_args:
235
- <<: *item_deleted
236
-
237
- /FEED_ITEM_CONTEXT:
238
- no_args:
239
- <<: *item_deleted
240
- get:
241
- with_token: '{"link":"http://oauth.twoalex.com/", "name": "OAuth Playground"}'
242
-
243
- /FEED_ITEM_CATS:
244
- no_args:
245
- <<: *item_deleted
246
- get:
247
- with_token: '{"message": "the cats are asleep"}'
248
-
249
- /FEED_ITEM_DELETE:
250
- no_args:
251
- <<: *item_deleted
252
-
253
- /FEED_ITEM_DELETE/likes:
254
- no_args:
255
- <<: *item_deleted
256
- post:
257
- with_token: 'true'
258
-
259
- /MOCK_COMMENT:
260
- no_args:
261
- <<: *item_deleted
262
- get:
263
- with_token: "{\"message\": \"it\'s my comment!\"}"
264
- /MOCK_PHOTO:
265
- no_args:
266
- <<: *item_deleted
267
- get:
268
- with_token: "{\"name\": \"This is the test message\"}"
269
-
270
- # -- Mock Test User Responses --
271
- /<%= APP_ID %>/accounts/test-users:
272
- installed=false:
273
- <<: *test_user_no_perms
274
- installed=false&permissions=read_stream:
275
- <<: *test_user_no_perms
276
- installed=true&permissions=read_stream:
277
- post:
278
- with_token: '{"id": "999999999", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
279
- installed=true&permissions=read_stream,user_interests:
280
- post:
281
- with_token: '{"id": "888888888", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
282
- no_args:
283
- get:
284
- with_token: '{"data":[{"id": "999999999", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}, {"id": "888888888", "access_token":"119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "login_url":"https://www.facebook.com/platform/test_account.."}]}'
285
-
286
- /999999999:
287
- no_args:
288
- <<: *item_deleted
289
-
290
- /999999999/friends/888888888:
291
- no_args:
292
- post:
293
- with_token: 'true'
294
-
295
-
296
- /9999999991:
297
- no_args:
298
- delete:
299
- with_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
300
-
301
- /888888888:
302
- no_args:
303
- <<: *item_deleted
304
-
305
- /888888888/friends/999999999:
306
- no_args:
307
- <<: *test_user_befriended
308
-
309
-
310
- /777777777:
311
- no_args:
1
+ # Responses by MockHTTPService are taken directly from
2
+ # this file.
3
+ #
4
+ # Structure
5
+ # ----------
6
+ #
7
+ # path:
8
+ # arguments: # sorted by key
9
+ # method: # HTTP method (GET, POST, DELETE, etc.)
10
+ # with_token:
11
+ # no_token:
12
+
13
+ # ====== REST API =====
14
+ rest_api:
15
+
16
+ # -- Stubbed Responses --
17
+ /method/fql.query:
18
+ query=select first_name from user where uid = 216743:
19
+ get:
20
+ no_token: '[{"first_name":"Chris"}]'
21
+ with_token: '[{"first_name":"Chris"}]'
22
+ query=select read_stream from permissions where uid = 216743:
23
+ get:
24
+ with_token: '[{"read_stream":1}]'
25
+ no_token: '{"error_code":104,"error_msg":"Requires valid signature","request_args":[{"key":"method","value":"fql.query"},{"key":"format","value":"json"},{"key":"query","value":"select read_stream from permissions where uid = 216743"}]}'
26
+
27
+
28
+ # ====== GRAPH API =====
29
+ graph_api:
30
+
31
+ # -- Common Responses --
32
+
33
+ # Error responses for when a token is required, but not given
34
+ token_required_responses: &token_required
35
+ no_token: '{"error":{"type":"OAuthAccessTokenException", "message":"An access token is required to request this resource."}}'
36
+
37
+ # Common mock item responses
38
+ item_deleted: &item_deleted
39
+ delete:
40
+ with_token: 'true'
41
+
42
+ # OAuth error response
43
+ oauth_error: &oauth_error
44
+ no_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
45
+
46
+ # Subscription error response
47
+ verification_error: &verification_error
48
+ with_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
49
+
50
+ test_user_no_perms: &test_user_no_perms
51
+ post:
52
+ with_token: '{"id": "777777777", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
53
+
54
+ test_user_befriended: &test_user_befriended
55
+ post:
56
+ with_token: 'true'
57
+
58
+ # -- Stubbed Responses --
59
+ root:
60
+ ids=contextoptional,naitik:
61
+ get:
62
+ with_token: '[{}, {}]'
63
+ no_token: '[{}, {}]'
64
+ /me:
65
+ no_args:
66
+ get:
67
+ <<: *token_required
68
+ with_token: '{"updated_time": 1}'
69
+ fields=id:
70
+ get:
71
+ with_token: '{"id": "216743"}'
72
+
73
+ /me/feed:
74
+ message=Hello, world, from the test suite!:
75
+ post:
76
+ with_token: '{"id": "MOCK_FEED_ITEM"}'
77
+ message=Hello, world, from the test suite, testing comments!:
78
+ post:
79
+ with_token: '{"id": "MOCK_FEED_ITEM"}'
80
+ message=the cats are asleep:
81
+ post:
82
+ with_token: '{"id": "FEED_ITEM_CATS"}'
83
+ message=Hello, world, from the test suite delete method!:
84
+ post:
85
+ with_token: '{"id": "FEED_ITEM_DELETE"}'
86
+ link=http://oauth.twoalex.com/&message=Hello, world, from the test suite again!&name=OAuth Playground:
87
+ post:
88
+ with_token: '{"id": "FEED_ITEM_CONTEXT"}'
89
+ /me/photos:
90
+ source=[FILE]:
91
+ post:
92
+ <<: *token_required
93
+ with_token: '{"id": "MOCK_PHOTO"}'
94
+ message=This is the test message&source=[FILE]:
95
+ post:
96
+ <<: *token_required
97
+ with_token: '{"id": "MOCK_PHOTO"}'
98
+ /koppel:
99
+ no_args:
100
+ get:
101
+ with_token: '{"id": 1, "name": 1, "updated_time": 1}'
102
+ no_token: '{"id": 1, "name": 1}'
103
+
104
+ /contextoptional:
105
+ no_args:
106
+ get:
107
+ with_token: '{"id": 1, "name": 1}'
108
+ no_token: '{"id": 1, "name": 1}'
109
+
110
+ /contextoptional/photos:
111
+ no_args:
112
+ get:
113
+ with_token: '{"data": [{}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
114
+ no_token: '{"data": [{}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
115
+
116
+ /lukeshepard/likes:
117
+ no_args:
118
+ get:
119
+ <<: *token_required
120
+ with_token: '{"data": [{}]}'
121
+
122
+ /chris.baclig/picture:
123
+ no_args:
124
+ get:
125
+ no_token:
126
+ code: 302
127
+ headers:
128
+ Location: http://facebook.com/
129
+ with_token:
130
+ code: 302
131
+ headers:
132
+ Location: http://facebook.com/
133
+ type=large:
134
+ get:
135
+ no_token:
136
+ code: 302
137
+ headers:
138
+ Location: http://facebook.com/large
139
+ with_token:
140
+ code: 302
141
+ headers:
142
+ Location: http://facebook.com/large
143
+
144
+
145
+ /search:
146
+ q=facebook:
147
+ get:
148
+ with_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
149
+ no_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
150
+ "limit=25&q=facebook&until=2010-09-23T21:17:33+0000":
151
+ get:
152
+ with_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
153
+ no_token: '{"data": [{"id": "507731521_100412693339488"}], "paging": {"previous": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000", "next": "https:\/\/graph.facebook.com\/7204941866\/photos?limit=25&until=2008-09-15T18%3A30%3A25%2B0000"}}'
154
+
155
+ '/115349521819193_113815981982767':
156
+ no_args:
157
+ delete:
158
+ <<: *token_required
159
+
160
+ # -- OAuth responses --
161
+ /oauth/access_token:
162
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=<%= OAUTH_CODE %>&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
163
+ get:
164
+ no_token: access_token=<%= ACCESS_TOKEN %>
165
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=foo&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
166
+ get:
167
+ <<: *oauth_error
168
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&type=client_cred:
169
+ post:
170
+ no_token: access_token=<%= ACCESS_TOKEN %>
171
+ /oauth/exchange_sessions:
172
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["session_key"] %>&type=client_cred:
173
+ post:
174
+ no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
175
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["multiple_session_keys"].join(",") %>&type=client_cred:
176
+ post:
177
+ no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
178
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= ["foo"].concat(OAUTH_DATA["multiple_session_keys"]).join(",") %>&type=client_cred:
179
+ post:
180
+ no_token: '[null, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
181
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo,bar&type=client_cred:
182
+ post:
183
+ no_token: '[null, null]'
184
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo&type=client_cred:
185
+ post:
186
+ no_token: '[null]'
187
+
188
+
189
+
190
+ # -- Subscription Responses --
191
+ /<%= APP_ID %>/subscriptions:
192
+ callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
193
+ post:
194
+ with_token:
195
+ code: 200
196
+ callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
197
+ post:
198
+ with_token: '{"error":{"type":"Exception","message":"(#2200) subscription validation failed"}}'
199
+ callback_url=foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
200
+ post:
201
+ with_token: '{"error":{"type":"Exception","message":"(#100) callback_url URL is not properly formatted"}}'
202
+ object=user:
203
+ delete:
204
+ with_token:
205
+ code: 200
206
+ object=kittens:
207
+ delete:
208
+ with_token: '{"error":{"type":"Exception","message":"(#100) Invalid parameter"}}'
209
+ no_args:
210
+ delete:
211
+ with_token:
212
+ code: 200
213
+ get:
214
+ with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
215
+
216
+
217
+ callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>:
218
+ get:
219
+ with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
220
+
221
+ # -- Mock Item Responses --
222
+
223
+ /MOCK_FEED_ITEM/likes:
224
+ no_args:
225
+ post:
226
+ with_token: '{"id": "MOCK_LIKE"}'
227
+
228
+ /MOCK_FEED_ITEM/comments:
229
+ message=it's my comment!:
230
+ post:
231
+ with_token: '{"id": "MOCK_COMMENT"}'
232
+
233
+ /MOCK_FEED_ITEM:
234
+ no_args:
235
+ <<: *item_deleted
236
+
237
+ /FEED_ITEM_CONTEXT:
238
+ no_args:
239
+ <<: *item_deleted
240
+ get:
241
+ with_token: '{"link":"http://oauth.twoalex.com/", "name": "OAuth Playground"}'
242
+
243
+ /FEED_ITEM_CATS:
244
+ no_args:
245
+ <<: *item_deleted
246
+ get:
247
+ with_token: '{"message": "the cats are asleep"}'
248
+
249
+ /FEED_ITEM_DELETE:
250
+ no_args:
251
+ <<: *item_deleted
252
+
253
+ /FEED_ITEM_DELETE/likes:
254
+ no_args:
255
+ <<: *item_deleted
256
+ post:
257
+ with_token: 'true'
258
+
259
+ /MOCK_COMMENT:
260
+ no_args:
261
+ <<: *item_deleted
262
+ get:
263
+ with_token: "{\"message\": \"it's my comment!\"}"
264
+ /MOCK_PHOTO:
265
+ no_args:
266
+ <<: *item_deleted
267
+ get:
268
+ with_token: "{\"name\": \"This is the test message\"}"
269
+
270
+ # -- Mock Test User Responses --
271
+ /<%= APP_ID %>/accounts/test-users:
272
+ installed=false:
273
+ <<: *test_user_no_perms
274
+ installed=false&permissions=read_stream:
275
+ <<: *test_user_no_perms
276
+ installed=true&permissions=read_stream:
277
+ post:
278
+ with_token: '{"id": "999999999", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
279
+ installed=true&permissions=read_stream,user_interests:
280
+ post:
281
+ with_token: '{"id": "888888888", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
282
+ no_args:
283
+ get:
284
+ with_token: '{"data":[{"id": "999999999", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}, {"id": "888888888", "access_token":"119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "login_url":"https://www.facebook.com/platform/test_account.."}]}'
285
+
286
+ /999999999:
287
+ no_args:
288
+ <<: *item_deleted
289
+
290
+ /999999999/friends/888888888:
291
+ no_args:
292
+ post:
293
+ with_token: 'true'
294
+
295
+
296
+ /9999999991:
297
+ no_args:
298
+ delete:
299
+ with_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
300
+
301
+ /888888888:
302
+ no_args:
303
+ <<: *item_deleted
304
+
305
+ /888888888/friends/999999999:
306
+ no_args:
307
+ <<: *test_user_befriended
308
+
309
+
310
+ /777777777:
311
+ no_args:
312
312
  <<: *item_deleted