bima-shark-sdk 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|