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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rspec +1 -0
- data/.rubocop.yml +56 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +131 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +53 -0
- data/Rakefile +8 -0
- data/bima-shark-sdk.gemspec +36 -0
- data/bin/console +24 -0
- data/bin/setup +8 -0
- data/lib/bima-shark-sdk/rspec.rb +38 -0
- data/lib/bima-shark-sdk.rb +3 -0
- data/lib/shark/account.rb +7 -0
- data/lib/shark/activity.rb +11 -0
- data/lib/shark/asset.rb +13 -0
- data/lib/shark/base.rb +36 -0
- data/lib/shark/client/connection.rb +67 -0
- data/lib/shark/concerns/connected.rb +44 -0
- data/lib/shark/concerns/normalized_email.rb +13 -0
- data/lib/shark/configuration.rb +90 -0
- data/lib/shark/consent.rb +31 -0
- data/lib/shark/contact.rb +40 -0
- data/lib/shark/contact_log.rb +7 -0
- data/lib/shark/double_opt_in/execution.rb +50 -0
- data/lib/shark/double_opt_in/request.rb +45 -0
- data/lib/shark/error.rb +69 -0
- data/lib/shark/form_service/base.rb +11 -0
- data/lib/shark/form_service/form/container.rb +10 -0
- data/lib/shark/form_service/form/element.rb +83 -0
- data/lib/shark/form_service/form/multiple_choice.rb +21 -0
- data/lib/shark/form_service/form/rating_scale.rb +20 -0
- data/lib/shark/form_service/form/rating_star.rb +13 -0
- data/lib/shark/form_service/form/structure.rb +13 -0
- data/lib/shark/form_service/form/text_area.rb +10 -0
- data/lib/shark/form_service/form/text_field.rb +17 -0
- data/lib/shark/form_service/v2/base.rb +13 -0
- data/lib/shark/form_service/v2/form.rb +18 -0
- data/lib/shark/form_service/v2/form_input.rb +15 -0
- data/lib/shark/form_service/v2/form_version.rb +19 -0
- data/lib/shark/form_service.rb +21 -0
- data/lib/shark/group.rb +18 -0
- data/lib/shark/mailing_service/base.rb +11 -0
- data/lib/shark/mailing_service/configuration.rb +9 -0
- data/lib/shark/mailing_service/mail.rb +8 -0
- data/lib/shark/mailing_service/mailers/base_mailer.rb +96 -0
- data/lib/shark/mailing_service/renderers/context.rb +40 -0
- data/lib/shark/mailing_service/renderers/erb_renderer.rb +46 -0
- data/lib/shark/mailing_service.rb +23 -0
- data/lib/shark/membership.rb +16 -0
- data/lib/shark/middleware/compose_request.rb +41 -0
- data/lib/shark/middleware/status.rb +36 -0
- data/lib/shark/notification.rb +21 -0
- data/lib/shark/package.rb +7 -0
- data/lib/shark/permission.rb +7 -0
- data/lib/shark/rails.rb +13 -0
- data/lib/shark/rspec/fake_asset_service/object_cache.rb +76 -0
- data/lib/shark/rspec/fake_asset_service/public_id.rb +21 -0
- data/lib/shark/rspec/fake_asset_service/request.rb +154 -0
- data/lib/shark/rspec/fake_asset_service.rb +20 -0
- data/lib/shark/rspec/fake_consent_service/object_cache.rb +44 -0
- data/lib/shark/rspec/fake_consent_service/request.rb +53 -0
- data/lib/shark/rspec/fake_consent_service.rb +19 -0
- data/lib/shark/rspec/fake_contact_service/object_cache.rb +88 -0
- data/lib/shark/rspec/fake_contact_service/request.rb +170 -0
- data/lib/shark/rspec/fake_contact_service.rb +19 -0
- data/lib/shark/rspec/fake_double_opt_in/object_cache.rb +59 -0
- data/lib/shark/rspec/fake_double_opt_in/request.rb +133 -0
- data/lib/shark/rspec/fake_double_opt_in.rb +19 -0
- data/lib/shark/rspec/fake_mailing_service/request.rb +41 -0
- data/lib/shark/rspec/fake_mailing_service.rb +13 -0
- data/lib/shark/rspec/fake_notification_service/request.rb +53 -0
- data/lib/shark/rspec/fake_notification_service.rb +13 -0
- data/lib/shark/rspec/fake_subscription_service/object_cache.rb +54 -0
- data/lib/shark/rspec/fake_subscription_service/request.rb +100 -0
- data/lib/shark/rspec/fake_subscription_service.rb +19 -0
- data/lib/shark/rspec/fake_survey_service/object_cache.rb +36 -0
- data/lib/shark/rspec/fake_survey_service/request.rb +66 -0
- data/lib/shark/rspec/fake_survey_service.rb +19 -0
- data/lib/shark/rspec/fixtures/form_inputs.json +26 -0
- data/lib/shark/rspec/fixtures/form_structure.json +175 -0
- data/lib/shark/rspec/helpers/cache_helper.rb +44 -0
- data/lib/shark/rspec/helpers/fixtures.rb +26 -0
- data/lib/shark/rspec/helpers/form_service_helper.rb +27 -0
- data/lib/shark/rspec/helpers/response.rb +25 -0
- data/lib/shark/rspec/helpers.rb +26 -0
- data/lib/shark/subscription.rb +43 -0
- data/lib/shark/survey.rb +29 -0
- data/lib/shark/survey_participant.rb +37 -0
- data/lib/shark/version.rb +5 -0
- data/lib/shark.rb +91 -0
- 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
|
data/lib/shark/rails.rb
ADDED
|
@@ -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
|