oauth2 1.4.9 → 2.0.2

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.
@@ -1,556 +0,0 @@
1
- # coding: utf-8
2
- # frozen_string_literal: true
3
-
4
- require 'nkf'
5
-
6
- describe OAuth2::Client do
7
- subject do
8
- described_class.new('abc', 'def', {:site => 'https://api.example.com'}.merge(options)) do |builder|
9
- builder.adapter :test do |stub|
10
- stub.get('/success') { |env| [200, {'Content-Type' => 'text/awesome'}, 'yay'] }
11
- stub.get('/reflect') { |env| [200, {}, env[:body]] }
12
- stub.post('/reflect') { |env| [200, {}, env[:body]] }
13
- stub.get('/unauthorized') { |env| [401, {'Content-Type' => 'application/json'}, MultiJson.encode(:error => error_value, :error_description => error_description_value)] }
14
- stub.get('/conflict') { |env| [409, {'Content-Type' => 'text/plain'}, 'not authorized'] }
15
- stub.get('/redirect') { |env| [302, {'Content-Type' => 'text/plain', 'location' => '/success'}, ''] }
16
- stub.get('/redirect_no_loc') { |_env| [302, {'Content-Type' => 'text/plain'}, ''] }
17
- stub.post('/redirect') { |env| [303, {'Content-Type' => 'text/plain', 'location' => '/reflect'}, ''] }
18
- stub.get('/error') { |env| [500, {'Content-Type' => 'text/plain'}, 'unknown error'] }
19
- stub.get('/empty_get') { |env| [204, {}, nil] }
20
- stub.get('/different_encoding') { |env| [500, {'Content-Type' => 'application/json'}, NKF.nkf('-We', MultiJson.encode(:error => error_value, :error_description => '∞'))] }
21
- stub.get('/ascii_8bit_encoding') { |env| [500, {'Content-Type' => 'application/json'}, MultiJson.encode(:error => 'invalid_request', :error_description => 'é').force_encoding('ASCII-8BIT')] }
22
- end
23
- end
24
- end
25
-
26
- let!(:error_value) { 'invalid_token' }
27
- let!(:error_description_value) { 'bad bad token' }
28
- let(:options) { {} }
29
-
30
- describe '#initialize' do
31
- it 'assigns id and secret' do
32
- expect(subject.id).to eq('abc')
33
- expect(subject.secret).to eq('def')
34
- end
35
-
36
- it 'assigns site from the options hash' do
37
- expect(subject.site).to eq('https://api.example.com')
38
- end
39
-
40
- it 'assigns Faraday::Connection#host' do
41
- expect(subject.connection.host).to eq('api.example.com')
42
- end
43
-
44
- it 'leaves Faraday::Connection#ssl unset' do
45
- expect(subject.connection.ssl).to be_empty
46
- end
47
-
48
- it 'is able to pass a block to configure the connection' do
49
- builder = double('builder')
50
-
51
- allow(Faraday).to receive(:new).and_yield(builder)
52
- allow(builder).to receive(:response)
53
-
54
- expect(builder).to receive(:adapter).with(:test)
55
-
56
- described_class.new('abc', 'def') do |client|
57
- client.adapter :test
58
- end.connection
59
- end
60
-
61
- it 'defaults raise_errors to true' do
62
- expect(subject.options[:raise_errors]).to be true
63
- end
64
-
65
- it 'allows true/false for raise_errors option' do
66
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :raise_errors => false)
67
- expect(client.options[:raise_errors]).to be false
68
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :raise_errors => true)
69
- expect(client.options[:raise_errors]).to be true
70
- end
71
-
72
- it 'allows override of raise_errors option' do
73
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :raise_errors => true) do |builder|
74
- builder.adapter :test do |stub|
75
- stub.get('/notfound') { |_env| [404, {}, nil] }
76
- end
77
- end
78
- expect(client.options[:raise_errors]).to be true
79
- expect { client.request(:get, '/notfound') }.to raise_error(OAuth2::Error)
80
- response = client.request(:get, '/notfound', :raise_errors => false)
81
- expect(response.status).to eq(404)
82
- end
83
-
84
- it 'allows get/post for access_token_method option' do
85
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :access_token_method => :get)
86
- expect(client.options[:access_token_method]).to eq(:get)
87
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :access_token_method => :post)
88
- expect(client.options[:access_token_method]).to eq(:post)
89
- end
90
-
91
- it 'does not mutate the opts hash argument' do
92
- opts = {:site => 'http://example.com/'}
93
- opts2 = opts.dup
94
- described_class.new 'abc', 'def', opts
95
- expect(opts).to eq(opts2)
96
- end
97
- end
98
-
99
- %w[authorize token].each do |url_type|
100
- describe ":#{url_type}_url option" do
101
- it "defaults to a path of /oauth/#{url_type}" do
102
- expect(subject.send("#{url_type}_url")).to eq("https://api.example.com/oauth/#{url_type}")
103
- end
104
-
105
- it "is settable via the :#{url_type}_url option" do
106
- subject.options[:"#{url_type}_url"] = '/oauth/custom'
107
- expect(subject.send("#{url_type}_url")).to eq('https://api.example.com/oauth/custom')
108
- end
109
-
110
- it 'allows a different host than the site' do
111
- subject.options[:"#{url_type}_url"] = 'https://api.foo.com/oauth/custom'
112
- expect(subject.send("#{url_type}_url")).to eq('https://api.foo.com/oauth/custom')
113
- end
114
-
115
- context 'when a URL with path is used in the site' do
116
- let(:options) do
117
- {:site => 'https://example.com/blog'}
118
- end
119
-
120
- it 'generates an authorization URL relative to the site' do
121
- expect(subject.send("#{url_type}_url")).to eq("https://example.com/blog/oauth/#{url_type}")
122
- end
123
- end
124
-
125
- context 'when a URL with path is used in the site and urls overridden' do
126
- let(:options) do
127
- {
128
- :site => 'https://example.com/blog',
129
- :authorize_url => "oauth/#{url_type}/lampoon",
130
- :token_url => "oauth/#{url_type}/lampoon",
131
- }
132
- end
133
-
134
- it 'generates an authorization URL relative to the site' do
135
- expect(subject.send("#{url_type}_url")).to eq("https://example.com/blog/oauth/#{url_type}/lampoon")
136
- end
137
- end
138
- end
139
- end
140
-
141
- describe ':redirect_uri option' do
142
- let(:auth_code_params) do
143
- {
144
- 'client_id' => 'abc',
145
- 'client_secret' => 'def',
146
- 'code' => 'code',
147
- 'grant_type' => 'authorization_code',
148
- }
149
- end
150
-
151
- context 'when blank' do
152
- it 'there is no redirect_uri param added to authorization URL' do
153
- expect(subject.authorize_url('a' => 'b')).to eq('https://api.example.com/oauth/authorize?a=b')
154
- end
155
-
156
- it 'does not add the redirect_uri param to the auth_code token exchange request' do
157
- client = described_class.new('abc', 'def', :site => 'https://api.example.com') do |builder|
158
- builder.adapter :test do |stub|
159
- stub.post('/oauth/token', auth_code_params) do
160
- [200, {'Content-Type' => 'application/json'}, '{"access_token":"token"}']
161
- end
162
- end
163
- end
164
- client.auth_code.get_token('code')
165
- end
166
- end
167
-
168
- context 'when set' do
169
- before { subject.options[:redirect_uri] = 'https://site.com/oauth/callback' }
170
-
171
- it 'adds the redirect_uri param to authorization URL' do
172
- expect(subject.authorize_url('a' => 'b')).to eq('https://api.example.com/oauth/authorize?a=b&redirect_uri=https%3A%2F%2Fsite.com%2Foauth%2Fcallback')
173
- end
174
-
175
- it 'adds the redirect_uri param to the auth_code token exchange request' do
176
- client = described_class.new('abc', 'def', :redirect_uri => 'https://site.com/oauth/callback', :site => 'https://api.example.com') do |builder|
177
- builder.adapter :test do |stub|
178
- stub.post('/oauth/token', auth_code_params.merge('redirect_uri' => 'https://site.com/oauth/callback')) do
179
- [200, {'Content-Type' => 'application/json'}, '{"access_token":"token"}']
180
- end
181
- end
182
- end
183
- client.auth_code.get_token('code')
184
- end
185
- end
186
-
187
- describe 'custom headers' do
188
- context 'string key headers' do
189
- it 'adds the custom headers to request' do
190
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :auth_scheme => :request_body) do |builder|
191
- builder.adapter :test do |stub|
192
- stub.post('/oauth/token') do |env|
193
- expect(env.request_headers).to include({'CustomHeader' => 'CustomHeader'})
194
- [200, {'Content-Type' => 'application/json'}, '{"access_token":"token"}']
195
- end
196
- end
197
- end
198
- header_params = {'headers' => {'CustomHeader' => 'CustomHeader'}}
199
- client.auth_code.get_token('code', header_params)
200
- end
201
- end
202
-
203
- context 'symbol key headers' do
204
- it 'adds the custom headers to request' do
205
- client = described_class.new('abc', 'def', :site => 'https://api.example.com', :auth_scheme => :request_body) do |builder|
206
- builder.adapter :test do |stub|
207
- stub.post('/oauth/token') do |env|
208
- expect(env.request_headers).to include({'CustomHeader' => 'CustomHeader'})
209
- [200, {'Content-Type' => 'application/json'}, '{"access_token":"token"}']
210
- end
211
- end
212
- end
213
- header_params = {:headers => {'CustomHeader' => 'CustomHeader'}}
214
- client.auth_code.get_token('code', header_params)
215
- end
216
- end
217
-
218
- context 'string key custom headers with basic auth' do
219
- it 'adds the custom headers to request' do
220
- client = described_class.new('abc', 'def', :site => 'https://api.example.com') do |builder|
221
- builder.adapter :test do |stub|
222
- stub.post('/oauth/token') do |env|
223
- expect(env.request_headers).to include({'CustomHeader' => 'CustomHeader'})
224
- [200, {'Content-Type' => 'application/json'}, '{"access_token":"token"}']
225
- end
226
- end
227
- end
228
- header_params = {'headers' => {'CustomHeader' => 'CustomHeader'}}
229
- client.auth_code.get_token('code', header_params)
230
- end
231
- end
232
-
233
- context 'symbol key custom headers with basic auth' do
234
- it 'adds the custom headers to request' do
235
- client = described_class.new('abc', 'def', :site => 'https://api.example.com') do |builder|
236
- builder.adapter :test do |stub|
237
- stub.post('/oauth/token') do |env|
238
- expect(env.request_headers).to include({'CustomHeader' => 'CustomHeader'})
239
- [200, {'Content-Type' => 'application/json'}, '{"access_token":"token"}']
240
- end
241
- end
242
- end
243
- header_params = {:headers => {'CustomHeader' => 'CustomHeader'}}
244
- client.auth_code.get_token('code', header_params)
245
- end
246
- end
247
- end
248
- end
249
-
250
- describe '#request' do
251
- it 'works with a null response body' do
252
- expect(subject.request(:get, 'empty_get').body).to eq('')
253
- end
254
-
255
- it 'returns on a successful response' do
256
- response = subject.request(:get, '/success')
257
- expect(response.body).to eq('yay')
258
- expect(response.status).to eq(200)
259
- expect(response.headers).to eq('Content-Type' => 'text/awesome')
260
- end
261
-
262
- it 'posts a body' do
263
- response = subject.request(:post, '/reflect', :body => 'foo=bar')
264
- expect(response.body).to eq('foo=bar')
265
- end
266
-
267
- it 'follows redirects properly' do
268
- response = subject.request(:get, '/redirect')
269
- expect(response.body).to eq('yay')
270
- expect(response.status).to eq(200)
271
- expect(response.headers).to eq('Content-Type' => 'text/awesome')
272
- end
273
-
274
- it 'redirects using GET on a 303' do
275
- response = subject.request(:post, '/redirect', :body => 'foo=bar')
276
- expect(response.body).to be_empty
277
- expect(response.status).to eq(200)
278
- end
279
-
280
- it 'obeys the :max_redirects option' do
281
- max_redirects = subject.options[:max_redirects]
282
- subject.options[:max_redirects] = 0
283
- response = subject.request(:get, '/redirect')
284
- expect(response.status).to eq(302)
285
- subject.options[:max_redirects] = max_redirects
286
- end
287
-
288
- it 'returns if raise_errors is false' do
289
- subject.options[:raise_errors] = false
290
- response = subject.request(:get, '/unauthorized')
291
-
292
- expect(response.status).to eq(401)
293
- expect(response.headers).to eq('Content-Type' => 'application/json')
294
- expect(response.error).not_to be_nil
295
- end
296
-
297
- %w[/unauthorized /conflict /error /different_encoding /ascii_8bit_encoding].each do |error_path|
298
- it "raises OAuth2::Error on error response to path #{error_path}" do
299
- expect { subject.request(:get, error_path) }.to raise_error(OAuth2::Error)
300
- end
301
- end
302
-
303
- # rubocop:disable Style/RedundantBegin
304
- it 're-encodes response body in the error message' do
305
- begin
306
- subject.request(:get, '/ascii_8bit_encoding')
307
- rescue StandardError => e
308
- expect(e.message.encoding.name).to eq('UTF-8')
309
- expect(e.message).to eq("invalid_request: é\n{\"error\":\"invalid_request\",\"error_description\":\"��\"}")
310
- end
311
- end
312
-
313
- it 'parses OAuth2 standard error response' do
314
- begin
315
- subject.request(:get, '/unauthorized')
316
- rescue StandardError => e
317
- expect(e.code).to eq(error_value)
318
- expect(e.description).to eq(error_description_value)
319
- expect(e.to_s).to match(/#{error_value}/)
320
- expect(e.to_s).to match(/#{error_description_value}/)
321
- end
322
- end
323
-
324
- it 'provides the response in the Exception' do
325
- begin
326
- subject.request(:get, '/error')
327
- rescue StandardError => e
328
- expect(e.response).not_to be_nil
329
- expect(e.to_s).to match(/unknown error/)
330
- end
331
- end
332
- # rubocop:enable Style/RedundantBegin
333
-
334
- context 'with ENV' do
335
- include_context 'with stubbed env'
336
- before do
337
- stub_env('OAUTH_DEBUG' => 'true')
338
- end
339
-
340
- it 'outputs to $stdout when OAUTH_DEBUG=true' do
341
- output = capture(:stdout) do
342
- subject.request(:get, '/success')
343
- end
344
- logs = [
345
- '-- request: GET https://api.example.com/success',
346
- '-- response: Status 200',
347
- '-- response: Content-Type: "text/awesome"',
348
- ]
349
- expect(output).to include(*logs)
350
- end
351
- end
352
- end
353
-
354
- describe '#get_token' do
355
- it 'returns a configured AccessToken' do
356
- client = stubbed_client do |stub|
357
- stub.post('/oauth/token') do
358
- [200, {'Content-Type' => 'application/json'}, MultiJson.encode('access_token' => 'the-token')]
359
- end
360
- end
361
-
362
- token = client.get_token({})
363
- expect(token).to be_a OAuth2::AccessToken
364
- expect(token.token).to eq('the-token')
365
- end
366
-
367
- it 'authenticates with request parameters' do
368
- client = stubbed_client(:auth_scheme => :request_body) do |stub|
369
- stub.post('/oauth/token', 'client_id' => 'abc', 'client_secret' => 'def') do |env|
370
- [200, {'Content-Type' => 'application/json'}, MultiJson.encode('access_token' => 'the-token')]
371
- end
372
- end
373
- client.get_token({})
374
- end
375
-
376
- it 'authenticates with Basic auth' do
377
- client = stubbed_client(:auth_scheme => :basic_auth) do |stub|
378
- stub.post('/oauth/token') do |env|
379
- raise Faraday::Adapter::Test::Stubs::NotFound unless env[:request_headers]['Authorization'] == OAuth2::Authenticator.encode_basic_auth('abc', 'def')
380
-
381
- [200, {'Content-Type' => 'application/json'}, MultiJson.encode('access_token' => 'the-token')]
382
- end
383
- end
384
- client.get_token({})
385
- end
386
-
387
- describe 'extract_access_token option' do
388
- let(:client) do
389
- client = stubbed_client(:extract_access_token => extract_access_token) do |stub|
390
- stub.post('/oauth/token') do
391
- [200, {'Content-Type' => 'application/json'}, MultiJson.encode('data' => {'access_token' => 'the-token'})]
392
- end
393
- end
394
- end
395
-
396
- context 'with proc extract_access_token' do
397
- let(:extract_access_token) do
398
- proc do |client, hash|
399
- token = hash['data']['access_token']
400
- OAuth2::AccessToken.new(client, token, hash)
401
- end
402
- end
403
-
404
- it 'returns a configured AccessToken' do
405
- token = client.get_token({})
406
- expect(token).to be_a OAuth2::AccessToken
407
- expect(token.token).to eq('the-token')
408
- end
409
- end
410
-
411
- context 'with depracted Class.from_hash option' do
412
- let(:extract_access_token) do
413
- CustomAccessToken = Class.new(OAuth2::AccessToken)
414
- CustomAccessToken.define_singleton_method(:from_hash) do |client, hash|
415
- token = hash['data']['access_token']
416
- OAuth2::AccessToken.new(client, token, hash)
417
- end
418
- CustomAccessToken
419
- end
420
-
421
- it 'returns a configured AccessToken' do
422
- token = client.get_token({})
423
- expect(token).to be_a OAuth2::AccessToken
424
- expect(token.token).to eq('the-token')
425
- end
426
- end
427
- end
428
-
429
- describe ':raise_errors flag' do
430
- let(:options) { {} }
431
- let(:token_response) { nil }
432
- let(:post_args) { [] }
433
-
434
- let(:client) do
435
- stubbed_client(options.merge(:raise_errors => raise_errors)) do |stub|
436
- stub.post('/oauth/token', *post_args) do
437
- # stub 200 response so that we're testing the get_token handling of :raise_errors flag not request
438
- [200, {'Content-Type' => 'application/json'}, token_response]
439
- end
440
- end
441
- end
442
-
443
- context 'when set to false' do
444
- let(:raise_errors) { false }
445
-
446
- context 'when the request body is nil' do
447
- it 'returns a nil :access_token' do
448
- expect(client.get_token({})).to eq(nil)
449
- end
450
- end
451
-
452
- context 'when the request body is missing the access_token' do
453
- let(:token_response) { MultiJson.encode('unexpected_access_token' => 'the-token') }
454
-
455
- it 'returns a nil :access_token' do
456
- expect(client.get_token({})).to eq(nil)
457
- end
458
- end
459
-
460
- context 'when the request body has an access token' do
461
- let(:token_response) { MultiJson.encode('access_token' => 'the-token') }
462
-
463
- it 'returns the parsed :access_token from body' do
464
- token = client.get_token({})
465
- expect(token).to be_a OAuth2::AccessToken
466
- expect(token.token).to eq('the-token')
467
- end
468
-
469
- context 'when :auth_scheme => :request_body' do
470
- context 'when arbitrary params are present' do
471
- let(:post_args) { ['arbitrary' => 'parameter', 'client_id' => 'abc', 'client_secret' => 'def'] }
472
- let(:options) { {:auth_scheme => :request_body} }
473
-
474
- it 'does not affect access token' do
475
- token = client.get_token(*post_args)
476
- expect(token).to be_a OAuth2::AccessToken
477
- expect(token.token).to eq('the-token')
478
- end
479
- end
480
- end
481
- end
482
-
483
- context 'when extract_access_token raises an exception' do
484
- let(:options) do
485
- {
486
- :extract_access_token => proc { |client, hash| raise ArgumentError },
487
- }
488
- end
489
-
490
- it 'returns a nil :access_token' do
491
- expect(client.get_token({})).to eq(nil)
492
- end
493
- end
494
- end
495
-
496
- context 'when set to true' do
497
- let(:raise_errors) { true }
498
-
499
- context 'when the request body is nil' do
500
- it 'raises an error' do
501
- expect { client.get_token({}) }.to raise_error OAuth2::Error
502
- end
503
- end
504
-
505
- context 'when the request body is missing the access_token' do
506
- let(:token_response) { MultiJson.encode('unexpected_access_token' => 'the-token') }
507
-
508
- it 'raises an error' do
509
- expect { client.get_token({}) }.to raise_error OAuth2::Error
510
- end
511
- end
512
-
513
- context 'when extract_access_token raises an exception' do
514
- let(:options) do
515
- {
516
- :extract_access_token => proc { |client, hash| raise ArgumentError },
517
- }
518
- end
519
-
520
- it 'raises an error' do
521
- expect { client.get_token({}) }.to raise_error OAuth2::Error
522
- end
523
- end
524
- end
525
- end
526
-
527
- def stubbed_client(params = {}, &stubs)
528
- params = {:site => 'https://api.example.com'}.merge(params)
529
- OAuth2::Client.new('abc', 'def', params) do |builder|
530
- builder.adapter :test, &stubs
531
- end
532
- end
533
- end
534
-
535
- it 'instantiates an AuthCode strategy with this client' do
536
- expect(subject.auth_code).to be_kind_of(OAuth2::Strategy::AuthCode)
537
- end
538
-
539
- it 'instantiates an Implicit strategy with this client' do
540
- expect(subject.implicit).to be_kind_of(OAuth2::Strategy::Implicit)
541
- end
542
-
543
- context 'with SSL options' do
544
- subject do
545
- cli = described_class.new('abc', 'def', :site => 'https://api.example.com', :ssl => {:ca_file => 'foo.pem'})
546
- cli.connection = Faraday.new(cli.site, cli.options[:connection_opts]) do |b|
547
- b.adapter :test
548
- end
549
- cli
550
- end
551
-
552
- it 'passes the SSL options along to Faraday::Connection#ssl' do
553
- expect(subject.connection.ssl.fetch(:ca_file)).to eq('foo.pem')
554
- end
555
- end
556
- end
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe OAuth2::MACToken do
4
- subject { described_class.new(client, token, 'abc123') }
5
-
6
- let(:token) { 'monkey' }
7
- let(:client) do
8
- OAuth2::Client.new('abc', 'def', :site => 'https://api.example.com') do |builder|
9
- builder.request :url_encoded
10
- builder.adapter :test do |stub|
11
- VERBS.each do |verb|
12
- stub.send(verb, '/token/header') { |env| [200, {}, env[:request_headers]['Authorization']] }
13
- end
14
- end
15
- end
16
- end
17
-
18
- describe '#initialize' do
19
- it 'assigns client and token' do
20
- expect(subject.client).to eq(client)
21
- expect(subject.token).to eq(token)
22
- end
23
-
24
- it 'assigns secret' do
25
- expect(subject.secret).to eq('abc123')
26
- end
27
-
28
- it 'defaults algorithm to hmac-sha-256' do
29
- pending_for(:engine => 'ruby', :versions => '1.9.3', :reason => "Ruby 1.9's OpenSSL uses instance of OpenSSL::Digest")
30
- expect(subject.algorithm).to be_instance_of(OpenSSL::Digest::SHA256)
31
- end
32
-
33
- it 'handles hmac-sha-256' do
34
- pending_for(:engine => 'ruby', :versions => '1.9.3', :reason => "Ruby 1.9's OpenSSL uses instance of OpenSSL::Digest")
35
- mac = described_class.new(client, token, 'abc123', :algorithm => 'hmac-sha-256')
36
- expect(mac.algorithm).to be_instance_of(OpenSSL::Digest::SHA256)
37
- end
38
-
39
- it 'handles hmac-sha-1' do
40
- pending_for(:engine => 'ruby', :versions => '1.9.3', :reason => "Ruby 1.9's OpenSSL uses instance of OpenSSL::Digest")
41
- mac = described_class.new(client, token, 'abc123', :algorithm => 'hmac-sha-1')
42
- expect(mac.algorithm).to be_instance_of(OpenSSL::Digest::SHA1)
43
- end
44
-
45
- it 'raises on improper algorithm' do
46
- expect { described_class.new(client, token, 'abc123', :algorithm => 'invalid-sha') }.to raise_error(ArgumentError)
47
- end
48
- end
49
-
50
- describe '#request' do
51
- VERBS.each do |verb|
52
- it "sends the token in the Authorization header for a #{verb.to_s.upcase} request" do
53
- expect(subject.post('/token/header').body).to include("MAC id=\"#{token}\"")
54
- end
55
- end
56
- end
57
-
58
- describe '#header' do
59
- it 'does not generate the same header twice' do
60
- header = subject.header('get', 'https://www.example.com/hello')
61
- duplicate_header = subject.header('get', 'https://www.example.com/hello')
62
-
63
- expect(header).not_to eq(duplicate_header)
64
- end
65
-
66
- it 'generates the proper format' do
67
- header = subject.header('get', 'https://www.example.com/hello?a=1')
68
- expect(header).to match(/MAC id="#{token}", ts="[0-9]+", nonce="[^"]+", mac="[^"]+"/)
69
- end
70
-
71
- it 'passes ArgumentError with an invalid url' do
72
- expect { subject.header('get', 'this-is-not-valid') }.to raise_error(ArgumentError)
73
- end
74
-
75
- it 'passes URI::InvalidURIError through' do
76
- expect { subject.header('get', nil) }.to raise_error(URI::InvalidURIError)
77
- end
78
- end
79
-
80
- describe '#signature' do
81
- it 'generates properly' do
82
- signature = subject.signature(0, 'random-string', 'get', URI('https://www.google.com'))
83
- expect(signature).to eq('rMDjVA3VJj3v1OmxM29QQljKia6msl5rjN83x3bZmi8=')
84
- end
85
- end
86
-
87
- describe '#headers' do
88
- it 'is an empty hash' do
89
- expect(subject.headers).to eq({})
90
- end
91
- end
92
-
93
- describe '.from_access_token' do
94
- subject { described_class.from_access_token(access_token, 'hello') }
95
-
96
- let(:access_token) do
97
- OAuth2::AccessToken.new(
98
- client, token,
99
- :expires_at => 1,
100
- :expires_in => 1,
101
- :refresh_token => 'abc',
102
- :random => 1
103
- )
104
- end
105
-
106
- it 'initializes client, token, and secret properly' do
107
- expect(subject.client).to eq(client)
108
- expect(subject.token).to eq(token)
109
- expect(subject.secret).to eq('hello')
110
- end
111
-
112
- it 'initializes configuration options' do
113
- expect(subject.expires_at).to eq(1)
114
- expect(subject.expires_in).to eq(1)
115
- expect(subject.refresh_token).to eq('abc')
116
- end
117
-
118
- it 'initializes params' do
119
- expect(subject.params).to eq(:random => 1)
120
- end
121
- end
122
- end