finapps_core 5.0.7 → 5.0.8

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.
@@ -13,9 +13,8 @@ module FinAppsCore
13
13
  def initialize(options = {})
14
14
  FinAppsCore::REST::Defaults::DEFAULTS.merge(remove_empty_options(options))
15
15
  .each {|key, value| public_send("#{key}=", value) }
16
-
17
- raise FinAppsCore::InvalidArgumentsError, "Invalid argument. {host: #{host}}" unless valid_host?
18
- raise FinAppsCore::InvalidArgumentsError, "Invalid argument. {timeout: #{timeout}}" unless timeout.integer?
16
+ fail_invalid_host
17
+ fail_invalid_timeout
19
18
  end
20
19
 
21
20
  def valid_user_credentials?
@@ -24,6 +23,20 @@ module FinAppsCore
24
23
 
25
24
  private
26
25
 
26
+ def fail_invalid_host
27
+ return if valid_host?
28
+
29
+ fail FinAppsCore::InvalidArgumentsError,
30
+ "Invalid argument. {host: #{host}}"
31
+ end
32
+
33
+ def fail_invalid_timeout
34
+ return if timeout.integer?
35
+
36
+ fail FinAppsCore::InvalidArgumentsError,
37
+ "Invalid argument. {timeout: #{timeout}}"
38
+ end
39
+
27
40
  def valid_host?
28
41
  host.start_with?('http://', 'https://')
29
42
  end
@@ -8,40 +8,49 @@ module FinAppsCore
8
8
  options = connection_options config
9
9
 
10
10
  Faraday.new(options) do |conn|
11
- conn.request :accept_json
12
- conn.request :user_agent
13
- if config.valid_user_credentials?
14
- conn.request :no_encoding_basic_authentication, config.user_token
15
- else
16
- conn.request :tenant_authentication, config.tenant_token
17
- end
18
- conn.request :x_consumer_id, config.consumer_id if config.consumer_id
19
- conn.request :json
20
- conn.request :retry
21
- conn.request :multipart
22
- conn.request :url_encoded
23
- conn.request :request_id, config.request_id if config.request_id
24
-
25
11
  conn.use FinAppsCore::Middleware::RaiseError
26
- conn.response :json,
27
- content_type: /\bjson$/,
28
- parser_options: { symbolize_names: true }
29
- conn.response :logger, logger, bodies: true
12
+ init_connection_request conn, config
13
+ init_connection_response conn, logger
14
+ init_connection_auth conn, config
30
15
 
31
16
  # Adapter (ensure that the adapter is always last.)
32
17
  conn.adapter Faraday.default_adapter
33
18
  end
34
19
  end
35
- module_function :faraday
20
+
21
+ def init_connection_response(conn, logger)
22
+ conn.response :logger, logger, bodies: true
23
+ conn.response :json,
24
+ content_type: /\bjson$/,
25
+ parser_options: {symbolize_names: true}
26
+ end
27
+
28
+ def init_connection_request(conn, config)
29
+ conn.request :accept_json
30
+ conn.request :user_agent
31
+ conn.request :x_consumer_id, config.consumer_id if config.consumer_id
32
+ conn.request :json
33
+ conn.request :retry
34
+ conn.request :multipart
35
+ conn.request :url_encoded
36
+ conn.request :request_id, config.request_id if config.request_id
37
+ end
38
+
39
+ def init_connection_auth(conn, config)
40
+ if config.valid_user_credentials?
41
+ conn.request :no_encoding_basic_authentication, config.user_token
42
+ else
43
+ conn.request :tenant_authentication, config.tenant_token
44
+ end
45
+ end
36
46
 
37
47
  def connection_options(config)
38
48
  {
39
49
  url: "#{config.host}/v#{Defaults::API_VERSION}/",
40
- request: { open_timeout: config.timeout,
41
- timeout: config.timeout }
50
+ request: {open_timeout: config.timeout,
51
+ timeout: config.timeout}
42
52
  }
43
53
  end
44
- module_function :connection_options
45
54
  end
46
55
  end
47
56
  end
@@ -12,7 +12,7 @@ module FinAppsCore
12
12
  host: 'https://api.finclear.io',
13
13
  timeout: 30,
14
14
  proxy: nil,
15
- log_level: Logger::INFO
15
+ log_level: Logger::UNKNOWN
16
16
  }.freeze
17
17
  end
18
18
  end
@@ -8,7 +8,7 @@ module FinAppsCore
8
8
  # Adds validation capabilities when included into other classes
9
9
  module Validatable
10
10
  def not_blank(value, name = nil)
11
- raise FinAppsCore::MissingArgumentsError, name.nil? ? nil : ": #{name}" if nil_or_empty?(value)
11
+ fail FinAppsCore::MissingArgumentsError, name.nil? ? nil : ": #{name}" if nil_or_empty?(value)
12
12
  end
13
13
 
14
14
  def nil_or_empty?(value)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FinAppsCore
4
- VERSION = '5.0.7'
4
+ VERSION = '5.0.8'
5
5
  end
@@ -2,16 +2,15 @@
2
2
 
3
3
  RSpec.describe ObjectExtensions do
4
4
  context 'when refining Object' do
5
- using ObjectExtensions
5
+ using described_class
6
6
 
7
7
  describe '#integer?' do
8
- context 'for integers' do
9
- subject { rand(1..10) }
10
- it { expect(subject.integer?).to eq(true) }
8
+ context 'with integers' do
9
+ it { expect(rand(1..10).integer?).to eq(true) }
11
10
  end
12
- context 'for non integers' do
13
- subject { rand }
14
- it { expect(subject.integer?).to eq(false) }
11
+
12
+ context 'with non integers' do
13
+ it { expect(rand.integer?).to eq(false) }
15
14
  end
16
15
  end
17
16
  end
@@ -2,12 +2,16 @@
2
2
 
3
3
  RSpec.describe FinAppsCore::Middleware::AcceptJson do
4
4
  let(:fake_app) { proc {|env| env } }
5
+
5
6
  describe '#call' do
6
- subject { FinAppsCore::Middleware::AcceptJson.new(fake_app) }
7
- env = { request_headers: {} }
7
+ subject(:accept_json) { described_class.new(fake_app) }
8
+
9
+ env = {request_headers: {}}
8
10
 
9
11
  it('generates a UserAgent header') do
10
- expect(subject.call(env)[:request_headers][FinAppsCore::Middleware::AcceptJson::KEY]).to eq('application/json')
12
+ header_key = FinAppsCore::Middleware::AcceptJson::KEY
13
+ expect(accept_json.call(env)[:request_headers][header_key])
14
+ .to eq('application/json')
11
15
  end
12
16
  end
13
17
  end
@@ -7,22 +7,31 @@ RSpec.describe FinAppsCore::Middleware::NoEncodingBasicAuthentication do
7
7
  app = proc {|env| env }
8
8
 
9
9
  context 'when credentials were provided' do
10
- let(:middleware) { FinAppsCore::Middleware::NoEncodingBasicAuthentication.new(app, :token) }
10
+ let(:middleware) { described_class.new(app, :token) }
11
11
  let(:expected_header_value) { 'Bearer token' }
12
12
 
13
13
  context 'when header was not previously set' do
14
- let(:request_env) { { request_headers: {} } }
15
14
  subject(:result) { middleware.call(request_env) }
16
15
 
17
- it('generates a header') { expect(result[:request_headers][key]).to eq(expected_header_value) }
16
+ let(:request_env) { {request_headers: {}} }
17
+
18
+ it('generates a header') {
19
+ expect(result[:request_headers][key]).to eq(expected_header_value)
20
+ }
18
21
  end
19
22
 
20
23
  context 'when header was previously set' do
21
- let(:request_env) { { request_headers: { key => 'foo' } } }
22
24
  subject(:result) { middleware.call(request_env) }
23
25
 
24
- it('does not override existing header') { expect(result[:request_headers][key]).to eq('foo') }
25
- it('does not generate a header') { expect(result[:request_headers][key]).to_not eq(expected_header_value) }
26
+ let(:request_env) { {request_headers: {key => 'foo'}} }
27
+
28
+ it('does not override existing header') {
29
+ expect(result[:request_headers][key]).to eq('foo')
30
+ }
31
+
32
+ it('does not generate a header') {
33
+ expect(result[:request_headers][key]).not_to eq(expected_header_value)
34
+ }
26
35
  end
27
36
  end
28
37
  end
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe FinAppsCore::Middleware::RequestId do
4
- let(:key) { FinAppsCore::Middleware::RequestId::KEY }
5
4
  let(:id) { 'request_id' }
6
5
  let(:fake_app) { proc {|env| env } }
7
- let(:env) { { request_headers: {} } }
6
+ let(:env) { {request_headers: {}} }
8
7
 
9
8
  describe '#call' do
10
- subject { FinAppsCore::Middleware::RequestId.new(fake_app, id) }
9
+ subject(:request_id) { described_class.new(fake_app, id) }
11
10
 
12
11
  it('generates a X-Request-Id header') do
13
- expect(subject.call(env)[:request_headers][key]).to eq(id)
12
+ key = FinAppsCore::Middleware::RequestId::KEY
13
+ expect(request_id.call(env)[:request_headers][key]).to eq(id)
14
14
  end
15
15
  end
16
16
  end
@@ -1,30 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe FinAppsCore::Middleware::TenantAuthentication do
4
- let(:valid_tenant_options) { VALID_CREDENTIALS }
5
- let(:key) { FinAppsCore::Middleware::TenantAuthentication::KEY }
6
-
7
4
  describe '#call' do
8
- fake_app = proc {|env| env }
5
+ subject(:actual_header) do
6
+ middleware.call(request_env)[:request_headers][key]
7
+ end
9
8
 
10
9
  context 'when company credentials were provided' do
11
- let(:middleware) { FinAppsCore::Middleware::TenantAuthentication.new(fake_app, VALID_CREDENTIALS[:token]) }
12
- let(:expected_header) { valid_tenant_options[:token] }
10
+ let(:key) { FinAppsCore::Middleware::TenantAuthentication::KEY }
11
+ let(:middleware) do
12
+ fake_app = proc {|env| env }
13
+ described_class.new(fake_app, VALID_CREDENTIALS[:token])
14
+ end
15
+ let(:expected_header) { VALID_CREDENTIALS[:token] }
13
16
 
14
17
  context 'when header was not previously set' do
15
- let(:request_env) { { request_headers: {} } }
16
- subject(:actual_header) { middleware.call(request_env)[:request_headers][key] }
18
+ let(:request_env) { {request_headers: {}} }
17
19
 
18
- it('generates a Tenant Authentication header') { expect(actual_header).to eq(expected_header) }
20
+ it('generates a Tenant Authentication header') {
21
+ expect(actual_header).to eq(expected_header)
22
+ }
19
23
  end
20
24
 
21
25
  context 'when header was previously set' do
22
- let(:existing_header) { { FinAppsCore::Middleware::TenantAuthentication::KEY => 'foo' } }
23
- let(:request_env) { { request_headers: existing_header } }
24
- subject(:actual_header) { middleware.call(request_env)[:request_headers][key] }
26
+ let(:request_env) { {request_headers: {key => 'foo'}} }
27
+
28
+ it('does not override existing Tenant Authentication header') {
29
+ expect(actual_header).to eq('foo')
30
+ }
25
31
 
26
- it('does not override existing Tenant Authentication header') { expect(actual_header).to eq('foo') }
27
- it('does not generate a Tenant Authentication header') { expect(actual_header).to_not eq(expected_header) }
32
+ it('does not generate a Tenant Authentication header') {
33
+ expect(actual_header).not_to eq(expected_header)
34
+ }
28
35
  end
29
36
  end
30
37
  end
@@ -2,12 +2,17 @@
2
2
 
3
3
  RSpec.describe FinAppsCore::Middleware::UserAgent do
4
4
  let(:fake_app) { proc {|env| env } }
5
+
5
6
  describe '#call' do
6
- subject { FinAppsCore::Middleware::UserAgent.new(fake_app) }
7
- env = { request_headers: {} }
7
+ subject(:user_agent) { described_class.new(fake_app) }
8
+
9
+ let(:key) { FinAppsCore::Middleware::UserAgent::KEY }
10
+
11
+ env = {request_headers: {}}
8
12
 
9
13
  it('generates a UserAgent header') do
10
- expect(subject.call(env)[:request_headers][FinAppsCore::Middleware::UserAgent::KEY]).to start_with('finapps-ruby')
14
+ expect(user_agent.call(env)[:request_headers][key])
15
+ .to start_with('finapps-ruby')
11
16
  end
12
17
  end
13
18
  end
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe FinAppsCore::Middleware::XConsumerId do
4
- let(:key) { FinAppsCore::Middleware::XConsumerId::KEY }
5
4
  let(:id) { 'valid_consumer_id' }
6
5
  let(:fake_app) { proc {|env| env } }
7
- let(:env) { { request_headers: {} } }
6
+ let(:env) { {request_headers: {}} }
8
7
 
9
8
  describe '#call' do
10
- subject { FinAppsCore::Middleware::XConsumerId.new(fake_app, id) }
9
+ subject(:x_consumer_id) { described_class.new(fake_app, id) }
11
10
 
12
11
  it('generates an X-Consumer-ID header') do
13
- expect(subject.call(env)[:request_headers][key]).to eq(id)
12
+ key = FinAppsCore::Middleware::XConsumerId::KEY
13
+ expect(x_consumer_id.call(env)[:request_headers][key]).to eq(id)
14
14
  end
15
15
  end
16
16
  end
@@ -2,39 +2,71 @@
2
2
 
3
3
  RSpec.describe FinAppsCore::Middleware::RaiseError do
4
4
  let(:fake_app) { proc {|env| env } }
5
- Env = Struct.new(:status, :response_headers, :body)
5
+
6
+ before do
7
+ stub_const('Env', Struct.new(:status, :response_headers, :body))
8
+ end
6
9
 
7
10
  describe '#on_complete' do
8
- subject { FinAppsCore::Middleware::RaiseError.new(fake_app) }
11
+ subject(:error_raiser) { described_class.new(fake_app) }
9
12
 
10
- context 'for successful requests' do
13
+ context 'with successful requests' do
11
14
  let(:env) { Env.new(200) }
12
- it { expect { subject.on_complete(env) }.not_to raise_error }
15
+
16
+ it { expect { error_raiser.on_complete(env) }.not_to raise_error }
13
17
  end
14
- context 'for invalid session errors' do
15
- let(:env) { Env.new(401, {}, '{"messages":["Invalid User Identifier or Credentials"]}') }
18
+
19
+ context 'with invalid session errors' do
20
+ let(:env) do
21
+ body = '{"messages":["Invalid User Identifier or Credentials"]}'
22
+ Env.new(401, {}, body)
23
+ end
24
+
16
25
  error_message = 'API Invalid Session'
17
- it { expect { subject.on_complete(env) }.to raise_error(FinAppsCore::ApiUnauthenticatedError, error_message) }
26
+ it {
27
+ expect { error_raiser.on_complete(env) }
28
+ .to raise_error(FinAppsCore::ApiUnauthenticatedError, error_message)
29
+ }
18
30
  end
19
- context 'for client errors' do
31
+
32
+ context 'with client errors' do
20
33
  let(:env) { Env.new(404, {}, '{"messages":["Resource Not Found"]}') }
34
+
21
35
  error_message = 'the server responded with status 404'
22
- it { expect { subject.on_complete(env) }.to raise_error(Faraday::ClientError, error_message) }
36
+ it {
37
+ expect { error_raiser.on_complete(env) }
38
+ .to raise_error(Faraday::ClientError, error_message)
39
+ }
23
40
  end
24
- context 'for connection failed error' do
41
+
42
+ context 'with connection failed error' do
25
43
  let(:env) { Env.new(407) }
44
+
26
45
  error_message = 'Connection Failed'
27
- it { expect { subject.on_complete(env) }.to raise_error(FinAppsCore::ConnectionFailedError, error_message) }
46
+ it {
47
+ expect { error_raiser.on_complete(env) }
48
+ .to raise_error(FinAppsCore::ConnectionFailedError, error_message)
49
+ }
28
50
  end
29
- context 'for session timeout error' do
51
+
52
+ context 'with session timeout error' do
30
53
  let(:env) { Env.new(419) }
54
+
31
55
  error_message = 'API Session Timed out'
32
- it { expect { subject.on_complete(env) }.to raise_error(FinAppsCore::ApiSessionTimeoutError, error_message) }
56
+ it {
57
+ expect { error_raiser.on_complete(env) }
58
+ .to raise_error(FinAppsCore::ApiSessionTimeoutError, error_message)
59
+ }
33
60
  end
34
- context 'for user lockout error' do
61
+
62
+ context 'with user lockout error' do
35
63
  let(:env) { Env.new(403, {}, '{"messages":["Account is locked"]}') }
64
+
36
65
  error_message = 'User is Locked'
37
- it { expect { subject.on_complete(env) }.to raise_error(FinAppsCore::UserLockoutError, error_message) }
66
+ it {
67
+ expect { error_raiser.on_complete(env) }
68
+ .to raise_error(FinAppsCore::UserLockoutError, error_message)
69
+ }
38
70
  end
39
71
  end
40
72
  end
@@ -1,96 +1,140 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe FinAppsCore::REST::BaseClient do
4
- let(:valid_tenant_options) { { tenant_token: VALID_CREDENTIALS[:token] } }
5
- subject { FinAppsCore::REST::BaseClient.new(valid_tenant_options) }
4
+ subject(:base_client) { described_class.new(valid_tenant_options) }
6
5
 
7
- RESPONSE = 0
8
- ERROR_MESSAGES = 1
9
- let(:return_array) { %i[RESPONSE ERROR_MESSAGES] }
6
+ let(:valid_tenant_options) { {tenant_token: VALID_CREDENTIALS[:token]} }
7
+
8
+ before do
9
+ stub_const 'RESPONSE', 0
10
+ stub_const 'ERROR_MESSAGES', 1
11
+ end
10
12
 
11
13
  describe '#new' do
12
14
  it 'assigns @config' do
13
- expect(subject.config).to be_a(FinAppsCore::REST::Configuration)
15
+ expect(base_client.config).to be_a(FinAppsCore::REST::Configuration)
14
16
  end
15
17
  end
16
18
 
17
19
  describe '#connection' do
18
20
  it 'created a Faraday connection object' do
19
- expect(subject.connection).to be_a(Faraday::Connection)
21
+ expect(base_client.connection).to be_a(Faraday::Connection)
20
22
  end
21
23
 
22
24
  it 'memoizes the results' do
23
- first = subject.connection
24
- second = subject.connection
25
+ first = base_client.connection
26
+ second = base_client.connection
25
27
  expect(first.object_id).to eq(second.object_id)
26
28
  end
27
29
  end
28
30
 
29
31
  describe '#send_request' do
30
- it 'should raise FinAppsCore::InvalidArgumentsError if method is NOT supported' do
31
- expect { subject.send_request('fake_path', :option) }.to raise_error(FinAppsCore::UnsupportedHttpMethodError,
32
- 'Method not supported: option.')
32
+ it 'raises FinAppsCore::InvalidArgumentsError if method is NOT supported' do
33
+ expect { base_client.send_request('fake_path', :option) }
34
+ .to(raise_error NoMethodError)
33
35
  end
34
36
 
35
- it 'should raise FinAppsCore::MissingArgumentsError if method is NOT provided' do
36
- expect { subject.send_request(nil, :get) }.to raise_error(FinAppsCore::MissingArgumentsError,
37
- ': path')
37
+ it 'raises FinAppsCore::MissingArgumentsError if method is NOT provided' do
38
+ expect { base_client.send_request(nil, :get) }
39
+ .to(raise_error(FinAppsCore::MissingArgumentsError, ': path'))
38
40
  end
39
41
 
40
- it 'should raise FinAppsCore::MissingArgumentsError if path is NOT provided' do
41
- expect { subject.send_request('fake_path', nil) }.to raise_error(FinAppsCore::MissingArgumentsError,
42
- ': method')
42
+ it 'raises FinAppsCore::MissingArgumentsError if path is NOT provided' do
43
+ expect { base_client.send_request('fake_path', nil) }
44
+ .to raise_error(FinAppsCore::MissingArgumentsError, ': method')
43
45
  end
44
46
 
45
47
  context 'when method and path are provided' do
46
- subject { FinAppsCore::REST::BaseClient.new(valid_tenant_options).send_request('relevance/ruleset/names', :get) }
47
- let(:return_array) { %i[RESPONSE ERROR_MESSAGES] }
48
+ subject(:results) do
49
+ described_class.new(valid_tenant_options)
50
+ .send_request('relevance/ruleset/names', :get)
51
+ end
52
+
53
+ it('returns an array') do
54
+ expect(results).to be_a(Array)
55
+ end
48
56
 
49
- it('returns an array of 2 items') do
50
- expect(subject).to be_a(Array)
51
- expect(subject.size).to eq(return_array.length)
57
+ it('returns an array of length=2') do
58
+ expect(results.size).to eq(2)
52
59
  end
53
60
 
54
- context 'for client errors' do
55
- subject { FinAppsCore::REST::BaseClient.new(valid_tenant_options).send_request('client_error', :get) }
61
+ context 'with client errors' do
62
+ subject(:client_error) do
63
+ described_class.new(valid_tenant_options)
64
+ .send_request('client_error', :get)
65
+ end
56
66
 
57
- it('result is null') { expect(subject[RESPONSE]).to be_nil }
58
- it('error_messages is an array') { expect(subject[ERROR_MESSAGES]).to be_a(Array) }
59
- it('error_messages gets populated') { expect(subject[ERROR_MESSAGES].first).to eq 'Password Minimum size is 8' }
67
+ it('result is null') { expect(client_error[RESPONSE]).to be_nil }
68
+
69
+ it('error_messages is an array') {
70
+ expect(client_error[ERROR_MESSAGES]).to be_a(Array)
71
+ }
72
+
73
+ it('error_messages gets populated') {
74
+ expect(client_error[ERROR_MESSAGES].first)
75
+ .to eq 'Password Minimum size is 8'
76
+ }
60
77
  end
61
78
 
62
- context 'for server errors' do
63
- subject { FinAppsCore::REST::BaseClient.new(valid_tenant_options).send_request('server_error', :get) }
79
+ context 'with server errors' do
80
+ subject(:server_error) do
81
+ described_class.new(valid_tenant_options)
82
+ .send_request('server_error', :get)
83
+ end
84
+
85
+ it('the result should be nil') {
86
+ expect(server_error[RESPONSE]).to be_nil
87
+ }
88
+
89
+ it('error messages should not be nil') {
90
+ expect(server_error[ERROR_MESSAGES]).not_to be_nil
91
+ }
92
+
93
+ it('error messages should be an array') {
94
+ expect(server_error[ERROR_MESSAGES]).to be_a(Array)
95
+ }
64
96
 
65
- it('the result should be nil') { expect(subject[RESPONSE]).to be_nil }
66
- it { expect(subject[ERROR_MESSAGES]).not_to be_nil }
67
- it { expect(subject[ERROR_MESSAGES]).to be_a(Array) }
68
- it { expect(subject[ERROR_MESSAGES].first).to eq 'the server responded with status 500' }
97
+ it('the first error message should match') {
98
+ expect(server_error[ERROR_MESSAGES].first)
99
+ .to eq 'the server responded with status 500'
100
+ }
69
101
  end
70
102
 
71
- context 'for proxy errors' do
72
- subject { FinAppsCore::REST::BaseClient.new(valid_tenant_options).send_request('proxy_error', :get) }
73
- it { expect { subject }.to raise_error(FinAppsCore::ConnectionFailedError, 'Connection Failed') }
103
+ context 'with proxy errors' do
104
+ subject(:proxy_error) do
105
+ described_class.new(valid_tenant_options)
106
+ .send_request('proxy_error', :get)
107
+ end
108
+
109
+ it {
110
+ expect { proxy_error }
111
+ .to(raise_error(FinAppsCore::ConnectionFailedError,
112
+ 'Connection Failed'))
113
+ }
74
114
  end
75
115
  end
76
116
 
77
- context 'if a block is provided' do
117
+ context 'when a block is provided' do
78
118
  it('gets executed on the response and returned as the result') do
79
- expect(subject.send_request('relevance/ruleset/names', :get) {|r| r.body.length }).to eq([45, []])
119
+ expect(base_client
120
+ .send_request('relevance/ruleset/names', :get) {|r| r.body.length })
121
+ .to eq([45, []])
80
122
  end
81
123
  end
82
124
  end
83
125
 
84
126
  describe '#method_missing' do
85
- context 'for unsupported methods' do
86
- it { expect { subject.unsupported }.to raise_error(NoMethodError) }
127
+ context 'with unsupported methods' do
128
+ it { expect { base_client.unsupported }.to raise_error(NoMethodError) }
87
129
  end
88
130
  end
89
131
 
90
132
  describe '#respond_to_missing?' do
91
- context 'for supported methods' do
133
+ context 'with supported methods' do
92
134
  %i[get post put delete].each do |method|
93
- it("responds to #{method}") { expect(subject).to respond_to(method) }
135
+ it("responds to #{method}") {
136
+ expect(base_client).to respond_to(method)
137
+ }
94
138
  end
95
139
  end
96
140
  end