lhc 13.0.0 → 15.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rubocop.yml +15 -0
- data/.github/workflows/test.yml +15 -0
- data/.rubocop.yml +344 -19
- data/.ruby-version +1 -1
- data/README.md +89 -0
- data/Rakefile +3 -3
- data/lhc.gemspec +3 -1
- data/lib/lhc.rb +70 -59
- data/lib/lhc/concerns/lhc/fix_invalid_encoding_concern.rb +1 -0
- data/lib/lhc/config.rb +16 -0
- data/lib/lhc/endpoint.rb +3 -0
- data/lib/lhc/error.rb +7 -4
- data/lib/lhc/interceptor.rb +4 -0
- data/lib/lhc/interceptors.rb +1 -0
- data/lib/lhc/interceptors/auth.rb +10 -5
- data/lib/lhc/interceptors/caching.rb +14 -3
- data/lib/lhc/interceptors/logging.rb +4 -2
- data/lib/lhc/interceptors/monitoring.rb +46 -11
- data/lib/lhc/interceptors/retry.rb +2 -0
- data/lib/lhc/interceptors/rollbar.rb +3 -2
- data/lib/lhc/interceptors/throttle.rb +7 -2
- data/lib/lhc/interceptors/zipkin.rb +2 -0
- data/lib/lhc/request.rb +37 -4
- data/lib/lhc/response.rb +1 -0
- data/lib/lhc/response/data.rb +1 -1
- data/lib/lhc/scrubber.rb +45 -0
- data/lib/lhc/scrubbers/auth_scrubber.rb +33 -0
- data/lib/lhc/scrubbers/body_scrubber.rb +28 -0
- data/lib/lhc/scrubbers/headers_scrubber.rb +38 -0
- data/lib/lhc/scrubbers/params_scrubber.rb +14 -0
- data/lib/lhc/version.rb +1 -1
- data/spec/config/scrubs_spec.rb +108 -0
- data/spec/error/to_s_spec.rb +13 -8
- data/spec/formats/multipart_spec.rb +2 -2
- data/spec/formats/plain_spec.rb +1 -1
- data/spec/interceptors/after_response_spec.rb +1 -1
- data/spec/interceptors/caching/main_spec.rb +2 -2
- data/spec/interceptors/caching/multilevel_cache_spec.rb +2 -1
- data/spec/interceptors/define_spec.rb +1 -0
- data/spec/interceptors/logging/main_spec.rb +21 -1
- data/spec/interceptors/monitoring/caching_spec.rb +66 -0
- data/spec/interceptors/response_competition_spec.rb +2 -2
- data/spec/interceptors/return_response_spec.rb +2 -2
- data/spec/interceptors/rollbar/main_spec.rb +27 -15
- data/spec/request/scrubbed_headers_spec.rb +101 -0
- data/spec/request/scrubbed_options_spec.rb +194 -0
- data/spec/request/scrubbed_params_spec.rb +35 -0
- data/spec/response/data_spec.rb +2 -2
- data/spec/support/zipkin_mock.rb +1 -0
- metadata +40 -21
- data/.rubocop.localch.yml +0 -325
- data/cider-ci.yml +0 -5
- data/cider-ci/bin/bundle +0 -51
- data/cider-ci/bin/ruby_install +0 -8
- data/cider-ci/bin/ruby_version +0 -25
- data/cider-ci/jobs/rspec-activesupport-5.yml +0 -27
- data/cider-ci/jobs/rspec-activesupport-6.yml +0 -28
- data/cider-ci/jobs/rubocop.yml +0 -18
- data/cider-ci/task_components/bundle.yml +0 -22
- data/cider-ci/task_components/rspec.yml +0 -36
- data/cider-ci/task_components/rubocop.yml +0 -29
- data/cider-ci/task_components/ruby.yml +0 -15
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
describe LHC::Monitoring do
|
6
|
+
let(:stub) do
|
7
|
+
stub_request(:get, 'http://local.ch').to_return(status: 200, body: 'The Website')
|
8
|
+
end
|
9
|
+
|
10
|
+
module Statsd
|
11
|
+
def self.count(_path, _value); end
|
12
|
+
|
13
|
+
def self.timing(_path, _value); end
|
14
|
+
end
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
LHC::Monitoring.statsd = Statsd
|
18
|
+
Rails.cache.clear
|
19
|
+
allow(Statsd).to receive(:count).with('lhc.dummy.test.local_ch.get.before_request', 1)
|
20
|
+
allow(Statsd).to receive(:count).with('lhc.dummy.test.local_ch.get.count', 1)
|
21
|
+
allow(Statsd).to receive(:count).with('lhc.dummy.test.local_ch.get.after_request', 1)
|
22
|
+
allow(Statsd).to receive(:count).with('lhc.dummy.test.local_ch.get.200', 1)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'interceptors configured correctly' do
|
26
|
+
before do
|
27
|
+
LHC.config.interceptors = [LHC::Caching, LHC::Monitoring]
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'requesting with cache option' do
|
31
|
+
it 'monitors miss/hit for caching' do
|
32
|
+
stub
|
33
|
+
expect(Statsd).to receive(:count).with('lhc.dummy.test.local_ch.get.cache.miss', 1)
|
34
|
+
expect(Statsd).to receive(:count).with('lhc.dummy.test.local_ch.get.cache.hit', 1)
|
35
|
+
LHC.get('http://local.ch', cache: true)
|
36
|
+
LHC.get('http://local.ch', cache: true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'request uncached' do
|
41
|
+
it 'requesting without cache option' do
|
42
|
+
stub
|
43
|
+
expect(Statsd).not_to receive(:count).with('lhc.dummy.test.local_ch.get.cache.miss', 1)
|
44
|
+
expect(Statsd).not_to receive(:count).with('lhc.dummy.test.local_ch.get.cache.hit', 1)
|
45
|
+
LHC.get('http://local.ch')
|
46
|
+
LHC.get('http://local.ch')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'wrong interceptor order' do
|
52
|
+
before(:each) do
|
53
|
+
LHC.config.interceptors = [LHC::Monitoring, LHC::Caching] # monitoring needs to be after Caching
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'does monitors miss/hit for caching and warns about wrong order of interceptors' do
|
57
|
+
stub
|
58
|
+
expect(Statsd).not_to receive(:count).with('lhc.dummy.test.local_ch.get.cache.miss', 1)
|
59
|
+
expect(Statsd).not_to receive(:count).with('lhc.dummy.test.local_ch.get.cache.hit', 1)
|
60
|
+
expect(-> {
|
61
|
+
LHC.get('http://local.ch', cache: true)
|
62
|
+
LHC.get('http://local.ch', cache: true)
|
63
|
+
}).to output("[WARNING] Your interceptors must include LHC::Caching and LHC::Monitoring and also in that order.\n[WARNING] Your interceptors must include LHC::Caching and LHC::Monitoring and also in that order.\n").to_stderr
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -12,7 +12,7 @@ describe LHC do
|
|
12
12
|
|
13
13
|
def before_request
|
14
14
|
if @@cached
|
15
|
-
return LHC::Response.new(Typhoeus::Response.new(response_body: 'Im served from local cache'), nil)
|
15
|
+
return LHC::Response.new(Typhoeus::Response.new(response_code: 200, return_code: :ok, response_body: 'Im served from local cache'), nil)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -22,7 +22,7 @@ describe LHC do
|
|
22
22
|
|
23
23
|
def before_request
|
24
24
|
if request.response.nil?
|
25
|
-
return LHC::Response.new(Typhoeus::Response.new(response_body: 'Im served from remote cache'), nil)
|
25
|
+
return LHC::Response.new(Typhoeus::Response.new(response_code: 200, return_code: :ok, response_body: 'Im served from remote cache'), nil)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -8,7 +8,7 @@ describe LHC do
|
|
8
8
|
class CacheInterceptor < LHC::Interceptor
|
9
9
|
|
10
10
|
def before_request
|
11
|
-
LHC::Response.new(Typhoeus::Response.new(response_body: 'Im served from cache'), nil)
|
11
|
+
LHC::Response.new(Typhoeus::Response.new(response_code: 200, return_code: :ok, response_body: 'Im served from cache'), nil)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
LHC.configure { |c| c.interceptors = [CacheInterceptor] }
|
@@ -23,7 +23,7 @@ describe LHC do
|
|
23
23
|
before(:each) do
|
24
24
|
class AnotherInterceptor < LHC::Interceptor
|
25
25
|
def before_request
|
26
|
-
LHC::Response.new(Typhoeus::Response.new(
|
26
|
+
LHC::Response.new(Typhoeus::Response.new(response_code: 200, return_code: :ok), nil)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -36,22 +36,34 @@ describe LHC::Rollbar do
|
|
36
36
|
)
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
additional: 'data'
|
52
|
-
)
|
39
|
+
it 'does report errors to rollbar with additional data' do
|
40
|
+
stub_request(:get, 'http://local.ch')
|
41
|
+
.to_return(status: 400)
|
42
|
+
expect(-> { LHC.get('http://local.ch', rollbar: { additional: 'data' }) })
|
43
|
+
.to raise_error LHC::BadRequest
|
44
|
+
expect(::Rollbar).to have_received(:warning)
|
45
|
+
.with(
|
46
|
+
'Status: 400 URL: http://local.ch',
|
47
|
+
hash_including(
|
48
|
+
response: anything,
|
49
|
+
request: anything,
|
50
|
+
additional: 'data'
|
53
51
|
)
|
54
|
-
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'scrubs sensitive data' do
|
56
|
+
LHC.config.scrubs[:params] << 'api_key'
|
57
|
+
LHC.config.scrubs[:headers] << 'private_key'
|
58
|
+
stub_request(:get, 'http://local.ch?api_key=123-abc').to_return(status: 400)
|
59
|
+
expect(-> { LHC.get('http://local.ch', params: { api_key: '123-abc' }, headers: { private_key: 'abc-123' }) })
|
60
|
+
.to raise_error LHC::BadRequest
|
61
|
+
expect(::Rollbar).to have_received(:warning)
|
62
|
+
.with(
|
63
|
+
'Status: 400 URL: http://local.ch',
|
64
|
+
response: hash_including(body: anything, code: anything, headers: anything, time: anything, timeout?: anything),
|
65
|
+
request: hash_including(url: anything, method: anything, headers: hash_including(private_key: LHC::Scrubber::SCRUB_DISPLAY), params: { api_key: LHC::Scrubber::SCRUB_DISPLAY })
|
66
|
+
)
|
55
67
|
end
|
56
68
|
end
|
57
69
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
describe LHC::Request do
|
6
|
+
let(:headers) { { private_key: 'xyz-123' } }
|
7
|
+
let(:response) { LHC.get(:local, headers: headers) }
|
8
|
+
let(:auth) { {} }
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
LHC.config.endpoint(:local, 'http://local.ch', auth: auth)
|
12
|
+
stub_request(:get, 'http://local.ch').with(headers: headers)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'scrubs "private_key"' do
|
16
|
+
LHC.config.scrubs[:headers] << 'private_key'
|
17
|
+
expect(response.request.scrubbed_headers).to include(private_key: LHC::Scrubber::SCRUB_DISPLAY)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'does not add a new attribute when a non existing header should be scrubbed' do
|
21
|
+
LHC.config.scrubs[:headers] << 'anything'
|
22
|
+
expect(response.request.scrubbed_headers).not_to include('anything' => LHC::Scrubber::SCRUB_DISPLAY)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when strings instead of symbols are provided' do
|
26
|
+
let(:headers) { { 'private_key' => 'xyz-123' } }
|
27
|
+
|
28
|
+
it 'scrubs "private_key"' do
|
29
|
+
LHC.config.scrubs[:headers] << 'private_key'
|
30
|
+
expect(response.request.scrubbed_headers).to include('private_key' => LHC::Scrubber::SCRUB_DISPLAY)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'other authentication strategy' do
|
35
|
+
let(:api_key) { '123456' }
|
36
|
+
let(:authorization_header) { { 'Authorization' => "Apikey #{api_key}" } }
|
37
|
+
let(:headers) { authorization_header }
|
38
|
+
|
39
|
+
it 'provides srubbed Authorization header' do
|
40
|
+
LHC.config.scrubs[:headers] << 'Authorization'
|
41
|
+
expect(response.request.scrubbed_headers).to include('Authorization' => LHC::Scrubber::SCRUB_DISPLAY)
|
42
|
+
expect(response.request.headers).to include(authorization_header)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'auth' do
|
47
|
+
before :each do
|
48
|
+
LHC.config.interceptors = [LHC::Auth]
|
49
|
+
stub_request(:get, 'http://local.ch').with(headers: authorization_header)
|
50
|
+
end
|
51
|
+
|
52
|
+
let(:request) do
|
53
|
+
response = LHC.get(:local)
|
54
|
+
response.request
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'bearer authentication' do
|
58
|
+
let(:bearer_token) { '123456' }
|
59
|
+
let(:authorization_header) { { 'Authorization' => "Bearer #{bearer_token}" } }
|
60
|
+
let(:auth) { { bearer: -> { bearer_token } } }
|
61
|
+
|
62
|
+
it 'provides srubbed request headers' do
|
63
|
+
expect(request.scrubbed_headers).to include('Authorization' => "Bearer #{LHC::Scrubber::SCRUB_DISPLAY}")
|
64
|
+
expect(request.headers).to include(authorization_header)
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when nothing should get scrubbed' do
|
68
|
+
before :each do
|
69
|
+
LHC.config.scrubs = {}
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'does not filter beaerer auth' do
|
73
|
+
expect(request.scrubbed_headers).to include(authorization_header)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'basic authentication' do
|
79
|
+
let(:username) { 'steve' }
|
80
|
+
let(:password) { 'abcdefg' }
|
81
|
+
let(:credentials_base_64_codiert) { Base64.strict_encode64("#{username}:#{password}").chomp }
|
82
|
+
let(:authorization_header) { { 'Authorization' => "Basic #{credentials_base_64_codiert}" } }
|
83
|
+
let(:auth) { { basic: { username: username, password: password } } }
|
84
|
+
|
85
|
+
it 'provides srubbed request headers' do
|
86
|
+
expect(request.scrubbed_headers).to include('Authorization' => "Basic #{LHC::Scrubber::SCRUB_DISPLAY}")
|
87
|
+
expect(request.headers).to include(authorization_header)
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'when nothing should get scrubbed' do
|
91
|
+
before :each do
|
92
|
+
LHC.config.scrubs = {}
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'does not filter basic auth' do
|
96
|
+
expect(request.scrubbed_headers).to include(authorization_header)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
describe LHC::Request do
|
6
|
+
before :each do
|
7
|
+
LHC.config.interceptors = [LHC::Auth]
|
8
|
+
LHC.config.endpoint(:local, 'http://local.ch', auth: auth)
|
9
|
+
LHC.config.scrubs[:params] << 'api_key'
|
10
|
+
LHC.config.scrubs[:headers] << 'private_key'
|
11
|
+
LHC.config.scrubs[:body] << 'user_token'
|
12
|
+
stub_request(:post, "http://local.ch?#{params.to_query}").with(headers: authorization_header.merge(headers), body: body.to_json)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:bearer_token) { '123456' }
|
16
|
+
let(:authorization_header) { { 'Authorization' => "Bearer #{bearer_token}" } }
|
17
|
+
let(:auth) { { bearer: -> { bearer_token } } }
|
18
|
+
let(:params) { { api_key: 'api-key-params' } }
|
19
|
+
let(:headers) { { private_key: 'private-key-header' } }
|
20
|
+
let(:body) { { user_token: 'user-token-body' } }
|
21
|
+
|
22
|
+
let(:request) do
|
23
|
+
response = LHC.post(:local, params: params, headers: headers, body: body)
|
24
|
+
response.request
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'provides srubbed request options' do
|
28
|
+
expect(request.scrubbed_options[:params]).to include(api_key: LHC::Scrubber::SCRUB_DISPLAY)
|
29
|
+
expect(request.scrubbed_options[:headers]).to include(private_key: LHC::Scrubber::SCRUB_DISPLAY)
|
30
|
+
expect(request.scrubbed_options[:body]).to include(user_token: LHC::Scrubber::SCRUB_DISPLAY)
|
31
|
+
expect(request.scrubbed_options[:auth][:bearer_token]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
32
|
+
expect(request.scrubbed_options[:auth][:basic]).to be nil
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when bearer auth is not a proc' do
|
36
|
+
let(:auth) { { bearer: bearer_token } }
|
37
|
+
|
38
|
+
it 'also scrubbes the bearer' do
|
39
|
+
expect(request.scrubbed_options[:auth][:bearer]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
40
|
+
expect(request.scrubbed_options[:auth][:bearer_token]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when options do not have auth' do
|
45
|
+
let(:authorization_header) { {} }
|
46
|
+
let(:auth) { nil }
|
47
|
+
|
48
|
+
it 'provides srubbed request options' do
|
49
|
+
expect(request.scrubbed_options[:params]).to include(api_key: LHC::Scrubber::SCRUB_DISPLAY)
|
50
|
+
expect(request.scrubbed_options[:headers]).to include(private_key: LHC::Scrubber::SCRUB_DISPLAY)
|
51
|
+
expect(request.scrubbed_options[:body]).to include(user_token: LHC::Scrubber::SCRUB_DISPLAY)
|
52
|
+
expect(request.scrubbed_options[:auth]).to be nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when body data is nested' do
|
57
|
+
let(:body) do
|
58
|
+
{
|
59
|
+
data: {
|
60
|
+
attributes: {
|
61
|
+
employee: {
|
62
|
+
name: 'Muster',
|
63
|
+
surname: 'Hans',
|
64
|
+
password: 'test-1234',
|
65
|
+
password_confirmation: 'test-1234'
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'srubbes nested attributes' do
|
73
|
+
expect(request.scrubbed_options[:params]).to include(api_key: LHC::Scrubber::SCRUB_DISPLAY)
|
74
|
+
expect(request.scrubbed_options[:headers]).to include(private_key: LHC::Scrubber::SCRUB_DISPLAY)
|
75
|
+
expect(request.scrubbed_options[:body][:data][:attributes][:employee]).to include(password: LHC::Scrubber::SCRUB_DISPLAY)
|
76
|
+
expect(request.scrubbed_options[:body][:data][:attributes][:employee]).to include(password_confirmation: LHC::Scrubber::SCRUB_DISPLAY)
|
77
|
+
expect(request.scrubbed_options[:auth][:bearer_token]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
78
|
+
expect(request.scrubbed_options[:auth][:basic]).to be nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'basic authentication' do
|
83
|
+
let(:username) { 'steve' }
|
84
|
+
let(:password) { 'abcdefg' }
|
85
|
+
let(:credentials_base_64_codiert) { Base64.strict_encode64("#{username}:#{password}").chomp }
|
86
|
+
let(:authorization_header) { { 'Authorization' => "Basic #{credentials_base_64_codiert}" } }
|
87
|
+
let(:auth) { { basic: { username: username, password: password } } }
|
88
|
+
|
89
|
+
it 'provides srubbed request headers' do
|
90
|
+
expect(request.scrubbed_options[:auth][:basic][:username]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
91
|
+
expect(request.scrubbed_options[:auth][:basic][:password]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
92
|
+
expect(request.scrubbed_options[:auth][:basic][:base_64_encoded_credentials]).to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
93
|
+
expect(request.scrubbed_options[:auth][:bearer]).to be nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when nothing should get scrubbed' do
|
98
|
+
before :each do
|
99
|
+
LHC.config.scrubs = {}
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'does not filter anything' do
|
103
|
+
expect(request.scrubbed_options[:params]).not_to include(api_key: LHC::Scrubber::SCRUB_DISPLAY)
|
104
|
+
expect(request.scrubbed_options[:headers]).not_to include(private_key: LHC::Scrubber::SCRUB_DISPLAY)
|
105
|
+
expect(request.scrubbed_options[:body]).not_to include(user_token: LHC::Scrubber::SCRUB_DISPLAY)
|
106
|
+
expect(request.scrubbed_options[:auth][:bearer_token]).not_to eq(LHC::Scrubber::SCRUB_DISPLAY)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'custom data structures that respond to as_json (like LHS data or record)' do
|
111
|
+
before do
|
112
|
+
class CustomStructure
|
113
|
+
|
114
|
+
def initialize(data)
|
115
|
+
@data = data
|
116
|
+
end
|
117
|
+
|
118
|
+
def as_json
|
119
|
+
@data.as_json
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_json
|
123
|
+
as_json.to_json
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
stub_request(:post, 'http://local.ch').with(body: custom_structure.to_json)
|
128
|
+
end
|
129
|
+
|
130
|
+
let(:custom_structure) do
|
131
|
+
CustomStructure.new(user_token: '12345')
|
132
|
+
end
|
133
|
+
|
134
|
+
let(:request) do
|
135
|
+
response = LHC.post(:local, body: custom_structure)
|
136
|
+
response.request
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'provides srubbed request options' do
|
140
|
+
expect(request.scrubbed_options[:body]).to include('user_token' => LHC::Scrubber::SCRUB_DISPLAY)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'encoded data hash' do
|
145
|
+
let(:body) { { user_token: 'user-token-body' } }
|
146
|
+
|
147
|
+
let(:request) do
|
148
|
+
response = LHC.post(:local, body: body.to_json)
|
149
|
+
response.request
|
150
|
+
end
|
151
|
+
|
152
|
+
before :each do
|
153
|
+
stub_request(:post, 'http://local.ch').with(body: body.to_json)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'provides srubbed request options' do
|
157
|
+
expect(request.scrubbed_options[:body]).to include('user_token' => LHC::Scrubber::SCRUB_DISPLAY)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'array' do
|
162
|
+
let(:body) { [{ user_token: 'user-token-body' }] }
|
163
|
+
|
164
|
+
let(:request) do
|
165
|
+
response = LHC.post(:local, body: body)
|
166
|
+
response.request
|
167
|
+
end
|
168
|
+
|
169
|
+
before :each do
|
170
|
+
stub_request(:post, 'http://local.ch').with(body: body.to_json)
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'provides srubbed request options' do
|
174
|
+
expect(request.scrubbed_options[:body]).to eq([user_token: LHC::Scrubber::SCRUB_DISPLAY])
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'encoded array' do
|
179
|
+
let(:body) { [{ user_token: 'user-token-body' }] }
|
180
|
+
|
181
|
+
let(:request) do
|
182
|
+
response = LHC.post(:local, body: body.to_json)
|
183
|
+
response.request
|
184
|
+
end
|
185
|
+
|
186
|
+
before :each do
|
187
|
+
stub_request(:post, 'http://local.ch').with(body: body.to_json)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'provides srubbed request options' do
|
191
|
+
expect(request.scrubbed_options[:body]).to eq(['user_token' => LHC::Scrubber::SCRUB_DISPLAY])
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|