mrkt 0.6.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +11 -0
- data/.github/workflows/ruby.yml +41 -0
- data/.rubocop.yml +31 -6
- data/Gemfile.lock +95 -69
- data/LICENSE +21 -0
- data/README.md +35 -7
- data/lib/mrkt/concerns/authentication.rb +32 -6
- data/lib/mrkt/concerns/connection.rb +13 -4
- data/lib/mrkt/concerns/crud_activities.rb +32 -0
- data/lib/mrkt/concerns/crud_asset_folders.rb +43 -0
- data/lib/mrkt/concerns/crud_asset_static_lists.rb +30 -0
- data/lib/mrkt/concerns/crud_campaigns.rb +2 -4
- data/lib/mrkt/concerns/crud_custom_activities.rb +36 -0
- data/lib/mrkt/concerns/crud_custom_objects.rb +14 -15
- data/lib/mrkt/concerns/crud_helpers.rb +7 -0
- data/lib/mrkt/concerns/crud_leads.rb +41 -15
- data/lib/mrkt/concerns/crud_lists.rb +13 -10
- data/lib/mrkt/concerns/crud_programs.rb +6 -5
- data/lib/mrkt/concerns/import_custom_objects.rb +24 -0
- data/lib/mrkt/concerns/import_leads.rb +8 -5
- data/lib/mrkt/errors.rb +23 -3
- data/lib/mrkt/faraday/params_encoder.rb +20 -0
- data/lib/mrkt/faraday.rb +4 -0
- data/lib/mrkt/faraday_middleware/response.rb +4 -4
- data/lib/mrkt/faraday_middleware.rb +3 -7
- data/lib/mrkt/version.rb +1 -1
- data/lib/mrkt.rb +29 -3
- data/mrkt.gemspec +13 -12
- data/spec/concerns/authentication_spec.rb +95 -0
- data/spec/concerns/crud_activities_spec.rb +279 -0
- data/spec/concerns/crud_asset_folders_spec.rb +273 -0
- data/spec/concerns/crud_asset_static_lists_spec.rb +183 -0
- data/spec/concerns/crud_custom_activities_spec.rb +172 -0
- data/spec/concerns/crud_custom_objects_spec.rb +99 -89
- data/spec/concerns/crud_leads_spec.rb +151 -1
- data/spec/concerns/crud_lists_spec.rb +33 -0
- data/spec/concerns/import_custom_objects_spec.rb +89 -0
- data/spec/concerns/import_leads_spec.rb +3 -3
- data/spec/faraday/params_encoder_spec.rb +24 -0
- data/spec/spec_helper.rb +3 -6
- data/spec/support/initialized_client.rb +1 -1
- data/spec/support/webmock.rb +1 -7
- metadata +82 -40
- data/.travis.yml +0 -8
@@ -1,52 +1,51 @@
|
|
1
1
|
module Mrkt
|
2
2
|
module CrudCustomObjects
|
3
|
-
def get_list_of_custom_objects(names=nil)
|
3
|
+
def get_list_of_custom_objects(names = nil)
|
4
4
|
params = {}
|
5
|
-
params[:names] = names
|
5
|
+
params[:names] = names if names
|
6
6
|
|
7
7
|
get('/rest/v1/customobjects.json', params)
|
8
8
|
end
|
9
9
|
|
10
10
|
def describe_custom_object(name)
|
11
|
-
|
11
|
+
raise Mrkt::Errors::Unknown unless name
|
12
12
|
|
13
13
|
get("/rest/v1/customobjects/#{name}/describe.json")
|
14
14
|
end
|
15
15
|
|
16
16
|
def createupdate_custom_objects(name, input, action: 'createOrUpdate', dedupe_by: 'dedupeFields')
|
17
|
-
|
18
|
-
|
17
|
+
post_json("/rest/v1/customobjects/#{name}.json") do
|
18
|
+
{
|
19
19
|
input: input,
|
20
20
|
action: action,
|
21
21
|
dedupeBy: dedupe_by
|
22
22
|
}
|
23
|
-
json_payload(req, params)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
26
|
def delete_custom_objects(name, input, delete_by: 'dedupeFields')
|
28
|
-
|
29
|
-
|
27
|
+
post_json("/rest/v1/customobjects/#{name}/delete.json") do
|
28
|
+
{
|
30
29
|
input: input,
|
31
30
|
deleteBy: delete_by
|
32
31
|
}
|
33
|
-
|
34
|
-
json_payload(req, params)
|
35
32
|
end
|
36
33
|
end
|
37
34
|
|
38
35
|
def get_custom_objects(name, input, filter_type: 'dedupeFields', fields: nil, next_page_token: nil, batch_size: nil)
|
39
|
-
|
36
|
+
post_json("/rest/v1/customobjects/#{name}.json?_method=GET") do
|
40
37
|
params = {
|
41
38
|
input: input,
|
42
39
|
filterType: filter_type
|
43
40
|
}
|
44
41
|
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
optional = {
|
43
|
+
fields: fields,
|
44
|
+
nextPageToken: next_page_token,
|
45
|
+
batchSize: batch_size
|
46
|
+
}
|
48
47
|
|
49
|
-
|
48
|
+
merge_params(params, optional)
|
50
49
|
end
|
51
50
|
end
|
52
51
|
end
|
@@ -4,6 +4,13 @@ module Mrkt
|
|
4
4
|
lead_ids.map { |id| { id: id } }
|
5
5
|
end
|
6
6
|
|
7
|
+
def post_json(url)
|
8
|
+
post(url) do |req|
|
9
|
+
payload = block_given? ? yield(req) : {}
|
10
|
+
json_payload(req, payload)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
def json_payload(req, payload)
|
8
15
|
req.headers[:content_type] = 'application/json'
|
9
16
|
req.body = JSON.generate(payload)
|
@@ -1,28 +1,42 @@
|
|
1
1
|
module Mrkt
|
2
2
|
module CrudLeads
|
3
|
+
def get_lead_by_id(id, fields: nil)
|
4
|
+
optional = {
|
5
|
+
fields: fields
|
6
|
+
}
|
7
|
+
|
8
|
+
get("/rest/v1/lead/#{id}.json", {}, optional)
|
9
|
+
end
|
10
|
+
|
3
11
|
def get_leads(filter_type, filter_values, fields: nil, batch_size: nil, next_page_token: nil)
|
4
12
|
params = {
|
5
13
|
filterType: filter_type,
|
6
|
-
filterValues: filter_values
|
14
|
+
filterValues: filter_values
|
7
15
|
}
|
8
|
-
params[:fields] = fields if fields
|
9
|
-
params[:batchSize] = batch_size if batch_size
|
10
|
-
params[:nextPageToken] = next_page_token if next_page_token
|
11
16
|
|
12
|
-
|
17
|
+
optional = {
|
18
|
+
fields: fields,
|
19
|
+
batchSize: batch_size,
|
20
|
+
nextPageToken: next_page_token
|
21
|
+
}
|
22
|
+
|
23
|
+
get('/rest/v1/leads.json', params, optional)
|
13
24
|
end
|
14
25
|
|
15
26
|
def createupdate_leads(leads, action: 'createOrUpdate', lookup_field: nil, partition_name: nil, async_processing: nil)
|
16
|
-
|
27
|
+
post_json('/rest/v1/leads.json') do
|
17
28
|
params = {
|
18
29
|
action: action,
|
19
30
|
input: leads
|
20
31
|
}
|
21
|
-
params[:lookupField] = lookup_field if lookup_field
|
22
|
-
params[:partitionName] = partition_name if partition_name
|
23
|
-
params[:asyncProcessing] = async_processing if async_processing
|
24
32
|
|
25
|
-
|
33
|
+
optional = {
|
34
|
+
lookupField: lookup_field,
|
35
|
+
partitionName: partition_name,
|
36
|
+
asyncProcessing: async_processing
|
37
|
+
}
|
38
|
+
|
39
|
+
merge_params(params, optional)
|
26
40
|
end
|
27
41
|
end
|
28
42
|
|
@@ -33,12 +47,24 @@ module Mrkt
|
|
33
47
|
end
|
34
48
|
|
35
49
|
def associate_lead(id, cookie)
|
36
|
-
params = Faraday::
|
37
|
-
params[:cookie] = cookie
|
50
|
+
params = Mrkt::Faraday::ParamsEncoder.encode(cookie: cookie)
|
38
51
|
|
39
|
-
|
40
|
-
|
41
|
-
|
52
|
+
post_json("/rest/v1/leads/#{id}/associate.json?#{params}")
|
53
|
+
end
|
54
|
+
|
55
|
+
def merge_leads(winning_lead_id, losing_lead_ids, merge_in_crm: false)
|
56
|
+
params = {}
|
57
|
+
|
58
|
+
params[:mergeInCRM] = merge_in_crm
|
59
|
+
params[:leadIds] = losing_lead_ids if losing_lead_ids
|
60
|
+
|
61
|
+
query_params = Mrkt::Faraday::ParamsEncoder.encode(params)
|
62
|
+
|
63
|
+
post_json("/rest/v1/leads/#{winning_lead_id}/merge.json?#{query_params}")
|
64
|
+
end
|
65
|
+
|
66
|
+
def describe_lead
|
67
|
+
get('/rest/v1/leads/describe.json')
|
42
68
|
end
|
43
69
|
end
|
44
70
|
end
|
@@ -1,21 +1,24 @@
|
|
1
1
|
module Mrkt
|
2
2
|
module CrudLists
|
3
3
|
def get_leads_by_list(list_id, fields: nil, batch_size: nil, next_page_token: nil)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
optional = {
|
5
|
+
fields: fields,
|
6
|
+
batchSize: batch_size,
|
7
|
+
nextPageToken: next_page_token
|
8
|
+
}
|
8
9
|
|
9
|
-
get("/rest/v1/list/#{list_id}/leads.json",
|
10
|
+
get("/rest/v1/list/#{list_id}/leads.json", {}, optional)
|
10
11
|
end
|
11
12
|
|
12
13
|
def add_leads_to_list(list_id, lead_ids)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
post_json("/rest/v1/lists/#{list_id}/leads.json") do
|
15
|
+
{ input: map_lead_ids(lead_ids) }
|
16
|
+
end
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
+
def remove_leads_from_list(list_id, lead_ids)
|
20
|
+
delete("/rest/v1/lists/#{list_id}/leads.json") do |req|
|
21
|
+
json_payload(req, input: map_lead_ids(lead_ids))
|
19
22
|
end
|
20
23
|
end
|
21
24
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module Mrkt
|
2
2
|
module CrudPrograms
|
3
3
|
def browse_programs(offset: nil, max_return: nil, status: nil)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
optional = {
|
5
|
+
offset: offset,
|
6
|
+
maxReturn: max_return,
|
7
|
+
status: status
|
8
|
+
}
|
8
9
|
|
9
|
-
get('/rest/asset/v1/programs.json',
|
10
|
+
get('/rest/asset/v1/programs.json', {}, optional)
|
10
11
|
end
|
11
12
|
|
12
13
|
def get_program_by_id(id)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Mrkt
|
2
|
+
module ImportCustomObjects
|
3
|
+
def import_custom_object(file, custom_object, format = 'csv')
|
4
|
+
params = {
|
5
|
+
format: format,
|
6
|
+
file: ::Faraday::UploadIO.new(file, 'text/csv')
|
7
|
+
}
|
8
|
+
|
9
|
+
post("/bulk/v1/customobjects/#{custom_object}/import.json", params)
|
10
|
+
end
|
11
|
+
|
12
|
+
def import_custom_object_status(id, custom_object)
|
13
|
+
get("/bulk/v1/customobjects/#{custom_object}/import/#{id}/status.json")
|
14
|
+
end
|
15
|
+
|
16
|
+
def import_custom_object_failures(id, custom_object)
|
17
|
+
get("/bulk/v1/customobjects/#{custom_object}/import/#{id}/failures.json")
|
18
|
+
end
|
19
|
+
|
20
|
+
def import_custom_object_warnings(id, custom_object)
|
21
|
+
get("/bulk/v1/customobjects/#{custom_object}/import/#{id}/warnings.json")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -3,13 +3,16 @@ module Mrkt
|
|
3
3
|
def import_lead(file, format = 'csv', lookup_field: nil, list_id: nil, partition_name: nil)
|
4
4
|
params = {
|
5
5
|
format: format,
|
6
|
-
file: Faraday::UploadIO.new(file, 'text/csv')
|
6
|
+
file: ::Faraday::UploadIO.new(file, 'text/csv')
|
7
7
|
}
|
8
|
-
params[:lookupField] = lookup_field if lookup_field
|
9
|
-
params[:listId] = list_id if list_id
|
10
|
-
params[:partitionName] = partition_name if partition_name
|
11
8
|
|
12
|
-
|
9
|
+
optional = {
|
10
|
+
lookupField: lookup_field,
|
11
|
+
listId: list_id,
|
12
|
+
partitionName: partition_name
|
13
|
+
}
|
14
|
+
|
15
|
+
post('/bulk/v1/leads.json', params, optional)
|
13
16
|
end
|
14
17
|
|
15
18
|
def import_lead_status(id)
|
data/lib/mrkt/errors.rb
CHANGED
@@ -25,6 +25,7 @@ class Mrkt::Errors
|
|
25
25
|
610 => 'RequestedResourceNotFound',
|
26
26
|
611 => 'System',
|
27
27
|
612 => 'InvalidContentType',
|
28
|
+
702 => 'RecordNotFound',
|
28
29
|
703 => 'DisabledFeature',
|
29
30
|
1001 => 'TypeMismatch',
|
30
31
|
1002 => 'MissingParamater',
|
@@ -39,10 +40,29 @@ class Mrkt::Errors
|
|
39
40
|
1011 => 'FieldNotSupported',
|
40
41
|
1012 => 'InvalidCookieValue',
|
41
42
|
1013 => 'ObjectNotFound',
|
42
|
-
1014 => 'FailedToCreateObject'
|
43
|
-
|
43
|
+
1014 => 'FailedToCreateObject',
|
44
|
+
1015 => 'LeadNotInList',
|
45
|
+
1016 => 'TooManyImports',
|
46
|
+
1017 => 'ObjectAlreadyExists',
|
47
|
+
1018 => 'CRMEnabled',
|
48
|
+
1019 => 'ImportInProgress',
|
49
|
+
1020 => 'TooManyCloneToProgram',
|
50
|
+
1021 => 'CompanyUpdateNotAllowed',
|
51
|
+
1022 => 'ObjectInUse',
|
52
|
+
1025 => 'ProgramStatusNotFound',
|
53
|
+
1026 => 'CustomObjectNotEnabled',
|
54
|
+
1027 => 'MaxActivityTypeLimitReached',
|
55
|
+
1028 => 'MaxFieldLimitReached',
|
56
|
+
1029 => 'BulkExportQuotaExceeded',
|
57
|
+
1035 => 'UnsupportedFilterType',
|
58
|
+
1036 => 'DuplicateObjectFoundInInput',
|
59
|
+
1042 => 'InvalidRunAtDate',
|
60
|
+
1048 => 'CustomObjectDiscardDraftFailed',
|
61
|
+
1049 => 'FailedToCreateActivity',
|
62
|
+
1077 => 'MergeLeadsCallFailedDueToFieldLength'
|
63
|
+
}.freeze
|
44
64
|
|
45
|
-
RESPONSE_CODE_TO_ERROR.
|
65
|
+
RESPONSE_CODE_TO_ERROR.each_value do |class_name|
|
46
66
|
const_set(class_name, create_class)
|
47
67
|
end
|
48
68
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mrkt
|
2
|
+
module Faraday
|
3
|
+
class ParamsEncoder
|
4
|
+
class << self
|
5
|
+
def encode(hash)
|
6
|
+
new_hash = hash.transform_values { |v| encode_value(v) }
|
7
|
+
::Faraday::NestedParamsEncoder.encode(new_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def decode(string)
|
11
|
+
::Faraday::NestedParamsEncoder.decode(string)
|
12
|
+
end
|
13
|
+
|
14
|
+
def encode_value(value)
|
15
|
+
value.respond_to?(:join) ? value.join(',') : value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/mrkt/faraday.rb
ADDED
@@ -12,8 +12,8 @@ module Mrkt
|
|
12
12
|
|
13
13
|
data = env[:body]
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
raise Mrkt::Errors::EmptyResponse if data.nil?
|
16
|
+
raise Mrkt::Errors::Error, data[:error_description] if data.key?(:error)
|
17
17
|
|
18
18
|
handle_errors!(data[:errors]) unless data.fetch(:success, true)
|
19
19
|
end
|
@@ -21,8 +21,8 @@ module Mrkt
|
|
21
21
|
def handle_errors!(errors)
|
22
22
|
error = errors.first
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
raise Mrkt::Errors::Unknown if error.nil?
|
25
|
+
raise Mrkt::Errors.find_by_response_code(error[:code].to_i), error[:message]
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -1,11 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'mrkt/faraday_middleware/response'
|
2
2
|
|
3
3
|
module Mrkt
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
if Faraday::Middleware.respond_to? :register_middleware
|
9
|
-
Faraday::Response.register_middleware mkto: -> { Mrkt::FaradayMiddleware::Response }
|
4
|
+
if ::Faraday::Middleware.respond_to?(:register_middleware)
|
5
|
+
::Faraday::Response.register_middleware(mkto: Mrkt::FaradayMiddleware::Response)
|
10
6
|
end
|
11
7
|
end
|
data/lib/mrkt/version.rb
CHANGED
data/lib/mrkt.rb
CHANGED
@@ -4,24 +4,34 @@ require 'mrkt/errors'
|
|
4
4
|
require 'mrkt/concerns/connection'
|
5
5
|
require 'mrkt/concerns/authentication'
|
6
6
|
require 'mrkt/concerns/crud_helpers'
|
7
|
+
require 'mrkt/concerns/crud_activities'
|
7
8
|
require 'mrkt/concerns/crud_campaigns'
|
8
9
|
require 'mrkt/concerns/crud_leads'
|
9
10
|
require 'mrkt/concerns/crud_lists'
|
10
11
|
require 'mrkt/concerns/import_leads'
|
12
|
+
require 'mrkt/concerns/import_custom_objects'
|
11
13
|
require 'mrkt/concerns/crud_custom_objects'
|
14
|
+
require 'mrkt/concerns/crud_custom_activities'
|
12
15
|
require 'mrkt/concerns/crud_programs'
|
16
|
+
require 'mrkt/concerns/crud_asset_static_lists'
|
17
|
+
require 'mrkt/concerns/crud_asset_folders'
|
13
18
|
|
14
19
|
module Mrkt
|
15
20
|
class Client
|
16
21
|
include Connection
|
17
22
|
include Authentication
|
18
23
|
include CrudHelpers
|
24
|
+
include CrudActivities
|
19
25
|
include CrudCampaigns
|
20
26
|
include CrudLeads
|
21
27
|
include CrudLists
|
22
28
|
include ImportLeads
|
29
|
+
include ImportCustomObjects
|
23
30
|
include CrudCustomObjects
|
31
|
+
include CrudCustomActivities
|
24
32
|
include CrudPrograms
|
33
|
+
include CrudAssetStaticLists
|
34
|
+
include CrudAssetFolders
|
25
35
|
|
26
36
|
attr_accessor :debug
|
27
37
|
|
@@ -30,17 +40,33 @@ module Mrkt
|
|
30
40
|
|
31
41
|
@client_id = options.fetch(:client_id)
|
32
42
|
@client_secret = options.fetch(:client_secret)
|
43
|
+
@partner_id = options[:partner_id]
|
44
|
+
|
45
|
+
@retry_authentication = options.fetch(:retry_authentication, false)
|
46
|
+
@retry_authentication_count = options.fetch(:retry_authentication_count, 3).to_i
|
47
|
+
@retry_authentication_wait_seconds = options.fetch(:retry_authentication_wait_seconds, 0).to_i
|
48
|
+
|
49
|
+
@debug = options[:debug]
|
50
|
+
|
51
|
+
@logger = options[:logger]
|
52
|
+
@log_options = options[:log_options]
|
33
53
|
|
34
54
|
@options = options
|
35
55
|
end
|
36
56
|
|
37
|
-
|
38
|
-
|
57
|
+
def merge_params(params, optional)
|
58
|
+
params.merge(optional.keep_if { |_key, value| value })
|
59
|
+
end
|
60
|
+
|
61
|
+
%i[get post delete].each do |http_method|
|
62
|
+
define_method(http_method) do |path, params = {}, optional = {}, &block|
|
39
63
|
authenticate!
|
40
64
|
|
65
|
+
payload = merge_params(params, optional)
|
66
|
+
|
41
67
|
resp = connection.send(http_method, path, payload) do |req|
|
42
68
|
add_authorization(req)
|
43
|
-
block
|
69
|
+
block&.call(req)
|
44
70
|
end
|
45
71
|
|
46
72
|
resp.body
|
data/mrkt.gemspec
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'mrkt/version'
|
5
4
|
|
@@ -16,18 +15,20 @@ Gem::Specification.new do |spec|
|
|
16
15
|
spec.files = `git ls-files`.split($RS)
|
17
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = %w
|
18
|
+
spec.require_paths = %w[lib]
|
20
19
|
|
21
|
-
spec.required_ruby_version = '
|
20
|
+
spec.required_ruby_version = '>= 2.5'
|
22
21
|
|
23
|
-
spec.add_dependency '
|
22
|
+
spec.add_dependency 'faraday', '~> 1.0'
|
23
|
+
spec.add_dependency 'faraday_middleware', '~> 1.0'
|
24
24
|
|
25
|
-
spec.add_development_dependency 'bundler', '~>
|
26
|
-
spec.add_development_dependency '
|
25
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
26
|
+
spec.add_development_dependency 'gem-release', '~> 2.1'
|
27
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.7'
|
28
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
27
29
|
spec.add_development_dependency 'rspec', '~> 3.2'
|
28
|
-
spec.add_development_dependency '
|
29
|
-
spec.add_development_dependency '
|
30
|
-
spec.add_development_dependency '
|
31
|
-
spec.add_development_dependency '
|
32
|
-
spec.add_development_dependency 'rubocop', '~> 0.32.1'
|
30
|
+
spec.add_development_dependency 'rubocop', '~> 1.20.0'
|
31
|
+
spec.add_development_dependency 'rubocop-rake', '~> 0.6.0'
|
32
|
+
spec.add_development_dependency 'simplecov', '~> 0.21.2'
|
33
|
+
spec.add_development_dependency 'webmock', '~> 3.1'
|
33
34
|
end
|
@@ -22,6 +22,101 @@ describe Mrkt::Authentication do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
describe '#authenticate!' do
|
26
|
+
it 'should authenticate and then be authenticated?' do
|
27
|
+
expect(client.authenticated?).to_not be true
|
28
|
+
client.authenticate!
|
29
|
+
expect(client.authenticated?).to be true
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'with optional partner_id client option' do
|
33
|
+
before { remove_request_stub(@authentication_request_stub) }
|
34
|
+
|
35
|
+
let(:partner_id) { SecureRandom.uuid }
|
36
|
+
|
37
|
+
let(:client_options) do
|
38
|
+
{
|
39
|
+
host: host,
|
40
|
+
client_id: client_id,
|
41
|
+
client_secret: client_secret,
|
42
|
+
partner_id: partner_id
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:query) do
|
47
|
+
{
|
48
|
+
client_id: client_id,
|
49
|
+
client_secret: client_secret,
|
50
|
+
partner_id: partner_id,
|
51
|
+
grant_type: 'client_credentials'
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
subject(:client) { Mrkt::Client.new(client_options) }
|
56
|
+
|
57
|
+
before do
|
58
|
+
stub_request(:get, "https://#{host}/identity/oauth/token")
|
59
|
+
.with(query: query)
|
60
|
+
.to_return(json_stub(authentication_stub))
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should authenticate and then be authenticated?' do
|
64
|
+
expect(client.authenticated?).to_not be true
|
65
|
+
client.authenticate!
|
66
|
+
expect(client.authenticated?).to be true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when the token has expired and @retry_authentication = true' do
|
71
|
+
before { remove_request_stub(@authentication_request_stub) }
|
72
|
+
|
73
|
+
let(:retry_count) { 3 }
|
74
|
+
|
75
|
+
let(:expired_authentication_stub) do
|
76
|
+
{ access_token: SecureRandom.uuid, token_type: 'bearer', expires_in: 0, scope: 'RestClient' }
|
77
|
+
end
|
78
|
+
|
79
|
+
let(:valid_authentication_stub) do
|
80
|
+
{ access_token: SecureRandom.uuid, token_type: 'bearer', expires_in: 1234, scope: 'RestClient' }
|
81
|
+
end
|
82
|
+
|
83
|
+
let(:client_options) do
|
84
|
+
{
|
85
|
+
host: host,
|
86
|
+
client_id: client_id,
|
87
|
+
client_secret: client_secret,
|
88
|
+
retry_authentication: true,
|
89
|
+
retry_authentication_count: retry_count
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
subject(:client) { Mrkt::Client.new(client_options) }
|
94
|
+
|
95
|
+
before do
|
96
|
+
stub_request(:get, "https://#{host}/identity/oauth/token")
|
97
|
+
.with(query: { client_id: client_id, client_secret: client_secret, grant_type: 'client_credentials' })
|
98
|
+
.to_return(json_stub(expired_authentication_stub)).times(3).then
|
99
|
+
.to_return(json_stub(valid_authentication_stub))
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should retry until getting valid token and then be authenticated?' do
|
103
|
+
expect(client.authenticated?).to_not be true
|
104
|
+
client.authenticate!
|
105
|
+
expect(client.authenticated?).to be true
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when retry_authentication_count is low' do
|
109
|
+
let(:retry_count) { 2 }
|
110
|
+
|
111
|
+
it 'should stop retrying after @retry_authentication_count tries and then raise an error' do
|
112
|
+
expect(client.authenticated?).to_not be true
|
113
|
+
|
114
|
+
expect { client.authenticate! }.to raise_error(Mrkt::Errors::Error, 'Client not authenticated')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
25
120
|
describe '#authenticated?' do
|
26
121
|
subject { client.authenticated? }
|
27
122
|
|