koala 1.0.0.beta → 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 (52) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +17 -3
  3. data/Gemfile +3 -0
  4. data/LICENSE +1 -1
  5. data/Manifest +5 -2
  6. data/Rakefile +13 -14
  7. data/koala.gemspec +35 -20
  8. data/lib/koala/graph_api.rb +183 -131
  9. data/lib/koala/http_services.rb +46 -55
  10. data/lib/koala/test_users.rb +21 -8
  11. data/lib/koala/uploadable_io.rb +115 -0
  12. data/lib/koala.rb +52 -84
  13. data/readme.md +19 -6
  14. data/spec/cases/api_base_spec.rb +101 -0
  15. data/spec/cases/graph_and_rest_api_spec.rb +31 -0
  16. data/spec/cases/graph_api_spec.rb +25 -0
  17. data/spec/cases/http_services/http_service_spec.rb +54 -0
  18. data/spec/cases/http_services/net_http_service_spec.rb +350 -0
  19. data/spec/cases/http_services/typhoeus_service_spec.rb +144 -0
  20. data/spec/cases/oauth_spec.rb +409 -0
  21. data/spec/cases/realtime_updates_spec.rb +184 -0
  22. data/spec/cases/rest_api_spec.rb +25 -0
  23. data/spec/{koala/test_users/test_users_tests.rb → cases/test_users_spec.rb} +46 -33
  24. data/spec/cases/uploadable_io_spec.rb +151 -0
  25. data/spec/{facebook_data.yml → fixtures/facebook_data.yml} +12 -14
  26. data/spec/{mock_facebook_responses.yml → fixtures/mock_facebook_responses.yml} +313 -306
  27. data/spec/spec_helper.rb +18 -0
  28. data/spec/support/graph_api_shared_examples.rb +424 -0
  29. data/spec/{koala → support}/live_testing_data_helper.rb +39 -42
  30. data/spec/{mock_http_service.rb → support/mock_http_service.rb} +94 -95
  31. data/spec/{koala/rest_api/rest_api_tests.rb → support/rest_api_shared_examples.rb} +43 -0
  32. data/spec/support/setup_mocks_or_live.rb +52 -0
  33. data/spec/support/uploadable_io_shared_examples.rb +76 -0
  34. metadata +107 -48
  35. data/init.rb +0 -2
  36. data/spec/koala/api_base_tests.rb +0 -102
  37. data/spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb +0 -14
  38. data/spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb +0 -16
  39. data/spec/koala/graph_api/graph_api_no_access_token_tests.rb +0 -63
  40. data/spec/koala/graph_api/graph_api_tests.rb +0 -86
  41. data/spec/koala/graph_api/graph_api_with_access_token_tests.rb +0 -154
  42. data/spec/koala/graph_api/graph_collection_tests.rb +0 -104
  43. data/spec/koala/net_http_service_tests.rb +0 -430
  44. data/spec/koala/oauth/oauth_tests.rb +0 -409
  45. data/spec/koala/realtime_updates/realtime_updates_tests.rb +0 -187
  46. data/spec/koala/rest_api/rest_api_no_access_token_tests.rb +0 -25
  47. data/spec/koala/rest_api/rest_api_with_access_token_tests.rb +0 -38
  48. data/spec/koala/typhoeus_service_tests.rb +0 -156
  49. data/spec/koala_spec.rb +0 -18
  50. data/spec/koala_spec_helper.rb +0 -70
  51. data/spec/koala_spec_without_mocks.rb +0 -19
  52. /data/spec/{koala/assets → fixtures}/beach.jpg +0 -0
@@ -1,307 +1,314 @@
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":"119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "login_url":"https://www.facebook.com/platform/test_account.."}'
53
-
54
- # -- Stubbed Responses --
55
- root:
56
- ids=contextoptional,naitik:
57
- get:
58
- with_token: '[{}, {}]'
59
- no_token: '[{}, {}]'
60
- /me:
61
- no_args:
62
- get:
63
- <<: *token_required
64
- with_token: '{"updated_time": 1}'
65
- fields=id:
66
- get:
67
- with_token: '{"id": "216743"}'
68
-
69
- /me/feed:
70
- message=Hello, world, from the test suite!:
71
- post:
72
- with_token: '{"id": "MOCK_FEED_ITEM"}'
73
- message=Hello, world, from the test suite, testing comments!:
74
- post:
75
- with_token: '{"id": "MOCK_FEED_ITEM"}'
76
- message=the cats are asleep:
77
- post:
78
- with_token: '{"id": "FEED_ITEM_CATS"}'
79
- message=Hello, world, from the test suite delete method!:
80
- post:
81
- with_token: '{"id": "FEED_ITEM_DELETE"}'
82
- link=http://www.contextoptional.com/&message=Hello, world, from the test suite again!&name=Context Optional:
83
- post:
84
- with_token: '{"id": "FEED_ITEM_CONTEXT"}'
85
- /me/photos:
86
- source=[FILE]:
87
- post:
88
- <<: *token_required
89
- with_token: '{"id": "MOCK_PHOTO"}'
90
- message=This is the test message&source=[FILE]:
91
- post:
92
- <<: *token_required
93
- with_token: '{"id": "MOCK_PHOTO"}'
94
- /koppel:
95
- no_args:
96
- get:
97
- with_token: '{"id": 1, "name": 1, "updated_time": 1}'
98
- no_token: '{"id": 1, "name": 1}'
99
-
100
- /contextoptional:
101
- no_args:
102
- get:
103
- with_token: '{"id": 1, "name": 1}'
104
- no_token: '{"id": 1, "name": 1}'
105
-
106
- /contextoptional/photos:
107
- no_args:
108
- get:
109
- 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"}}'
110
- 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"}}'
111
-
112
- /lukeshepard/likes:
113
- no_args:
114
- get:
115
- <<: *token_required
116
- with_token: '{"data": [{}]}'
117
-
118
- /chris.baclig/picture:
119
- no_args:
120
- get:
121
- no_token:
122
- code: 302
123
- headers:
124
- Location: http://facebook.com/
125
- with_token:
126
- code: 302
127
- headers:
128
- Location: http://facebook.com/
129
- type=large:
130
- get:
131
- no_token:
132
- code: 302
133
- headers:
134
- Location: http://facebook.com/large
135
- with_token:
136
- code: 302
137
- headers:
138
- Location: http://facebook.com/large
139
-
140
-
141
- /search:
142
- q=facebook:
143
- get:
144
- 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"}}'
145
- 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"}}'
146
- "limit=25&q=facebook&until=2010-09-23T21:17:33+0000":
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
-
151
- '/115349521819193_113815981982767':
152
- no_args:
153
- delete:
154
- <<: *token_required
155
-
156
- # -- OAuth responses --
157
- /oauth/access_token:
158
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=<%= OAUTH_CODE %>&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
159
- get:
160
- no_token: access_token=<%= ACCESS_TOKEN %>
161
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=foo&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
162
- get:
163
- <<: *oauth_error
164
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&type=client_cred:
165
- post:
166
- no_token: access_token=<%= ACCESS_TOKEN %>
167
- /oauth/exchange_sessions:
168
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["session_key"] %>&type=client_cred:
169
- post:
170
- no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
171
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["multiple_session_keys"].join(",") %>&type=client_cred:
172
- post:
173
- no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
174
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= ["foo"].concat(OAUTH_DATA["multiple_session_keys"]).join(",") %>&type=client_cred:
175
- post:
176
- no_token: '[null, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
177
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo,bar&type=client_cred:
178
- post:
179
- no_token: '[null, null]'
180
- client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo&type=client_cred:
181
- post:
182
- no_token: '[null]'
183
-
184
-
185
-
186
- # -- Subscription Responses --
187
- /<%= APP_ID %>/subscriptions:
188
- callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
189
- post:
190
- with_token:
191
- code: 200
192
- callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
193
- post:
194
- with_token: '{"error":{"type":"Exception","message":"(#2200) subscription validation failed"}}'
195
- callback_url=foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
196
- post:
197
- with_token: '{"error":{"type":"Exception","message":"(#100) callback_url URL is not properly formatted"}}'
198
- object=user:
199
- delete:
200
- with_token:
201
- code: 200
202
- object=kittens:
203
- delete:
204
- with_token: '{"error":{"type":"Exception","message":"(#100) Invalid parameter"}}'
205
- no_args:
206
- delete:
207
- with_token:
208
- code: 200
209
- get:
210
- with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
211
-
212
-
213
- callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>:
214
- get:
215
- with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
216
-
217
- # -- Mock Item Responses --
218
-
219
- /MOCK_FEED_ITEM/likes:
220
- no_args:
221
- post:
222
- with_token: '{"id": "MOCK_LIKE"}'
223
-
224
- /MOCK_FEED_ITEM/comments:
225
- message=it's my comment!:
226
- post:
227
- with_token: '{"id": "MOCK_COMMENT"}'
228
-
229
- /MOCK_FEED_ITEM:
230
- no_args:
231
- <<: *item_deleted
232
-
233
- /FEED_ITEM_CONTEXT:
234
- no_args:
235
- <<: *item_deleted
236
- get:
237
- with_token: '{"link":"http://www.contextoptional.com/", "name": "Context Optional"}'
238
-
239
- /FEED_ITEM_CATS:
240
- no_args:
241
- <<: *item_deleted
242
- get:
243
- with_token: '{"message": "the cats are asleep"}'
244
-
245
- /FEED_ITEM_DELETE:
246
- no_args:
247
- <<: *item_deleted
248
-
249
- /FEED_ITEM_DELETE/likes:
250
- no_args:
251
- <<: *item_deleted
252
- post:
253
- with_token: 'true'
254
-
255
- /MOCK_COMMENT:
256
- no_args:
257
- <<: *item_deleted
258
- get:
259
- with_token: "{\"message\": \"it\'s my comment!\"}"
260
- /MOCK_PHOTO:
261
- no_args:
262
- <<: *item_deleted
263
- get:
264
- with_token: "{\"name\": \"This is the test message\"}"
265
-
266
- # -- Mock Test User Responses --
267
- /<%= APP_ID %>/accounts/test-users:
268
- installed=false:
269
- <<: *test_user_no_perms
270
- installed=false&permissions=read_stream:
271
- <<: *test_user_no_perms
272
- installed=true&permissions=read_stream:
273
- post:
274
- with_token: '{"id": "999999999", "access_token":"119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "login_url":"https://www.facebook.com/platform/test_account.."}'
275
- installed=true&permissions=read_stream,user_interests:
276
- post:
277
- with_token: '{"id": "888888888", "access_token":"119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "login_url":"https://www.facebook.com/platform/test_account.."}'
278
- no_args:
279
- get:
280
- with_token: '{"data":[{"id": "999999999", "access_token":"119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "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.."}]}'
281
-
282
- /999999999:
283
- no_args:
284
- <<: *item_deleted
285
-
286
- /9999999991:
287
- no_args:
288
- delete:
289
- with_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
290
-
291
- /888888888:
292
- no_args:
293
- <<: *item_deleted
294
-
295
- /777777777:
296
- no_args:
297
- <<: *item_deleted
298
-
299
- /999999999/friends/888888888:
300
- no_args:
301
- get:
302
- with_token: 'true'
303
-
304
- /888888888/friends/999999999:
305
- no_args:
306
- get:
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
+ /lukeshepard/picture:
123
+ type=large:
124
+ get:
125
+ no_token:
126
+ code: 302
127
+ headers:
128
+ Location: https://facebook.com/large
129
+ with_token:
130
+ code: 302
131
+ headers:
132
+ Location: https://facebook.com/large
133
+
134
+
135
+ /chris.baclig/picture:
136
+ no_args:
137
+ get:
138
+ no_token:
139
+ code: 302
140
+ headers:
141
+ Location: http://facebook.com/
142
+ with_token:
143
+ code: 302
144
+ headers:
145
+ Location: http://facebook.com/
146
+
147
+ /search:
148
+ q=facebook:
149
+ get:
150
+ 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"}}'
151
+ 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"}}'
152
+ "limit=25&q=facebook&until=2010-09-23T21:17:33+0000":
153
+ get:
154
+ 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"}}'
155
+ 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"}}'
156
+
157
+ '/115349521819193_113815981982767':
158
+ no_args:
159
+ delete:
160
+ <<: *token_required
161
+
162
+ # -- OAuth responses --
163
+ /oauth/access_token:
164
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=<%= OAUTH_CODE %>&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
165
+ get:
166
+ no_token: access_token=<%= ACCESS_TOKEN %>
167
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=foo&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
168
+ get:
169
+ <<: *oauth_error
170
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&type=client_cred:
171
+ post:
172
+ no_token: access_token=<%= ACCESS_TOKEN %>
173
+ /oauth/exchange_sessions:
174
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["session_key"] %>&type=client_cred:
175
+ post:
176
+ no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
177
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= OAUTH_DATA["multiple_session_keys"].join(",") %>&type=client_cred:
178
+ post:
179
+ no_token: '[{"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
180
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=<%= ["foo"].concat(OAUTH_DATA["multiple_session_keys"]).join(",") %>&type=client_cred:
181
+ post:
182
+ no_token: '[null, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}, {"access_token":"<%= ACCESS_TOKEN %>","expires":4315}]'
183
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo,bar&type=client_cred:
184
+ post:
185
+ no_token: '[null, null]'
186
+ client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&sessions=foo&type=client_cred:
187
+ post:
188
+ no_token: '[null]'
189
+
190
+
191
+
192
+ # -- Subscription Responses --
193
+ /<%= APP_ID %>/subscriptions:
194
+ callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
195
+ post:
196
+ with_token:
197
+ code: 200
198
+ callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
199
+ post:
200
+ with_token: '{"error":{"type":"Exception","message":"(#2200) subscription validation failed"}}'
201
+ callback_url=foo&fields=name&object=user&verify_token=<%= SUBSCRIPTION_DATA["verify_token"] %>:
202
+ post:
203
+ with_token: '{"error":{"type":"Exception","message":"(#100) callback_url URL is not properly formatted"}}'
204
+ object=user:
205
+ delete:
206
+ with_token:
207
+ code: 200
208
+ object=kittens:
209
+ delete:
210
+ with_token: '{"error":{"type":"Exception","message":"(#100) Invalid parameter"}}'
211
+ no_args:
212
+ delete:
213
+ with_token:
214
+ code: 200
215
+ get:
216
+ with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
217
+
218
+
219
+ callback_url=<%= SUBSCRIPTION_DATA["subscription_path"] %>:
220
+ get:
221
+ with_token: '{"data":[{"callback_url":"http://oauth.twoalex.com/subscriptions", "fields":["name"], "object":"user", "active":true}]}'
222
+
223
+ # -- Mock Item Responses --
224
+
225
+ /MOCK_FEED_ITEM/likes:
226
+ no_args:
227
+ post:
228
+ with_token: '{"id": "MOCK_LIKE"}'
229
+
230
+ /MOCK_FEED_ITEM/comments:
231
+ message=it's my comment!:
232
+ post:
233
+ with_token: '{"id": "MOCK_COMMENT"}'
234
+
235
+ /MOCK_FEED_ITEM:
236
+ no_args:
237
+ <<: *item_deleted
238
+
239
+ /FEED_ITEM_CONTEXT:
240
+ no_args:
241
+ <<: *item_deleted
242
+ get:
243
+ with_token: '{"link":"http://oauth.twoalex.com/", "name": "OAuth Playground"}'
244
+
245
+ /FEED_ITEM_CATS:
246
+ no_args:
247
+ <<: *item_deleted
248
+ get:
249
+ with_token: '{"message": "the cats are asleep"}'
250
+
251
+ /FEED_ITEM_DELETE:
252
+ no_args:
253
+ <<: *item_deleted
254
+
255
+ /FEED_ITEM_DELETE/likes:
256
+ no_args:
257
+ <<: *item_deleted
258
+ post:
307
259
  with_token: 'true'
260
+
261
+ /MOCK_COMMENT:
262
+ no_args:
263
+ <<: *item_deleted
264
+ get:
265
+ with_token: "{\"message\": \"it's my comment!\"}"
266
+ /MOCK_PHOTO:
267
+ no_args:
268
+ <<: *item_deleted
269
+ get:
270
+ with_token: "{\"name\": \"This is the test message\"}"
271
+
272
+ # -- Mock Test User Responses --
273
+ /<%= APP_ID %>/accounts/test-users:
274
+ installed=false:
275
+ <<: *test_user_no_perms
276
+ installed=false&permissions=read_stream:
277
+ <<: *test_user_no_perms
278
+ installed=true&permissions=read_stream:
279
+ post:
280
+ with_token: '{"id": "999999999", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
281
+ installed=true&permissions=read_stream,user_interests:
282
+ post:
283
+ with_token: '{"id": "888888888", "access_token":"<%= ACCESS_TOKEN %>", "login_url":"https://www.facebook.com/platform/test_account.."}'
284
+ no_args:
285
+ get:
286
+ 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.."}]}'
287
+
288
+ /999999999:
289
+ no_args:
290
+ <<: *item_deleted
291
+
292
+ /999999999/friends/888888888:
293
+ no_args:
294
+ post:
295
+ with_token: 'true'
296
+
297
+
298
+ /9999999991:
299
+ no_args:
300
+ delete:
301
+ with_token: '{"error": {"type": "OAuthException", "message": "Error validating verification code."}}'
302
+
303
+ /888888888:
304
+ no_args:
305
+ <<: *item_deleted
306
+
307
+ /888888888/friends/999999999:
308
+ no_args:
309
+ <<: *test_user_befriended
310
+
311
+
312
+ /777777777:
313
+ no_args:
314
+ <<: *item_deleted
@@ -0,0 +1,18 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'although not required, bundler is recommened for running the tests'
5
+ end
6
+
7
+ # load the libraries
8
+ require 'koala'
9
+
10
+ # load testing data libraries
11
+ require 'support/live_testing_data_helper'
12
+ require 'support/mock_http_service'
13
+ require 'support/rest_api_shared_examples'
14
+ require 'support/graph_api_shared_examples'
15
+ require 'support/uploadable_io_shared_examples'
16
+ require 'support/setup_mocks_or_live'
17
+
18
+ BEACH_BALL_PATH = File.join(File.dirname(__FILE__), "fixtures", "beach.jpg")