loading
Generated 2024-08-28T09:54:09+02:00

All Files ( 99.45% covered at 9.33 hits/line )

8 files in total.
181 relevant lines, 180 lines covered and 1 lines missed. ( 99.45% )

Errors ( 96.55% covered at 2.83 hits/line )

3 files in total.
29 relevant lines, 28 lines covered and 1 lines missed. ( 96.55% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
lib/PCP-server-Ruby-SDK/errors/api_error_response_exception.rb 100.00 % 15 9 9 0 1.78
lib/PCP-server-Ruby-SDK/errors/api_exception.rb 93.75 % 27 16 15 1 3.75
lib/PCP-server-Ruby-SDK/errors/api_response_retrieval_exception.rb 100.00 % 7 4 4 0 1.50

API ( 100.0% covered at 0.0 hits/line )

0 files in total.
0 relevant lines, 0 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line

Utils ( 100.0% covered at 5.64 hits/line )

1 files in total.
11 relevant lines, 11 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
lib/PCP-server-Ruby-SDK/utils/server_meta_info.rb 100.00 % 22 11 11 0 5.64

Queries ( 100.0% covered at 15.86 hits/line )

2 files in total.
86 relevant lines, 86 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
lib/PCP-server-Ruby-SDK/queries/get_checkouts_query.rb 100.00 % 61 42 42 0 28.00
lib/PCP-server-Ruby-SDK/queries/get_commerce_cases_query.rb 100.00 % 71 44 44 0 4.27

Ungrouped ( 100.0% covered at 3.27 hits/line )

2 files in total.
55 relevant lines, 55 lines covered and 0 lines missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
lib/PCP-server-Ruby-SDK/communicator_configuration.rb 100.00 % 9 6 6 0 5.00
lib/PCP-server-Ruby-SDK/request_header_generator.rb 100.00 % 74 49 49 0 3.06

lib/PCP-server-Ruby-SDK/communicator_configuration.rb

100.0% lines covered

6 relevant lines. 6 lines covered and 0 lines missed.
    
  1. 1 class CommunicatorConfiguration
  2. 1 attr_reader :api_key, :api_secret, :host
  3. 1 def initialize(api_key, api_secret, host)
  4. 9 @api_key = api_key
  5. 9 @api_secret = api_secret
  6. 9 @host = host
  7. end
  8. end

lib/PCP-server-Ruby-SDK/errors/api_error_response_exception.rb

100.0% lines covered

9 relevant lines. 9 lines covered and 0 lines missed.
    
  1. 1 require_relative '../models/api_error'
  2. 1 require_relative 'api_exception'
  3. 1 class ApiErrorResponseException < ApiException
  4. 1 attr_reader :errors
  5. 1 def initialize(status_code, response_body, errors = [])
  6. 4 super(status_code, response_body)
  7. 4 @errors = errors.any? ? errors : []
  8. end
  9. 1 def get_errors
  10. 2 @errors
  11. end
  12. end

lib/PCP-server-Ruby-SDK/errors/api_exception.rb

93.75% lines covered

16 relevant lines. 15 lines covered and 1 lines missed.
    
  1. 1 class ApiException < StandardError
  2. 1 attr_reader :status_code, :response_body
  3. 1 def initialize(status_code, response_body, cause = nil)
  4. 11 super(response_body)
  5. 11 @status_code = status_code
  6. 11 @response_body = response_body
  7. 11 set_backtrace(cause.backtrace) if cause
  8. end
  9. 1 def to_s
  10. 1 message
  11. end
  12. 1 def message
  13. 2 if @message.nil?
  14. 2 msg = "Error message: the server returns an error"
  15. else
  16. msg = @message
  17. end
  18. 2 msg += "\nHTTP status code: #{status_code}" if status_code
  19. 2 msg += "\nResponse body: #{response_body}" if response_body
  20. 2 msg
  21. end
  22. end

lib/PCP-server-Ruby-SDK/errors/api_response_retrieval_exception.rb

100.0% lines covered

4 relevant lines. 4 lines covered and 0 lines missed.
    
  1. 1 require_relative 'api_exception'
  2. 1 class ApiResponseRetrievalException < ApiException
  3. 1 def initialize(status_code, response_body, cause = nil)
  4. 3 super(status_code, response_body, cause)
  5. end
  6. end

lib/PCP-server-Ruby-SDK/queries/get_checkouts_query.rb

100.0% lines covered

42 relevant lines. 42 lines covered and 0 lines missed.
    
  1. 1 require 'set'
  2. 1 class GetCheckoutsQuery
  3. 1 attr_accessor :offset, :size, :from_date, :to_date,
  4. :from_checkout_amount, :to_checkout_amount,
  5. :from_open_amount, :to_open_amount,
  6. :from_collected_amount, :to_collected_amount,
  7. :from_cancelled_amount, :to_cancelled_amount,
  8. :from_refund_amount, :to_refund_amount,
  9. :from_chargeback_amount, :to_chargeback_amount,
  10. :checkout_id, :merchant_reference, :merchant_customer_id,
  11. :include_payment_product_id, :include_checkout_status,
  12. :include_extended_checkout_status, :include_payment_channel,
  13. :payment_reference, :payment_id, :first_name, :surname,
  14. :email, :phone_number, :date_of_birth, :company_information
  15. 1 def initialize
  16. 37 @include_payment_product_id = []
  17. 37 @include_checkout_status = []
  18. 37 @include_extended_checkout_status = []
  19. 37 @include_payment_channel = []
  20. end
  21. 1 def to_query_map
  22. 31 query = {}
  23. 31 query['offset'] = @offset.to_s if @offset
  24. 31 query['size'] = @size.to_s if @size
  25. 31 query['fromDate'] = @from_date if @from_date
  26. 31 query['toDate'] = @to_date if @to_date
  27. 31 query['fromCheckoutAmount'] = @from_checkout_amount.to_s if @from_checkout_amount
  28. 31 query['toCheckoutAmount'] = @to_checkout_amount.to_s if @to_checkout_amount
  29. 31 query['fromOpenAmount'] = @from_open_amount.to_s if @from_open_amount
  30. 31 query['toOpenAmount'] = @to_open_amount.to_s if @to_open_amount
  31. 31 query['fromCollectedAmount'] = @from_collected_amount.to_s if @from_collected_amount
  32. 31 query['toCollectedAmount'] = @to_collected_amount.to_s if @to_collected_amount
  33. 31 query['fromCancelledAmount'] = @from_cancelled_amount.to_s if @from_cancelled_amount
  34. 31 query['toCancelledAmount'] = @to_cancelled_amount.to_s if @to_cancelled_amount
  35. 31 query['fromRefundAmount'] = @from_refund_amount.to_s if @from_refund_amount
  36. 31 query['toRefundAmount'] = @to_refund_amount.to_s if @to_refund_amount
  37. 31 query['fromChargebackAmount'] = @from_chargeback_amount.to_s if @from_chargeback_amount
  38. 31 query['toChargebackAmount'] = @to_chargeback_amount.to_s if @to_chargeback_amount
  39. 31 query['checkoutId'] = @checkout_id if @checkout_id
  40. 31 query['merchantReference'] = @merchant_reference if @merchant_reference
  41. 31 query['merchantCustomerId'] = @merchant_customer_id if @merchant_customer_id
  42. 31 query['includePaymentProductId'] = @include_payment_product_id.join(',') if @include_payment_product_id.any?
  43. 31 query['includeCheckoutStatus'] = @include_checkout_status.join(',') if @include_checkout_status.any?
  44. 31 query['includeExtendedCheckoutStatus'] = @include_extended_checkout_status.join(',') if @include_extended_checkout_status.any?
  45. 31 query['includePaymentChannel'] = @include_payment_channel.join(',') if @include_payment_channel.any?
  46. 31 query['paymentReference'] = @payment_reference if @payment_reference
  47. 31 query['paymentId'] = @payment_id if @payment_id
  48. 31 query['firstName'] = @first_name if @first_name
  49. 31 query['surname'] = @surname if @surname
  50. 31 query['email'] = @email if @email
  51. 31 query['phoneNumber'] = @phone_number if @phone_number
  52. 31 query['dateOfBirth'] = @date_of_birth if @date_of_birth
  53. 31 query['companyInformation'] = @company_information if @company_information
  54. 31 query
  55. end
  56. end

lib/PCP-server-Ruby-SDK/queries/get_commerce_cases_query.rb

100.0% lines covered

44 relevant lines. 44 lines covered and 0 lines missed.
    
  1. 1 class GetCommerceCasesQuery
  2. 1 attr_accessor :offset, :size, :from_date, :to_date,
  3. :commerce_case_id, :merchant_reference, :merchant_customer_id,
  4. :include_checkout_status, :include_payment_channel
  5. 1 def initialize
  6. 20 @include_checkout_status = []
  7. 20 @include_payment_channel = []
  8. end
  9. 1 def set_offset(offset)
  10. 2 @offset = offset
  11. 2 self
  12. end
  13. 1 def set_size(size)
  14. 2 @size = size
  15. 2 self
  16. end
  17. 1 def set_from_date(from_date)
  18. 2 @from_date = from_date
  19. 2 self
  20. end
  21. 1 def set_to_date(to_date)
  22. 2 @to_date = to_date
  23. 2 self
  24. end
  25. 1 def set_commerce_case_id(commerce_case_id)
  26. 2 @commerce_case_id = commerce_case_id
  27. 2 self
  28. end
  29. 1 def set_merchant_reference(merchant_reference)
  30. 2 @merchant_reference = merchant_reference
  31. 2 self
  32. end
  33. 1 def set_merchant_customer_id(merchant_customer_id)
  34. 2 @merchant_customer_id = merchant_customer_id
  35. 2 self
  36. end
  37. 1 def set_include_checkout_status(include_checkout_status)
  38. 2 @include_checkout_status = include_checkout_status
  39. 2 self
  40. end
  41. 1 def set_include_payment_channel(include_payment_channel)
  42. 2 @include_payment_channel = include_payment_channel
  43. 2 self
  44. end
  45. 1 def to_query_map
  46. 9 query = {}
  47. 9 query['offset'] = @offset.to_s if @offset
  48. 9 query['size'] = @size.to_s if @size
  49. 9 query['fromDate'] = @from_date if @from_date
  50. 9 query['toDate'] = @to_date if @to_date
  51. 9 query['commerceCaseId'] = @commerce_case_id if @commerce_case_id
  52. 9 query['merchantReference'] = @merchant_reference if @merchant_reference
  53. 9 query['merchantCustomerId'] = @merchant_customer_id if @merchant_customer_id
  54. 9 query['includeCheckoutStatus'] = @include_checkout_status.join(',') if @include_checkout_status.any?
  55. 9 query['includePaymentChannel'] = @include_payment_channel.join(',') if @include_payment_channel.any?
  56. 9 query
  57. end
  58. end

lib/PCP-server-Ruby-SDK/request_header_generator.rb

100.0% lines covered

49 relevant lines. 49 lines covered and 0 lines missed.
    
  1. 1 require 'openssl'
  2. 1 require 'time'
  3. 1 require 'uri'
  4. 1 require 'base64'
  5. 1 require 'json'
  6. 1 require_relative 'communicator_configuration'
  7. 1 require_relative 'utils/server_meta_info'
  8. 1 class RequestHeaderGenerator
  9. 1 SERVER_META_INFO_HEADER_NAME = 'X-GCS-ServerMetaInfo'
  10. 1 CLIENT_META_INFO_HEADER_NAME = 'X-GCS-ClientMetaInfo'
  11. 1 AUTHORIZATION_HEADER_NAME = 'Authorization'
  12. 1 DATE_HEADER_NAME = 'Date'
  13. 1 CONTENT_TYPE_HEADER_NAME = 'Content-Type'
  14. 1 ALGORITHM = 'sha256'
  15. 1 WHITESPACE_REGEX = /\r?\n[h]*/.freeze
  16. 1 def initialize(config)
  17. 6 @config = config
  18. end
  19. 1 def generate_additional_request_headers(url, request)
  20. 5 headers = request[:headers] || {}
  21. 5 headers[DATE_HEADER_NAME] ||= Time.now.utc.httpdate
  22. 5 headers[SERVER_META_INFO_HEADER_NAME] ||= get_server_meta_info
  23. 5 headers[CLIENT_META_INFO_HEADER_NAME] ||= get_client_meta_info
  24. 5 headers[AUTHORIZATION_HEADER_NAME] ||= get_auth_header(url, request, headers)
  25. 5 request.merge(headers: headers)
  26. end
  27. 1 private
  28. 1 def get_auth_header(url, request, headers)
  29. # 1. method
  30. 5 string_to_sign = "#{request[:method].to_s.upcase}\n"
  31. # 2. Content-Type
  32. 5 string_to_sign += "#{headers[CONTENT_TYPE_HEADER_NAME]}" if headers[CONTENT_TYPE_HEADER_NAME]
  33. 5 string_to_sign += "\n"
  34. # 3. Date
  35. 5 string_to_sign += "#{headers[DATE_HEADER_NAME]}\n"
  36. # 4. Canonicalized Headers (starting with X-GCS, sorted by names)
  37. 5 if headers[CLIENT_META_INFO_HEADER_NAME]
  38. 5 string_to_sign += "#{CLIENT_META_INFO_HEADER_NAME.downcase}:#{headers[CLIENT_META_INFO_HEADER_NAME].gsub(WHITESPACE_REGEX, ' ').strip}\n"
  39. end
  40. 5 if headers[SERVER_META_INFO_HEADER_NAME]
  41. 5 string_to_sign += "#{SERVER_META_INFO_HEADER_NAME.downcase}:#{headers[SERVER_META_INFO_HEADER_NAME].gsub(WHITESPACE_REGEX, ' ').strip}\n"
  42. end
  43. # 5. Canonicalized Resource (has to include query parameters)
  44. 5 uri = URI.parse(url)
  45. 5 string_to_sign += uri.path
  46. 5 string_to_sign += uri.query ? "?#{uri.query}" : ''
  47. 5 string_to_sign += "\n"
  48. 5 signature = sign(string_to_sign)
  49. 5 "GCS v1HMAC:#{@config.api_key}:#{signature}"
  50. end
  51. 1 def sign(target)
  52. 5 hmac = OpenSSL::HMAC.digest(OpenSSL::Digest.new(ALGORITHM), @config.api_secret, target)
  53. 5 Base64.strict_encode64(hmac)
  54. end
  55. 1 def get_server_meta_info
  56. 3 meta = ServerMetaInfo.new
  57. 3 json_string = meta.to_json
  58. 3 Base64.strict_encode64(json_string)
  59. end
  60. 1 def get_client_meta_info
  61. 3 Base64.strict_encode64('"[]"')
  62. end
  63. end

lib/PCP-server-Ruby-SDK/utils/server_meta_info.rb

100.0% lines covered

11 relevant lines. 11 lines covered and 0 lines missed.
    
  1. 1 require 'rbconfig'
  2. 1 require 'json'
  3. 1 class ServerMetaInfo
  4. 1 attr_accessor :platform_identifier, :sdk_identifier, :sdk_creator, :integrator
  5. 1 def initialize(integrator = '')
  6. 12 @platform_identifier = "#{RbConfig::CONFIG['host_os']}, ruby version is: #{RUBY_VERSION}"
  7. 12 @sdk_identifier = 'RubyServerSDK/v1.0.0' # Adjust version as needed
  8. 12 @sdk_creator = 'PAYONE GmbH'
  9. 12 @integrator = integrator
  10. end
  11. 1 def to_json
  12. 8 JSON.pretty_generate({
  13. platform_identifier: @platform_identifier,
  14. sdk_identifier: @sdk_identifier,
  15. sdk_creator: @sdk_creator,
  16. integrator: @integrator
  17. })
  18. end
  19. end