securenative 0.1.20 → 0.1.26

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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/Gemfile.lock +76 -82
  4. data/README.md +45 -40
  5. data/lib/securenative/api_manager.rb +41 -0
  6. data/lib/securenative/config/configuration_builder.rb +29 -0
  7. data/lib/securenative/config/configuration_manager.rb +58 -0
  8. data/lib/securenative/config/securenative_options.rb +25 -0
  9. data/lib/securenative/context/hanami_context.rb +44 -0
  10. data/lib/securenative/context/rails_context.rb +46 -0
  11. data/lib/securenative/context/securenative_context.rb +69 -0
  12. data/lib/securenative/context/sinatra_context.rb +44 -0
  13. data/lib/securenative/enums/api_route.rb +8 -0
  14. data/lib/securenative/enums/event_types.rb +25 -0
  15. data/lib/securenative/enums/failover_strategy.rb +8 -0
  16. data/lib/securenative/enums/risk_level.rb +9 -0
  17. data/lib/securenative/errors/securenative_config_error.rb +6 -0
  18. data/lib/securenative/errors/securenative_http_error.rb +6 -0
  19. data/lib/securenative/errors/securenative_invalid_options_error.rb +6 -0
  20. data/lib/securenative/errors/securenative_invalid_uri_error.rb +6 -0
  21. data/lib/securenative/errors/securenative_parse_error.rb +6 -0
  22. data/lib/securenative/errors/securenative_sdk_Illegal_state_error.rb +6 -0
  23. data/lib/securenative/errors/securenative_sdk_error.rb +6 -0
  24. data/lib/securenative/event_manager.rb +159 -0
  25. data/lib/securenative/http/secure_native_http_response.rb +14 -0
  26. data/lib/securenative/http/securenative_http_client.rb +52 -0
  27. data/lib/securenative/models/client_token.rb +14 -0
  28. data/lib/securenative/models/device.rb +12 -0
  29. data/lib/securenative/models/event_options.rb +39 -0
  30. data/lib/securenative/models/request_context.rb +20 -0
  31. data/lib/securenative/models/request_options.rb +14 -0
  32. data/lib/securenative/models/sdk_event.rb +51 -0
  33. data/lib/securenative/models/user_traits.rb +15 -0
  34. data/lib/securenative/models/verify_result.rb +18 -0
  35. data/lib/securenative/sdk.rb +85 -0
  36. data/lib/securenative/utils/date_utils.rb +11 -0
  37. data/lib/securenative/utils/encryption_utils.rb +51 -0
  38. data/lib/securenative/utils/ip_utils.rb +25 -0
  39. data/lib/securenative/utils/request_utils.rb +71 -0
  40. data/lib/securenative/utils/secure_native_logger.rb +46 -0
  41. data/lib/securenative/utils/signature_utils.rb +18 -0
  42. data/lib/securenative/utils/utils.rb +11 -0
  43. data/lib/securenative/utils/version_utils.rb +13 -0
  44. data/out/production/securenative-ruby/api_manager.rb +13 -5
  45. data/out/production/securenative-ruby/config/configuration_builder.rb +6 -9
  46. data/out/production/securenative-ruby/config/configuration_manager.rb +24 -23
  47. data/out/production/securenative-ruby/config/securenative_options.rb +8 -5
  48. data/{lib → out/production/securenative-ruby}/context/hanami_context.rb +9 -2
  49. data/{lib → out/production/securenative-ruby}/context/rails_context.rb +4 -1
  50. data/out/production/securenative-ruby/context/securenative_context.rb +35 -8
  51. data/{lib → out/production/securenative-ruby}/context/sinatra_context.rb +11 -4
  52. data/out/production/securenative-ruby/event_manager.rb +15 -14
  53. data/{lib → out/production/securenative-ruby}/http/secure_native_http_response.rb +0 -0
  54. data/out/production/securenative-ruby/http/securenative_http_client.rb +23 -5
  55. data/out/production/securenative-ruby/models/event_options.rb +23 -1
  56. data/out/production/securenative-ruby/models/request_context.rb +2 -2
  57. data/out/production/securenative-ruby/models/sdk_event.rb +22 -6
  58. data/out/production/securenative-ruby/models/user_traits.rb +1 -1
  59. data/out/production/securenative-ruby/models/verify_result.rb +5 -1
  60. data/out/production/securenative-ruby/securenative.rb +2 -10
  61. data/out/production/securenative-ruby/utils/date_utils.rb +1 -1
  62. data/out/production/securenative-ruby/utils/encryption_utils.rb +38 -24
  63. data/out/production/securenative-ruby/utils/request_utils.rb +53 -7
  64. data/out/production/securenative-ruby/utils/secure_native_logger.rb +6 -6
  65. data/out/production/securenative-ruby/utils/version_utils.rb +5 -6
  66. data/out/test/securenative-ruby/spec_api_manager.rb +37 -31
  67. data/out/test/securenative-ruby/spec_context_builder.rb +52 -34
  68. data/out/test/securenative-ruby/spec_encryption_utils.rb +13 -13
  69. data/out/test/securenative-ruby/spec_event_manager.rb +49 -15
  70. data/out/test/securenative-ruby/spec_helper.rb +8 -0
  71. data/out/test/securenative-ruby/spec_request_utils.rb +25 -0
  72. data/out/test/securenative-ruby/spec_sdk_event.rb +24 -0
  73. data/out/test/securenative-ruby/spec_securenative.rb +35 -39
  74. data/out/test/securenative-ruby/spec_securenative_http_client.rb +13 -5
  75. data/out/test/securenative-ruby/spec_signature_utils.rb +1 -1
  76. data/out/test/securenative-ruby/spec_version_util.rb +10 -0
  77. data/securenative.gemspec +16 -14
  78. metadata +48 -45
  79. data/VERSION +0 -1
  80. data/lib/api_manager.rb +0 -35
  81. data/lib/config/configuration_builder.rb +0 -30
  82. data/lib/config/configuration_manager.rb +0 -55
  83. data/lib/config/securenative_options.rb +0 -22
  84. data/lib/context/securenative_context.rb +0 -67
  85. data/lib/enums/api_route.rb +0 -6
  86. data/lib/enums/event_types.rb +0 -23
  87. data/lib/enums/failover_strategy.rb +0 -6
  88. data/lib/enums/risk_level.rb +0 -7
  89. data/lib/errors/securenative_config_error.rb +0 -4
  90. data/lib/errors/securenative_http_error.rb +0 -4
  91. data/lib/errors/securenative_invalid_options_error.rb +0 -4
  92. data/lib/errors/securenative_invalid_uri_error.rb +0 -4
  93. data/lib/errors/securenative_parse_error.rb +0 -4
  94. data/lib/errors/securenative_sdk_Illegal_state_error.rb +0 -4
  95. data/lib/errors/securenative_sdk_error.rb +0 -4
  96. data/lib/event_manager.rb +0 -156
  97. data/lib/event_options.rb +0 -32
  98. data/lib/http/securenative_http_client.rb +0 -38
  99. data/lib/models/client_token.rb +0 -12
  100. data/lib/models/device.rb +0 -10
  101. data/lib/models/event_options.rb +0 -15
  102. data/lib/models/request_context.rb +0 -18
  103. data/lib/models/request_options.rb +0 -12
  104. data/lib/models/sdk_event.rb +0 -35
  105. data/lib/models/user_traits.rb +0 -13
  106. data/lib/models/verify_result.rb +0 -12
  107. data/lib/securenative.rb +0 -95
  108. data/lib/utils/date_utils.rb +0 -9
  109. data/lib/utils/encryption_utils.rb +0 -35
  110. data/lib/utils/ip_utils.rb +0 -23
  111. data/lib/utils/request_utils.rb +0 -54
  112. data/lib/utils/secure_native_logger.rb +0 -44
  113. data/lib/utils/signature_utils.rb +0 -16
  114. data/lib/utils/utils.rb +0 -9
  115. data/lib/utils/version_utils.rb +0 -12
  116. data/out/production/securenative-ruby/event_options.rb +0 -32
  117. data/out/production/securenative-ruby/http/http_response.rb +0 -12
@@ -1,18 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'httpclient'
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'json'
6
+ require 'utils/version_utils'
7
+ require 'utils/secure_native_logger'
4
8
 
5
9
  class SecureNativeHttpClient
6
10
  AUTHORIZATION_HEADER = 'Authorization'
7
11
  VERSION_HEADER = 'SN-Version'
8
12
  USER_AGENT_HEADER = 'User-Agent'
9
- USER_AGENT_HEADER_VALUE = 'SecureNative-python'
13
+ USER_AGENT_HEADER_VALUE = 'SecureNative-ruby'
10
14
  CONTENT_TYPE_HEADER = 'Content-Type'
11
15
  CONTENT_TYPE_HEADER_VALUE = 'application/json'
12
16
 
13
17
  def initialize(securenative_options)
14
18
  @options = securenative_options
15
- @client = HTTPClient.new
16
19
  end
17
20
 
18
21
  def _headers
@@ -25,8 +28,23 @@ class SecureNativeHttpClient
25
28
  end
26
29
 
27
30
  def post(path, body)
28
- url = "#{@options.api_url}/#{path}"
31
+ uri = URI.parse("#{@options.api_url}/#{path}")
29
32
  headers = _headers
30
- @client.post(url, body, headers)
33
+
34
+ client = Net::HTTP.new(uri.host, uri.port)
35
+ client.use_ssl = true
36
+ client.verify_mode = OpenSSL::SSL::VERIFY_NONE
37
+
38
+ request = Net::HTTP::Post.new(uri.request_uri, headers)
39
+ request.body = body
40
+
41
+ res = nil
42
+ begin
43
+ res = client.request(request)
44
+ rescue StandardError => e
45
+ SecureNativeLogger.error("Failed to send request; #{e}")
46
+ return res
47
+ end
48
+ res
31
49
  end
32
50
  end
@@ -1,10 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'models/event_options'
4
+ require 'models/user_traits'
5
+ require 'errors/securenative_invalid_options_error'
6
+
3
7
  class EventOptions
4
8
  attr_reader :event, :user_id, :user_traits, :context, :properties, :timestamp
5
9
  attr_writer :event, :user_id, :user_traits, :context, :properties, :timestamp
6
10
 
7
- def initialize(event, user_id = nil, user_traits = nil, context = nil, properties = nil, timestamp = nil)
11
+ MAX_PROPERTIES_SIZE = 10
12
+
13
+ def initialize(event: nil, user_id: nil, user_traits: nil, user_name: nil, email: nil, phone: nil, created_at: nil, context: nil, properties: nil, timestamp: nil)
14
+ if !properties.nil? && properties.length > MAX_PROPERTIES_SIZE
15
+ raise SecureNativeInvalidOptionsError, "You can have only up to #{MAX_PROPERTIES_SIZE} custom properties"
16
+ end
17
+
18
+ if user_traits.nil?
19
+ if user_name && email && phone && created_at
20
+ user_traits = UserTraits(user_name, email, phone, created_at)
21
+ elsif user_name && email && phone
22
+ user_traits = UserTraits(user_name, email, phone)
23
+ elsif user_name && email
24
+ user_traits = UserTraits(user_name, email)
25
+ else
26
+ user_traits = UserTraits.new
27
+ end
28
+ end
29
+
8
30
  @event = event
9
31
  @user_id = user_id
10
32
  @user_traits = user_traits
@@ -4,7 +4,7 @@ class RequestContext
4
4
  attr_reader :cid, :vid, :fp, :ip, :remote_ip, :headers, :url, :http_method
5
5
  attr_writer :cid, :vid, :fp, :ip, :remote_ip, :headers, :url, :http_method
6
6
 
7
- def initialize(cid = nil, vid = nil, fp = nil, ip = nil, remote_ip = nil, headers = nil, url = nil, method = nil)
7
+ def initialize(cid: nil, vid: nil, fp: nil, ip: nil, remote_ip: nil, headers: nil, url: nil, http_method: nil)
8
8
  @cid = cid
9
9
  @vid = vid
10
10
  @fp = fp
@@ -12,7 +12,7 @@ class RequestContext
12
12
  @remote_ip = remote_ip
13
13
  @headers = headers
14
14
  @url = url
15
- @method = method
15
+ @method = http_method
16
16
  end
17
17
  end
18
18
 
@@ -1,14 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'context/securenative_context'
4
+ require 'errors/securenative_invalid_options_error'
5
+ require 'utils/encryption_utils'
6
+ require 'utils/date_utils'
7
+ require 'models/request_context'
8
+ require 'securerandom'
9
+
3
10
  class SDKEvent
4
11
  attr_reader :context, :rid, :event_type, :user_id, :user_traits, :request, :timestamp, :properties
5
12
  attr_writer :context, :rid, :event_type, :user_id, :user_traits, :request, :timestamp, :properties
6
13
 
7
14
  def initialize(event_options, securenative_options)
15
+ if event_options.user_id.nil? || event_options.user_id.length <= 0 || event_options.user_id == ''
16
+ raise SecureNativeInvalidOptionsError.new, 'Invalid event structure; User Id is missing'
17
+ end
18
+
19
+ if event_options.event.nil? || event_options.event.length <= 0 || event_options.event == ''
20
+ raise SecureNativeInvalidOptionsError.new, 'Invalid event structure; Event Type is missing'
21
+ end
22
+
8
23
  @context = if !event_options.context.nil?
9
24
  event_options.context
10
25
  else
11
- ContextBuilder.default_context_builder
26
+ SecureNativeContext.default_context_builder
12
27
  end
13
28
 
14
29
  client_token = EncryptionUtils.decrypt(@context.client_token, securenative_options.api_key)
@@ -17,10 +32,11 @@ class SDKEvent
17
32
  @event_type = event_options.event
18
33
  @user_id = event_options.user_id
19
34
  @user_traits = event_options.user_traits
20
- @request = RequestContext(cid = client_token ? client_token.cid : '', vid = client_token ? client_token.vid : '',
21
- fp = client_token ? client_token.fp : '', ip = @context.ip,
22
- remote_ip = @context.remote_ip, method = @context.http_method, url = @context.url,
23
- headers = @context.headers)
35
+ @request = RequestContext.new(cid: client_token ? client_token.cid : '', vid: client_token ? client_token.vid : '',
36
+ fp: client_token ? client_token.fp : '', ip: @context.ip,
37
+ remote_ip: @context.remote_ip, headers: @context.headers,
38
+ url: @context.url, http_method: @context.http_method)
39
+
24
40
 
25
41
  @timestamp = DateUtils.to_timestamp(event_options.timestamp)
26
42
  @properties = event_options.properties
@@ -28,6 +44,6 @@ class SDKEvent
28
44
 
29
45
  def to_s
30
46
  "context: #{@context}, rid: #{@rid}, event_type: #{@event_type}, user_id: #{@user_id},
31
- user_traits: #{@user_traits}, request: #{@request}, timestamp: #{@timestamp}, properties: #{@properties}"
47
+ user_traits: #{@user_traits}, request: #{@request}, timestamp: #{@timestamp}, properties: #{@properties}"
32
48
  end
33
49
  end
@@ -4,7 +4,7 @@ class UserTraits
4
4
  attr_reader :name, :email, :phone, :created_at
5
5
  attr_writer :name, :email, :phone, :created_at
6
6
 
7
- def initialize(name = nil, email = nil, phone = nil, created_at = nil)
7
+ def initialize(name: nil, email: nil, phone: nil, created_at: nil)
8
8
  @name = name
9
9
  @email = email
10
10
  @created_at = created_at
@@ -4,9 +4,13 @@ class VerifyResult
4
4
  attr_reader :risk_level, :score, :triggers
5
5
  attr_writer :risk_level, :score, :triggers
6
6
 
7
- def initialize(risk_level = nil, score = nil, triggers = nil)
7
+ def initialize(risk_level: nil, score: nil, triggers: nil)
8
8
  @risk_level = risk_level
9
9
  @score = score
10
10
  @triggers = triggers
11
11
  end
12
+
13
+ def to_s
14
+ "risk_level: #{@risk_level}, score: #{@score}, triggers: #{@triggers}"
15
+ end
12
16
  end
@@ -8,7 +8,9 @@ require 'errors/securenative_sdk_Illegal_state_error'
8
8
  require 'errors/securenative_config_error'
9
9
  require 'enums/failover_strategy'
10
10
  require 'config/configuration_builder'
11
+ require 'config/configuration_manager'
11
12
  require 'event_manager'
13
+ require 'api_manager'
12
14
 
13
15
  class SecureNative
14
16
  attr_reader :options
@@ -60,16 +62,6 @@ class SecureNative
60
62
  @securenative
61
63
  end
62
64
 
63
- def self.config_builder(api_key = nil, api_url = 'https://api.securenative.com/collector/api/v1', interval = 1000,
64
- max_events = 1000, timeout = 1500, auto_send = true, disable = false, log_level = 'FATAL',
65
- fail_over_strategy = FailOverStrategy::FAIL_OPEN)
66
- ConfigurationBuilder.new(api_key, api_url, interval, max_events, timeout, auto_send, disable, log_level, fail_over_strategy)
67
- end
68
-
69
- def self.context_builder(client_token = nil, ip = nil, remote_ip = nil, headers = nil, url = nil, method = nil, body = nil)
70
- ContextBuilder.new(client_token, ip, remote_ip, headers, url, method, body)
71
- end
72
-
73
65
  def track(event_options)
74
66
  @api_manager.track(event_options)
75
67
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  class DateUtils
4
4
  def self.to_timestamp(date)
5
- return Time.now.strftime('%Y-%m-%dT%H:%M:%S%Z') if date.nil?
5
+ return Time.now.utc.iso8601 if date.nil?
6
6
 
7
7
  Time.parse(date).iso8601
8
8
  end
@@ -1,35 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'openssl'
4
+ require 'digest'
5
+ require 'base64'
6
+ require 'models/client_token'
4
7
 
5
8
  class EncryptionUtils
6
- BLOCK_SIZE = 16
7
- KEY_SIZE = 32
8
-
9
- def self.encrypt(text, cipher_key)
10
- cipher = OpenSSL::Cipher::AES.new(KEY_SIZE, :CBC).encrypt
11
- cipher.padding = 0
12
-
13
- if text.size % BLOCK_SIZE != 0
14
- return nil
9
+ def self.padding_key(key, length)
10
+ if key.length == length
11
+ key
12
+ else
13
+ if key.length > length
14
+ key.slice(0, length)
15
+ else
16
+ (length - key.length).times { key << '0' }
17
+ key
18
+ end
15
19
  end
16
-
17
- cipher_key = Digest::SHA1.hexdigest cipher_key
18
- cipher.key = cipher_key.slice(0, BLOCK_SIZE)
19
- s = cipher.update(text) + cipher.final
20
-
21
- s.unpack('H*')[0].upcase
22
20
  end
23
21
 
24
- def self.decrypt(encrypted, cipher_key)
25
- cipher = OpenSSL::Cipher::AES.new(KEY_SIZE, :CBC).decrypt
26
- cipher.padding = 0
27
-
28
- cipher_key = Digest::SHA1.hexdigest cipher_key
29
- cipher.key = cipher_key.slice(0, BLOCK_SIZE)
30
- s = [encrypted].pack('H*').unpack('C*').pack('c*')
22
+ def self.encrypt(plain_text, secret_key)
23
+ begin
24
+ cipher = OpenSSL::Cipher.new('aes-256-cbc')
25
+ cipher.encrypt
26
+ iv = cipher.random_iv
27
+ cipher.key = padding_key(secret_key, 32)
28
+ encrypted = cipher.update(plain_text) + cipher.final
29
+ (iv + encrypted).unpack1('H*')
30
+ rescue StandardError
31
+ ''
32
+ end
33
+ end
31
34
 
32
- rv = cipher.update(s) + cipher.final
33
- rv.strip
35
+ def self.decrypt(cipher_text, secret_key)
36
+ begin
37
+ cipher = OpenSSL::Cipher.new('aes-256-cbc')
38
+ cipher.decrypt
39
+ raw_data = [cipher_text].pack('H*')
40
+ cipher.iv = raw_data.slice(0, 16)
41
+ cipher.key = padding_key(secret_key, 32)
42
+ decrypted = JSON.parse(cipher.update(raw_data.slice(16, raw_data.length)) + cipher.final)
43
+
44
+ return ClientToken.new(decrypted['cid'], decrypted['vid'], decrypted['fp'])
45
+ rescue StandardError
46
+ ClientToken.new('', '','')
47
+ end
34
48
  end
35
49
  end
@@ -5,19 +5,65 @@ class RequestUtils
5
5
  SECURENATIVE_HEADER = 'x-securenative'
6
6
 
7
7
  def self.get_secure_header_from_request(headers)
8
- return headers[RequestUtils.SECURENATIVE_HEADER] unless headers.nil?
9
-
8
+ begin
9
+ return headers[SECURENATIVE_HEADER] unless headers.nil?
10
+ rescue StandardError
11
+ []
12
+ end
10
13
  []
11
14
  end
12
15
 
13
- def self.get_client_ip_from_request(request)
14
- x_forwarded_for = request.env['HTTP_X_FORWARDED_FOR']
15
- return x_forwarded_for unless x_forwarded_for.nil?
16
+ def self.get_client_ip_from_request(request, options = nil)
17
+ begin
18
+ return request.ip unless request.ip.nil?
19
+ rescue NoMethodError
20
+ end
21
+
22
+ begin
23
+ x_forwarded_for = request.env['HTTP_X_FORWARDED_FOR']
24
+ return x_forwarded_for unless x_forwarded_for.nil?
25
+ rescue NoMethodError
26
+ begin
27
+ x_forwarded_for = request['HTTP_X_FORWARDED_FOR']
28
+ return x_forwarded_for unless x_forwarded_for.nil?
29
+ rescue NoMethodError
30
+ end
31
+ end
32
+
33
+ begin
34
+ x_forwarded_for = request.env['REMOTE_ADDR']
35
+ return x_forwarded_for unless x_forwarded_for.nil?
36
+ rescue NoMethodError
37
+ begin
38
+ x_forwarded_for = request['REMOTE_ADDR']
39
+ return x_forwarded_for unless x_forwarded_for.nil?
40
+ rescue NoMethodError
41
+ end
42
+ end
43
+
44
+ unless options.nil?
45
+ for header in options.proxy_headers do
46
+ begin
47
+ h = request.env[header]
48
+ return h unless h.nil?
49
+ rescue NoMethodError
50
+ begin
51
+ h = request[header]
52
+ return h unless h.nil?
53
+ rescue NoMethodError
54
+ end
55
+ end
56
+ end
57
+ end
16
58
 
17
- request.env['REMOTE_ADDR']
59
+ ''
18
60
  end
19
61
 
20
62
  def self.get_remote_ip_from_request(request)
21
- request.remote_ip
63
+ begin
64
+ request.remote_ip
65
+ rescue NoMethodError
66
+ ''
67
+ end
22
68
  end
23
69
  end
@@ -8,17 +8,17 @@ class SecureNativeLogger
8
8
  def self.init_logger(level = 'DEBUG')
9
9
  @logger.level = case level
10
10
  when 'WARN'
11
- SecureNativeLogger::WARN
11
+ Logger::WARN
12
12
  when 'DEBUG'
13
- SecureNativeLogger::DEBUG
13
+ Logger::DEBUG
14
14
  when 'ERROR'
15
- SecureNativeLogger::ERROR
15
+ Logger::ERROR
16
16
  when 'FATAL'
17
- SecureNativeLogger::FATAL
17
+ Logger::FATAL
18
18
  when 'INFO'
19
- SecureNativeLogger::INFO
19
+ Logger::INFO
20
20
  else
21
- SecureNativeLogger::FATAL
21
+ Logger::FATAL
22
22
  end
23
23
 
24
24
  @logger.formatter = proc do |severity, datetime, progname, msg|
@@ -2,11 +2,10 @@
2
2
 
3
3
  class VersionUtils
4
4
  def self.version
5
- path = 'VERSION'
6
- file = File.open(path)
7
- version = file.read
8
- file.close
9
-
10
- version
5
+ begin
6
+ Gem.loaded_specs['securenative'].version.to_s
7
+ rescue StandardError
8
+ 'unknown'
9
+ end
11
10
  end
12
11
  end
@@ -2,45 +2,39 @@
2
2
 
3
3
  require 'api_manager'
4
4
  require 'webmock/rspec'
5
+ require 'config/configuration_builder'
6
+ require 'errors/securenative_invalid_options_error'
7
+ require 'models/event_options'
8
+ require 'models/verify_result'
9
+ require 'models/user_traits'
10
+ require 'enums/event_types'
11
+ require 'enums/risk_level'
12
+ require 'event_manager'
5
13
  require 'rspec'
6
14
 
7
15
  RSpec.describe ApiManager do
8
- let(:context) do
9
- ContextBuilder(ip: '127.0.0.1', client_token: 'SECURED_CLIENT_TOKEN',
10
- headers: { 'user-agent' => 'Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)
11
- AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405' })
12
- end
13
- let(:event_options) do
14
- EventOptions(event_type: EventTypes.LOG_IN, user_id: 'USER_ID',
15
- user_traits: UserTraits('USER_NAME', 'USER_EMAIL', '+1234567890'),
16
- properties: { prop1: 'CUSTOM_PARAM_VALUE', prop2: true, prop3: 3 }).build
17
- end
18
-
19
16
  it 'tracks an event' do
20
17
  options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', auto_send: true, interval: 10, api_url: 'https://api.securenative-stg.com/collector/api/v1')
21
18
 
22
- expected = '{"eventType":"sn.user.login","userId":"USER_ID","userTraits":{' \
23
- '"name":"USER_NAME","email":"USER_EMAIL","phone":"+1234567890","createdAt":null},"request":{' \
24
- '"cid":null,"vid":null,"fp":null,"ip":"127.0.0.1","remoteIp":null,"headers":{' \
25
- '"user-agent":"Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) ' \
26
- 'AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405"},"url":null,"method":null},' \
27
- '"properties":{"prop2":true,"prop1":"CUSTOM_PARAM_VALUE","prop3":3}}'
28
-
29
- stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/track')
30
- .with(body: JSON.parse(expected)).to_return(status: 200)
19
+ stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/track').to_return(status: 200)
31
20
  event_manager = EventManager.new(options)
32
21
  event_manager.start_event_persist
33
22
  api_manager = ApiManager.new(event_manager, options)
23
+ event_options = EventOptions.new(event: EventTypes::LOG_IN, user_id: 'USER_ID',
24
+ user_traits: UserTraits.new(name: 'USER_NAME', email: 'USER_EMAIL', phone: '+1234567890'),
25
+ properties: { prop1: 'CUSTOM_PARAM_VALUE', prop2: true, prop3: 3 })
34
26
 
35
27
  begin
36
- api_manager.track(:event_options)
28
+ res = api_manager.track(event_options)
37
29
  ensure
38
30
  event_manager.stop_event_persist
39
31
  end
32
+
33
+ expect(res).to_not be_nil
40
34
  end
41
35
 
42
36
  it 'uses invalid options' do
43
- options = ConfigurationBuilder(api_key: 'YOUR_API_KEY', auto_send: true, interval: 10, api_url: 'https://api.securenative-stg.com/collector/api/v1')
37
+ options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', auto_send: true, interval: 10, api_url: 'https://api.securenative-stg.com/collector/api/v1')
44
38
 
45
39
  properties = {}
46
40
  (0..12).each do |i|
@@ -53,7 +47,7 @@ RSpec.describe ApiManager do
53
47
  api_manager = ApiManager.new(event_manager, options)
54
48
 
55
49
  begin
56
- expect { api_manager.track(EventOptions(event_type: EventTypes.LOG_IN, properties: properties).build) }
50
+ expect { api_manager.track(EventOptions.new(event: EventTypes::LOG_IN, properties: properties)) }
57
51
  .to raise_error(SecureNativeInvalidOptionsError)
58
52
  ensure
59
53
  event_manager.stop_event_persist
@@ -61,21 +55,33 @@ RSpec.describe ApiManager do
61
55
  end
62
56
 
63
57
  it 'verifies an event' do
64
- options = ConfigurationBuilder(api_key: 'YOUR_API_KEY', api_url: 'https://api.securenative-stg.com/collector/api/v1')
58
+ options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', api_url: 'https://api.securenative-stg.com/collector/api/v1')
59
+
60
+ stub_request(:post, "https://api.securenative-stg.com/collector/api/v1/verify").
61
+ with(
62
+ headers: {
63
+ 'Accept'=>'*/*',
64
+ 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
65
+ 'Authorization'=>'YOUR_API_KEY',
66
+ 'Content-Type'=>'application/json',
67
+ 'Sn-Version'=>'0.1.22',
68
+ 'User-Agent'=>'SecureNative-ruby'
69
+ }).
70
+ to_return(status: 200, body: "", headers: {})
65
71
 
66
- stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/track')
67
- .with(body: { riskLevel: 'medium', score: 0.32, triggers: ['New IP', 'New City'] }).to_return(status: 200)
68
- verify_result = VerifyResult.new(RiskLevel.LOW, 0, nil)
69
72
 
70
73
  event_manager = EventManager.new(options)
71
74
  event_manager.start_event_persist
72
75
  api_manager = ApiManager.new(event_manager, options)
76
+ event_options = EventOptions.new(event: EventTypes::LOG_IN, user_id: 'USER_ID',
77
+ user_traits: UserTraits.new(name: 'USER_NAME', email: 'USER_EMAIL', phone: '+1234567890'),
78
+ properties: { prop1: 'CUSTOM_PARAM_VALUE', prop2: true, prop3: 3 })
73
79
 
74
- result = api_manager.verify(:event_options)
80
+ result = api_manager.verify(event_options)
75
81
 
76
82
  expect(result).not_to be_nil
77
- expect(result.risk_level).to eq(verify_result.risk_level)
78
- expect(result.score).to eq(verify_result.score)
79
- expect(result.triggers).to eq(verify_result.triggers)
83
+ expect(result.risk_level).to eq('low')
84
+ expect(result.score).to eq(0)
85
+ expect(result.triggers).to eq(nil)
80
86
  end
81
87
  end