bima-shark-sdk 2.3.0

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 (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