42 lines
1 KiB
Ruby
42 lines
1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module TestHooks
|
|
class BaseService
|
|
attr_accessor :hook, :current_user, :trigger
|
|
|
|
def initialize(hook, current_user, trigger)
|
|
@hook = hook
|
|
@current_user = current_user
|
|
@trigger = trigger
|
|
end
|
|
|
|
def execute
|
|
trigger_key = hook.class.triggers.key(trigger.to_sym)
|
|
trigger_data_method = "#{trigger}_data"
|
|
|
|
if trigger_key.nil? || !self.respond_to?(trigger_data_method, true)
|
|
return error('Testing not available for this hook')
|
|
end
|
|
|
|
error_message = catch(:validation_error) do # rubocop:disable Cop/BanCatchThrow
|
|
sample_data = self.__send__(trigger_data_method) # rubocop:disable GitlabSecurity/PublicSend
|
|
|
|
return hook.execute(sample_data, trigger_key) # rubocop:disable Cop/AvoidReturnFromBlocks
|
|
end
|
|
|
|
error(error_message)
|
|
end
|
|
|
|
private
|
|
|
|
def error(message, http_status = nil)
|
|
result = {
|
|
message: message,
|
|
status: :error
|
|
}
|
|
|
|
result[:http_status] = http_status if http_status
|
|
result
|
|
end
|
|
end
|
|
end
|