koala 2.4.0 → 3.5.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.
- checksums.yaml +5 -5
- data/.github/workflows/test.yml +32 -0
- data/Gemfile +5 -3
- data/ISSUE_TEMPLATE +25 -0
- data/PULL_REQUEST_TEMPLATE +11 -0
- data/changelog.md +161 -4
- data/code_of_conduct.md +64 -12
- data/koala.gemspec +5 -1
- data/lib/koala/api/batch_operation.rb +3 -6
- data/lib/koala/api/{graph_api.rb → graph_api_methods.rb} +29 -104
- data/lib/koala/api/graph_batch_api.rb +112 -65
- data/lib/koala/api/graph_collection.rb +19 -12
- data/lib/koala/api/graph_error_checker.rb +4 -3
- data/lib/koala/api.rb +65 -26
- data/lib/koala/configuration.rb +56 -0
- data/lib/koala/errors.rb +22 -2
- data/lib/koala/http_service/request.rb +133 -0
- data/lib/koala/http_service/response.rb +6 -4
- data/lib/koala/http_service/uploadable_io.rb +0 -5
- data/lib/koala/http_service.rb +29 -76
- data/lib/koala/oauth.rb +8 -8
- data/lib/koala/realtime_updates.rb +26 -21
- data/lib/koala/test_users.rb +9 -8
- data/lib/koala/version.rb +1 -1
- data/lib/koala.rb +7 -9
- data/readme.md +83 -109
- data/spec/cases/api_spec.rb +176 -69
- data/spec/cases/configuration_spec.rb +11 -0
- data/spec/cases/error_spec.rb +16 -3
- data/spec/cases/graph_api_batch_spec.rb +75 -44
- data/spec/cases/graph_api_spec.rb +15 -29
- data/spec/cases/graph_collection_spec.rb +47 -34
- data/spec/cases/graph_error_checker_spec.rb +31 -2
- data/spec/cases/http_service/request_spec.rb +250 -0
- data/spec/cases/http_service/response_spec.rb +24 -0
- data/spec/cases/http_service_spec.rb +126 -286
- data/spec/cases/koala_spec.rb +7 -5
- data/spec/cases/oauth_spec.rb +41 -2
- data/spec/cases/realtime_updates_spec.rb +51 -13
- data/spec/cases/test_users_spec.rb +56 -2
- data/spec/cases/uploadable_io_spec.rb +31 -31
- data/spec/fixtures/cat.m4v +0 -0
- data/spec/fixtures/facebook_data.yml +4 -6
- data/spec/fixtures/mock_facebook_responses.yml +41 -78
- data/spec/fixtures/vcr_cassettes/app_test_accounts.yml +97 -0
- data/spec/integration/graph_collection_spec.rb +8 -5
- data/spec/spec_helper.rb +2 -2
- data/spec/support/graph_api_shared_examples.rb +152 -337
- data/spec/support/koala_test.rb +11 -13
- data/spec/support/mock_http_service.rb +11 -14
- data/spec/support/uploadable_io_shared_examples.rb +4 -4
- metadata +47 -48
- data/.autotest +0 -12
- data/.travis.yml +0 -17
- data/Guardfile +0 -6
- data/autotest/discover.rb +0 -1
- data/lib/koala/api/rest_api.rb +0 -135
- data/lib/koala/http_service/multipart_request.rb +0 -41
- data/spec/cases/multipart_request_spec.rb +0 -65
- data/spec/support/rest_api_shared_examples.rb +0 -168
@@ -0,0 +1,250 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Koala
|
4
|
+
module HTTPService
|
5
|
+
RSpec.describe Request do
|
6
|
+
let(:path) { "/foo" }
|
7
|
+
let(:args) { {"a" => 2, "b" => 3, "access_token" => "a_token"} }
|
8
|
+
let(:verb) { "get" }
|
9
|
+
let(:options) { {an: :option} }
|
10
|
+
let(:request) { Request.new(path: path, args: args, verb: verb, options: options) }
|
11
|
+
|
12
|
+
shared_context post: true do
|
13
|
+
let(:verb) { "post" }
|
14
|
+
end
|
15
|
+
|
16
|
+
shared_context delete: true do
|
17
|
+
let(:verb) { "delete" }
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_context put: true do
|
21
|
+
let(:verb) { "put" }
|
22
|
+
end
|
23
|
+
|
24
|
+
it "raises an ArgumentError if no verb is supplied" do
|
25
|
+
expect { Request.new(path: path) }.to raise_exception(ArgumentError)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "raises an ArgumentError if no path is supplied" do
|
29
|
+
expect { Request.new(verb: verb) }.to raise_exception(ArgumentError)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#verb" do
|
33
|
+
it "returns get for get" do
|
34
|
+
expect(Request.new(path: path, verb: "get").verb).to eq("get")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns post for post" do
|
38
|
+
expect(Request.new(path: path, verb: "post").verb).to eq("post")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns post for put" do
|
42
|
+
expect(Request.new(path: path, verb: "put").verb).to eq("post")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns post for delete" do
|
46
|
+
expect(Request.new(path: path, verb: "delete").verb).to eq("post")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#path" do
|
51
|
+
context "if there's no API version" do
|
52
|
+
it "returns the path" do
|
53
|
+
expect(request.path).to eq(path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "if there's an API version" do
|
58
|
+
shared_examples_for :including_the_version do
|
59
|
+
it "prefixes the version appropriately when the path starts with /" do
|
60
|
+
expect(Request.new(path: "/foo", verb: "get", options: options).path).to eq("/#{version}/foo")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "prefixes the version appropriately when the path doesn't start with /" do
|
64
|
+
expect(Request.new(path: "foo", verb: "get", options: options).path).to eq("/#{version}/foo")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "set by Koala.config" do
|
69
|
+
let(:version) { "v2.7" }
|
70
|
+
|
71
|
+
before :each do
|
72
|
+
Koala.configure do |config|
|
73
|
+
config.api_version = version
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it_should_behave_like :including_the_version
|
78
|
+
end
|
79
|
+
|
80
|
+
context "set in options" do
|
81
|
+
let(:version) { "v2.8" }
|
82
|
+
|
83
|
+
let(:options) { {api_version: version} }
|
84
|
+
|
85
|
+
it_should_behave_like :including_the_version
|
86
|
+
end
|
87
|
+
|
88
|
+
context "for versions without a ." do
|
89
|
+
let(:version) { "v21" }
|
90
|
+
|
91
|
+
let(:options) { {api_version: version} }
|
92
|
+
|
93
|
+
it_should_behave_like :including_the_version
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#post_args" do
|
99
|
+
it "returns {} for get" do
|
100
|
+
expect(request.post_args).to eq({})
|
101
|
+
end
|
102
|
+
|
103
|
+
it "returns args for post", :post do
|
104
|
+
expect(request.post_args).to eq(args)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "returns args + method: delete for delete", :delete do
|
108
|
+
expect(request.post_args).to eq(args.merge(method: "delete"))
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns args + method: put for put", :put do
|
112
|
+
expect(request.post_args).to eq(args.merge(method: "put"))
|
113
|
+
end
|
114
|
+
|
115
|
+
it "turns any UploadableIOs to UploadIOs" do
|
116
|
+
# technically this is done for all requests, but you don't send GET requests with files
|
117
|
+
upload_io = double("UploadIO")
|
118
|
+
u = Koala::HTTPService::UploadableIO.new("/path/to/stuff", "img/jpg")
|
119
|
+
allow(u).to receive(:to_upload_io).and_return(upload_io)
|
120
|
+
request = Request.new(path: path, verb: "post", args: {an_upload: u})
|
121
|
+
expect(request.post_args[:an_upload]).to eq(upload_io)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#json?" do
|
126
|
+
it "returns false if the option for JSON isn't set" do
|
127
|
+
expect(request).not_to be_json
|
128
|
+
end
|
129
|
+
|
130
|
+
context "if JSON is set" do
|
131
|
+
let(:options) { {format: :json} }
|
132
|
+
|
133
|
+
it "returns true if it is" do
|
134
|
+
expect(request).to be_json
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "#options" do
|
140
|
+
it "returns the options provided" do
|
141
|
+
expect(request.options).to include(options)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "merges in any global options" do
|
145
|
+
global_options = {some: :opts}
|
146
|
+
HTTPService.http_options = global_options
|
147
|
+
results = request.options
|
148
|
+
HTTPService.http_options = {}
|
149
|
+
expect(results).to include(global_options)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "overwrites any global options with equivalent ones" do
|
153
|
+
options = {foo: :bar}
|
154
|
+
HTTPService.http_options = {foo: 2}
|
155
|
+
results = Request.new(path: path, args: args, verb: verb, options: options).options
|
156
|
+
HTTPService.http_options = {}
|
157
|
+
expect(results).to include(options)
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "get parameters" do
|
161
|
+
it "includes the parameters for a get " do
|
162
|
+
expect(request.options[:params]).to eq(args)
|
163
|
+
end
|
164
|
+
|
165
|
+
it "returns {} for post", :post do
|
166
|
+
expect(request.options[:params]).to eq({})
|
167
|
+
end
|
168
|
+
|
169
|
+
it "returns {} for delete", :delete do
|
170
|
+
expect(request.options[:params]).to eq({})
|
171
|
+
end
|
172
|
+
|
173
|
+
it "returns {} for put", :put do
|
174
|
+
expect(request.options[:params]).to eq({})
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe "ssl options" do
|
179
|
+
it "includes the default SSL options even if there's no access token" do
|
180
|
+
request_options = Request.new(path: path, args: args.delete_if {|k, _v| k == "access_token"}, verb: verb, options: options).options
|
181
|
+
expect(request_options).to include(use_ssl: true, ssl: {verify: true})
|
182
|
+
end
|
183
|
+
|
184
|
+
context "if there is an access_token" do
|
185
|
+
it "includes the default SSL options" do
|
186
|
+
expect(request.options).to include(use_ssl: true, ssl: {verify: true})
|
187
|
+
end
|
188
|
+
|
189
|
+
it "incorporates any provided SSL options" do
|
190
|
+
new_ssl_options = {an: :option2}
|
191
|
+
request_options = Request.new(path: path, args: args, verb: verb, options: options.merge(ssl: new_ssl_options)).options
|
192
|
+
expect(request_options[:ssl]).to include(new_ssl_options)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "overrides default SSL options with what's provided" do
|
196
|
+
new_ssl_options = {use_ssl: false, ssl:{verify: :dunno}}
|
197
|
+
request_options = Request.new(path: path, args: args, verb: verb, options: options.merge(new_ssl_options)).options
|
198
|
+
expect(request_options).to include(new_ssl_options)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "server" do
|
204
|
+
describe "with no options" do
|
205
|
+
it "returns the graph server by default" do
|
206
|
+
expect(request.server).to eq("https://graph.facebook.com")
|
207
|
+
end
|
208
|
+
|
209
|
+
it "uses another base server if specified" do
|
210
|
+
Koala.config.graph_server = "foo"
|
211
|
+
expect(request.server).to eq("https://foo")
|
212
|
+
end
|
213
|
+
|
214
|
+
context "if there is no access token" do
|
215
|
+
let(:args) { {"a" => "b"} }
|
216
|
+
|
217
|
+
it "uses https" do
|
218
|
+
expect(request.server).to eq("https://graph.facebook.com")
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context "if options[:use_ssl] is false" do
|
223
|
+
let(:options) { {use_ssl: false} }
|
224
|
+
|
225
|
+
it "uses http" do
|
226
|
+
expect(request.server).to eq("http://graph.facebook.com")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context "if options[:beta]" do
|
231
|
+
let(:options) { {beta: true} }
|
232
|
+
|
233
|
+
it "returns https if options[:beta]" do
|
234
|
+
expect(request.server).to eq("https://graph.beta.facebook.com")
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
context "if options[:video]" do
|
239
|
+
let(:options) { {video: true} }
|
240
|
+
|
241
|
+
it "returns https if options[:video]" do
|
242
|
+
expect(request.server).to eq("https://graph-video.facebook.com")
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Koala::HTTPService
|
4
|
+
RSpec.describe Response do
|
5
|
+
describe "#data" do
|
6
|
+
it "returns nothing if the body is empty" do
|
7
|
+
expect(Response.new(200, "", {}).data).to be_nil
|
8
|
+
end
|
9
|
+
|
10
|
+
it "parses the JSON if there's a body" do
|
11
|
+
result = {"foo" => "bar"}
|
12
|
+
expect(Response.new(200, result.to_json, {}).data).to eq(result)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "allows raw values" do
|
16
|
+
expect(Response.new(200, "true", {}).data).to be true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "raises a ParserError if it's invalid JSON" do
|
20
|
+
expect { Response.new(200, "{", {}).data }.to raise_exception(JSON::ParserError)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|