bima-shark-sdk 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +56 -0
  5. data/.travis.yml +10 -0
  6. data/CHANGELOG.md +131 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +53 -0
  10. data/Rakefile +8 -0
  11. data/bima-shark-sdk.gemspec +36 -0
  12. data/bin/console +24 -0
  13. data/bin/setup +8 -0
  14. data/lib/bima-shark-sdk/rspec.rb +38 -0
  15. data/lib/bima-shark-sdk.rb +3 -0
  16. data/lib/shark/account.rb +7 -0
  17. data/lib/shark/activity.rb +11 -0
  18. data/lib/shark/asset.rb +13 -0
  19. data/lib/shark/base.rb +36 -0
  20. data/lib/shark/client/connection.rb +67 -0
  21. data/lib/shark/concerns/connected.rb +44 -0
  22. data/lib/shark/concerns/normalized_email.rb +13 -0
  23. data/lib/shark/configuration.rb +90 -0
  24. data/lib/shark/consent.rb +31 -0
  25. data/lib/shark/contact.rb +40 -0
  26. data/lib/shark/contact_log.rb +7 -0
  27. data/lib/shark/double_opt_in/execution.rb +50 -0
  28. data/lib/shark/double_opt_in/request.rb +45 -0
  29. data/lib/shark/error.rb +69 -0
  30. data/lib/shark/form_service/base.rb +11 -0
  31. data/lib/shark/form_service/form/container.rb +10 -0
  32. data/lib/shark/form_service/form/element.rb +83 -0
  33. data/lib/shark/form_service/form/multiple_choice.rb +21 -0
  34. data/lib/shark/form_service/form/rating_scale.rb +20 -0
  35. data/lib/shark/form_service/form/rating_star.rb +13 -0
  36. data/lib/shark/form_service/form/structure.rb +13 -0
  37. data/lib/shark/form_service/form/text_area.rb +10 -0
  38. data/lib/shark/form_service/form/text_field.rb +17 -0
  39. data/lib/shark/form_service/v2/base.rb +13 -0
  40. data/lib/shark/form_service/v2/form.rb +18 -0
  41. data/lib/shark/form_service/v2/form_input.rb +15 -0
  42. data/lib/shark/form_service/v2/form_version.rb +19 -0
  43. data/lib/shark/form_service.rb +21 -0
  44. data/lib/shark/group.rb +18 -0
  45. data/lib/shark/mailing_service/base.rb +11 -0
  46. data/lib/shark/mailing_service/configuration.rb +9 -0
  47. data/lib/shark/mailing_service/mail.rb +8 -0
  48. data/lib/shark/mailing_service/mailers/base_mailer.rb +96 -0
  49. data/lib/shark/mailing_service/renderers/context.rb +40 -0
  50. data/lib/shark/mailing_service/renderers/erb_renderer.rb +46 -0
  51. data/lib/shark/mailing_service.rb +23 -0
  52. data/lib/shark/membership.rb +16 -0
  53. data/lib/shark/middleware/compose_request.rb +41 -0
  54. data/lib/shark/middleware/status.rb +36 -0
  55. data/lib/shark/notification.rb +21 -0
  56. data/lib/shark/package.rb +7 -0
  57. data/lib/shark/permission.rb +7 -0
  58. data/lib/shark/rails.rb +13 -0
  59. data/lib/shark/rspec/fake_asset_service/object_cache.rb +76 -0
  60. data/lib/shark/rspec/fake_asset_service/public_id.rb +21 -0
  61. data/lib/shark/rspec/fake_asset_service/request.rb +154 -0
  62. data/lib/shark/rspec/fake_asset_service.rb +20 -0
  63. data/lib/shark/rspec/fake_consent_service/object_cache.rb +44 -0
  64. data/lib/shark/rspec/fake_consent_service/request.rb +53 -0
  65. data/lib/shark/rspec/fake_consent_service.rb +19 -0
  66. data/lib/shark/rspec/fake_contact_service/object_cache.rb +88 -0
  67. data/lib/shark/rspec/fake_contact_service/request.rb +170 -0
  68. data/lib/shark/rspec/fake_contact_service.rb +19 -0
  69. data/lib/shark/rspec/fake_double_opt_in/object_cache.rb +59 -0
  70. data/lib/shark/rspec/fake_double_opt_in/request.rb +133 -0
  71. data/lib/shark/rspec/fake_double_opt_in.rb +19 -0
  72. data/lib/shark/rspec/fake_mailing_service/request.rb +41 -0
  73. data/lib/shark/rspec/fake_mailing_service.rb +13 -0
  74. data/lib/shark/rspec/fake_notification_service/request.rb +53 -0
  75. data/lib/shark/rspec/fake_notification_service.rb +13 -0
  76. data/lib/shark/rspec/fake_subscription_service/object_cache.rb +54 -0
  77. data/lib/shark/rspec/fake_subscription_service/request.rb +100 -0
  78. data/lib/shark/rspec/fake_subscription_service.rb +19 -0
  79. data/lib/shark/rspec/fake_survey_service/object_cache.rb +36 -0
  80. data/lib/shark/rspec/fake_survey_service/request.rb +66 -0
  81. data/lib/shark/rspec/fake_survey_service.rb +19 -0
  82. data/lib/shark/rspec/fixtures/form_inputs.json +26 -0
  83. data/lib/shark/rspec/fixtures/form_structure.json +175 -0
  84. data/lib/shark/rspec/helpers/cache_helper.rb +44 -0
  85. data/lib/shark/rspec/helpers/fixtures.rb +26 -0
  86. data/lib/shark/rspec/helpers/form_service_helper.rb +27 -0
  87. data/lib/shark/rspec/helpers/response.rb +25 -0
  88. data/lib/shark/rspec/helpers.rb +26 -0
  89. data/lib/shark/subscription.rb +43 -0
  90. data/lib/shark/survey.rb +29 -0
  91. data/lib/shark/survey_participant.rb +37 -0
  92. data/lib/shark/version.rb +5 -0
  93. data/lib/shark.rb +91 -0
  94. metadata +291 -0
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module MailingService
5
+ module Mailers
6
+ class BaseMailer
7
+ class << self
8
+ attr_writer :layout, :template_root
9
+
10
+ def layout
11
+ @layout || MailingService.config.default_layout
12
+ end
13
+
14
+ def method_missing(method, *args, &block)
15
+ return super unless respond_to?(method)
16
+
17
+ instance = new(
18
+ layout: layout,
19
+ template_name: method.to_s,
20
+ template_path: File.join(template_root.to_s, name.underscore)
21
+ )
22
+ instance.send(method, *args)
23
+ instance
24
+ end
25
+
26
+ def template_root
27
+ @template_root || MailingService.config.default_template_root
28
+ end
29
+
30
+ protected
31
+
32
+ def respond_to_missing?(method, include_private = false)
33
+ known_methods = if include_private
34
+ instance_methods(false)
35
+ else
36
+ public_instance_methods(false)
37
+ end
38
+ known_methods.include?(method)
39
+ end
40
+ end
41
+
42
+ attr_reader :layout, :template_name, :template_path
43
+
44
+ def initialize(layout:, template_path:, template_name:)
45
+ @layout = layout
46
+ @template_name = template_name
47
+ @template_path = template_path
48
+ end
49
+
50
+ def deliver
51
+ @mail.save
52
+ end
53
+ alias deliver_now deliver
54
+
55
+ protected
56
+
57
+ def body(format, locals = {})
58
+ renderer.render(template_name, format, locals)
59
+ end
60
+
61
+ def attribute_with_default(attributes, attribute)
62
+ return attributes[attribute] if attributes.key?(attribute)
63
+
64
+ I18n.t!("#{self.class.name.underscore}.#{template_name}.#{attribute}")
65
+ rescue StandardError
66
+ nil
67
+ end
68
+
69
+ def mail(attributes)
70
+ locals = attributes[:locals] || {}
71
+ mail_attributes = {
72
+ layout: layout,
73
+ reply_to: attributes[:reply_to],
74
+ recipient: attributes[:to],
75
+ subject: attribute_with_default(attributes, :subject),
76
+ header: attribute_with_default(attributes, :header),
77
+ sub_header: attribute_with_default(attributes, :sub_header),
78
+ html_body: body(:html, locals),
79
+ text_body: body(:text, locals),
80
+ attachments: attributes[:attachments] || {}
81
+ }
82
+ %i[from header_image reply_to unsubscribe_url].each do |key|
83
+ value = attributes[key]
84
+ mail_attributes[key] = value if value.present?
85
+ end
86
+
87
+ @mail = Shark::MailingService::Mail.new(mail_attributes)
88
+ end
89
+
90
+ def renderer
91
+ @renderer ||= Renderers::ErbRenderer.new(template_path)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module MailingService
5
+ module Renderers
6
+ class Context
7
+ extend Forwardable
8
+
9
+ attr_writer :format
10
+
11
+ def_delegator :I18n, :t
12
+
13
+ def initialize(renderer, locals = {})
14
+ @locals = locals.symbolize_keys
15
+ @renderer = renderer
16
+ end
17
+
18
+ def binding
19
+ super
20
+ end
21
+
22
+ def render(template, locals = {})
23
+ @renderer.render(template, @format, locals)
24
+ end
25
+
26
+ protected
27
+
28
+ def method_missing(name, *args, &block)
29
+ return super unless respond_to?(name)
30
+
31
+ @locals[name]
32
+ end
33
+
34
+ def respond_to_missing?(name, _include_all)
35
+ @locals.keys.include?(name.to_sym)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+
5
+ module Shark
6
+ module MailingService
7
+ module Renderers
8
+ class ErbRenderer
9
+ attr_reader :template_folder
10
+
11
+ def initialize(template_folder)
12
+ @template_folder = template_folder
13
+ end
14
+
15
+ def render(template, format, locals = {})
16
+ template = load_template(template, format)
17
+ context = build_context(format, locals)
18
+ ::ERB.new(template).result(context.binding)
19
+ end
20
+
21
+ protected
22
+
23
+ def build_context(format, locals)
24
+ context_class = Class.new(Context) do
25
+ if MailingService.config.context_helpers.present?
26
+ MailingService.config.context_helpers.each do |helper|
27
+ include helper
28
+ end
29
+ end
30
+ end
31
+
32
+ context = context_class.new(self, locals)
33
+ context.format = format
34
+
35
+ context
36
+ end
37
+
38
+ def load_template(template, format, language = 'de')
39
+ filename = "#{template}.#{language}.#{format}.erb"
40
+ path = ::File.join(template_folder, filename)
41
+ ::File.read(path)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shark/mailing_service/base'
4
+ require 'shark/mailing_service/mail'
5
+
6
+ module Shark
7
+ module MailingService
8
+ class << self
9
+ def use_shark_mailer
10
+ require 'shark/mailing_service/configuration'
11
+ require 'shark/mailing_service/renderers/context'
12
+ require 'shark/mailing_service/renderers/erb_renderer'
13
+ require 'shark/mailing_service/mailers/base_mailer'
14
+
15
+ yield(config)
16
+ end
17
+
18
+ def config
19
+ @config ||= Configuration.new
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ class Membership < Base
5
+ extend ContactService::Resource
6
+
7
+ belongs_to :group
8
+
9
+ def self.exists?(group_id:, contact_id:)
10
+ where(group_id: group_id, contact_id: contact_id).first
11
+ true
12
+ rescue Shark::ResourceNotFound
13
+ false
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module Middleware
5
+ class ComposeRequest < Faraday::Middleware
6
+ HTTP_METHODS_WITH_BODY = %i[post patch put].freeze
7
+ CONTENT_TYPE = 'Content-Type'
8
+ JSON_MIME_TYPE = 'application/json'
9
+ JSON_MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}.freeze
10
+
11
+ def call(env)
12
+ compose_request_body(env) if request_with_body?(env)
13
+
14
+ @app.call(env)
15
+ end
16
+
17
+ def request_with_body?(env)
18
+ HTTP_METHODS_WITH_BODY.include?(env[:method])
19
+ end
20
+
21
+ def compose_request_body(env)
22
+ type = request_type(env)
23
+ params = env[:body] || {}
24
+
25
+ params = if JSON_MIME_TYPE_REGEX =~ type
26
+ ::JSON.dump(params)
27
+ else
28
+ params.to_param
29
+ end
30
+
31
+ env[:body] = params
32
+ end
33
+
34
+ def request_type(env)
35
+ type = env[:request_headers][CONTENT_TYPE].to_s
36
+ type = type.split(';', 2).first if type.index(';')
37
+ type
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module Middleware
5
+ class Status < Faraday::Middleware
6
+ def call(environment)
7
+ @app.call(environment).on_complete do |env|
8
+ handle_status(env[:status], env)
9
+
10
+ if env[:body].is_a?(Hash)
11
+ status = env[:body].fetch('meta', {}).fetch('status', 200).to_i
12
+ handle_status(status, env)
13
+ end
14
+ end
15
+ rescue Faraday::ConnectionFailed, Faraday::TimeoutError
16
+ raise ConnectionError, environment
17
+ end
18
+
19
+ private
20
+
21
+ def handle_status(status, environment)
22
+ return if (200..399).cover?(status)
23
+
24
+ case status
25
+ when 401 then raise NotAuthorized.new(status, environment)
26
+ when 403 then raise AccessDenied.new(status, environment)
27
+ when 404 then raise ResourceNotFound.new(status, environment)
28
+ when 409 then raise ResourceConflict.new(status, environment)
29
+ when 422 then raise UnprocessableEntity.new(status, environment)
30
+ when 500..599 then raise ServerError.new(status, environment)
31
+ else raise UnexpectedStatus.new(status, environment)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ class Notification < Base
5
+ extend NotificationService::Resource
6
+
7
+ custom_endpoint :bulk_creation, on: :collection, request_method: :post
8
+ custom_endpoint :read_all, on: :collection, request_method: :patch
9
+
10
+ def self.create_multiple(attributes)
11
+ data = {
12
+ data: {
13
+ type: 'notifications',
14
+ attributes: attributes
15
+ }
16
+ }
17
+
18
+ bulk_creation(data)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ class Package < Base
5
+ extend AssetService::Resource
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ class Permission < Base
5
+ extend ContactService::Resource
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ if Object.const_defined?(:Rails) && Rails.const_defined?(:Railtie)
5
+ class Railtie < Rails::Railtie
6
+ initializer 'bima_shark_sdk.initialize' do |_|
7
+ Shark.configure do |config|
8
+ config.logger = ::Rails.logger
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module RSpec
5
+ module FakeAssetService
6
+ class ObjectCache
7
+ include Singleton
8
+
9
+ def initialize
10
+ @objects = {}
11
+ @blobs = {}
12
+ end
13
+
14
+ def host
15
+ Shark.configuration.asset_service.site
16
+ end
17
+
18
+ def self.clear
19
+ instance.clear
20
+ end
21
+
22
+ def add(payload_data)
23
+ id = payload_data.delete('id') || SecureRandom.uuid
24
+ base_uri = "#{host}/assets"
25
+ public_id = PublicId.encode_id(id)
26
+
27
+ @objects[id] = {
28
+ 'id' => id,
29
+ 'attributes' => payload_data,
30
+ 'links' => {
31
+ 'download' => "#{base_uri}/public/#{public_id}",
32
+ 'upload' => "#{base_uri}/#{id}/upload",
33
+ 'show' => "#{base_uri}/#{id}",
34
+ 'self' => "#{base_uri}/#{id}"
35
+ }
36
+ }
37
+ end
38
+
39
+ def add_blob(id, blob)
40
+ @blobs[id] = blob
41
+ end
42
+
43
+ def clear
44
+ @objects = {}
45
+ end
46
+
47
+ def find(id)
48
+ @objects[id]
49
+ end
50
+
51
+ def find_blob(id)
52
+ @blobs[id]
53
+ end
54
+
55
+ def remove(id)
56
+ @objects.delete(id)
57
+ end
58
+
59
+ def remove_blob(id)
60
+ @blobs.delete(id)
61
+ end
62
+
63
+ def objects
64
+ @objects.values
65
+ end
66
+
67
+ def objects=(new_objects)
68
+ @objects = new_objects.map do |new_object|
69
+ object_id = new_object['id']
70
+ [object_id, new_object]
71
+ end.to_h
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module RSpec
5
+ module FakeAssetService
6
+ module PublicId
7
+ module_function
8
+
9
+ def decode_public_id(public_id)
10
+ Base64.urlsafe_decode64(public_id)
11
+ rescue ArgumentError
12
+ nil
13
+ end
14
+
15
+ def encode_id(id)
16
+ Base64.urlsafe_encode64(id)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'webmock/rspec'
4
+
5
+ module Shark
6
+ module RSpec
7
+ module FakeAssetService
8
+ class Request
9
+ include Singleton
10
+
11
+ def self.setup
12
+ instance = self.instance
13
+ instance.stub_requests
14
+ end
15
+
16
+ def host
17
+ Shark.configuration.asset_service.site
18
+ end
19
+
20
+ def stub_requests
21
+ WebMock.stub_request(:get, uri_patterns[:resource]).to_return do |request|
22
+ log_info '[Shark][AssetService] Faking GET request'
23
+
24
+ id = extract_id_from_request_uri(request.uri)
25
+
26
+ object_data = ObjectCache.instance.find(id)
27
+
28
+ if object_data.present?
29
+ SharkSpec.fake_response(200, data: object_data)
30
+ else
31
+ SharkSpec.fake_response(404, errors: [])
32
+ end
33
+ end
34
+
35
+ WebMock.stub_request(:get, uri_patterns[:download]).to_return do |request|
36
+ log_info '[Shark][AssetService] Faking GET request'
37
+
38
+ public_id = extract_id_from_request_uri(request.uri)
39
+ id = PublicId.decode_public_id(public_id)
40
+
41
+ blob = ObjectCache.instance.find_blob(id)
42
+
43
+ if blob.present?
44
+ SharkSpec.fake_response(200, blob)
45
+ else
46
+ SharkSpec.fake_response(404, nil)
47
+ end
48
+ end
49
+
50
+ WebMock.stub_request(:get, uri_patterns[:resources]).to_return do |_request|
51
+ log_info '[Shark][AssetService] Faking GET request'
52
+ SharkSpec.fake_response(200, data: ObjectCache.instance.objects)
53
+ end
54
+
55
+ WebMock.stub_request(:delete, uri_patterns[:resource]).to_return do |request|
56
+ log_info '[Shark][AssetService] Faking DELETE request'
57
+
58
+ id = extract_id_from_request_uri(request.uri)
59
+
60
+ ObjectCache.instance.remove(id)
61
+
62
+ SharkSpec.fake_response(204, nil)
63
+ end
64
+
65
+ WebMock.stub_request(:post, uri_patterns[:resources]).to_return do |request|
66
+ log_info "[Shark][AssetService] Faking POST request with body: #{request.body}"
67
+
68
+ payload = get_payload(request.body)
69
+ object_data = ObjectCache.instance.add(payload)
70
+
71
+ SharkSpec.fake_response(200, data: object_data)
72
+ end
73
+
74
+ WebMock.stub_request(:post, uri_patterns[:recreate_variations]).to_return do |request|
75
+ log_info '[Shark][AssetService] Faking POST request'
76
+
77
+ id = extract_id_from_request_uri(request.uri)
78
+
79
+ if ObjectCache.instance.find(id)
80
+ SharkSpec.fake_response(204, nil)
81
+ else
82
+ SharkSpec.fake_response(404, errors: [])
83
+ end
84
+ end
85
+
86
+ WebMock.stub_request(:post, %r{^#{host}/packages}).to_return do |request|
87
+ log_info "[Shark][AssetService] Faking POST request with body: #{request.body}"
88
+
89
+ payload = get_payload(request.body)
90
+
91
+ package_data = {
92
+ attributes: {
93
+ filename: payload['filename'],
94
+ directory: payload['directory']
95
+ }
96
+ }
97
+
98
+ object_data = ObjectCache.instance.add(package_data)
99
+
100
+ SharkSpec.fake_response(200, data: object_data)
101
+ end
102
+
103
+ WebMock.stub_request(:get, %r{^#{host}/.+/download}).to_return do |_request|
104
+ log_info '[Shark][AssetService] Faking GET download request'
105
+
106
+ SharkSpec.fake_response(200, body: 'Lorem ipsum')
107
+ end
108
+
109
+ WebMock.stub_request(:put, %r{^#{host}/.+/upload}).to_return do |request|
110
+ log_info '[Shark][AssetService] Faking PUT upload request'
111
+
112
+ id = extract_id_from_request_uri(request.uri)
113
+ object_data = ObjectCache.instance.find(id)
114
+
115
+ object_data['attributes']['uploaded-at'] = 1 if object_data.present?
116
+
117
+ SharkSpec.fake_response(200, body: '<response>true</response>')
118
+ end
119
+ end
120
+
121
+ def log_info(message)
122
+ Shark.logger.info message
123
+ end
124
+
125
+ private
126
+
127
+ def extract_id_from_request_uri(uri)
128
+ path = uri.path
129
+ base_path = path['/assets/public/'] ? '/assets/public' : '/assets'
130
+ path.match(%r{#{base_path}/([^/]+)[/?]?})[1]
131
+ end
132
+
133
+ def uri_patterns
134
+ base_uri = "#{host}/assets"
135
+ id = '[^/]+'
136
+ optional_query = '(\?.*)?'
137
+
138
+ {
139
+ resources: /\A#{base_uri}#{optional_query}\z/,
140
+ resource: %r{\A#{base_uri}/#{id}#{optional_query}\z},
141
+ download: %r{\A#{base_uri}/public/#{id}#{optional_query}\z},
142
+ recreate_variations: %r{\A#{base_uri}/#{id}/recreate_variations#{optional_query}\z}
143
+ }
144
+ end
145
+
146
+ def get_payload(body)
147
+ payload = JSON.parse(body)['data']
148
+ payload['attributes']['id'] = payload['id'] if payload['id']
149
+ payload['attributes']
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'fake_asset_service/public_id'
4
+ require_relative 'fake_asset_service/object_cache'
5
+ require_relative 'fake_asset_service/request'
6
+
7
+ module Shark
8
+ module RSpec
9
+ module FakeAssetService
10
+ def self.setup
11
+ ObjectCache.clear
12
+ Request.setup
13
+ end
14
+
15
+ def self.reset
16
+ ObjectCache.clear
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shark
4
+ module RSpec
5
+ module FakeConsentService
6
+ class ObjectCache
7
+ include Singleton
8
+ attr_accessor :objects
9
+
10
+ def initialize
11
+ @objects = []
12
+ end
13
+
14
+ def self.clear
15
+ instance.objects = []
16
+ end
17
+
18
+ def add(payload_data)
19
+ id = payload_data['attributes']['legal_subject_id']
20
+ existing_object = objects.detect { |o| o['id'] == id }
21
+
22
+ items = (existing_object.present? && existing_object['attributes']['items']) || {}
23
+
24
+ (payload_data['attributes']['items'] || {}).each do |name, attrs|
25
+ items[name] = attrs.merge({ 'updated_at' => Time.now })
26
+ end
27
+
28
+ objects.delete_if { |o| o['id'] == id }
29
+
30
+ object = {
31
+ 'id' => id,
32
+ 'attributes' => {
33
+ 'items' => items
34
+ },
35
+ 'type' => 'consents'
36
+ }
37
+
38
+ objects.push(object)
39
+ object
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end