defra_ruby_mocks 2.3.0 → 2.3.3

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/defra_ruby_mocks/govpay_controller.rb +40 -0
  3. data/app/jobs/defra_ruby_mocks/application_job.rb +6 -0
  4. data/app/jobs/defra_ruby_mocks/govpay_payment_callback_job.rb +17 -0
  5. data/app/services/defra_ruby_mocks/govpay_create_payment_service.rb +62 -0
  6. data/app/services/defra_ruby_mocks/govpay_get_payment_service.rb +90 -0
  7. data/app/services/defra_ruby_mocks/worldpay_resource_service.rb +2 -2
  8. data/app/services/defra_ruby_mocks/worldpay_response_service.rb +2 -0
  9. data/config/routes.rb +9 -0
  10. data/lib/defra_ruby_mocks/configuration.rb +1 -1
  11. data/lib/defra_ruby_mocks/version.rb +1 -1
  12. data/spec/dummy/log/test.log +2377 -2251
  13. data/spec/examples.txt +127 -111
  14. data/spec/fixtures/files/govpay/create_payment_created_response.json +24 -0
  15. data/spec/fixtures/files/govpay/create_payment_error_response.json +5 -0
  16. data/spec/fixtures/files/govpay/get_payment_response_cancelled.json +61 -0
  17. data/spec/fixtures/files/govpay/get_payment_response_created.json +73 -0
  18. data/spec/fixtures/files/govpay/get_payment_response_error.json +5 -0
  19. data/spec/fixtures/files/govpay/get_payment_response_failure.json +9 -0
  20. data/spec/fixtures/files/govpay/get_payment_response_not_found.json +4 -0
  21. data/spec/fixtures/files/govpay/get_payment_response_submitted.json +75 -0
  22. data/spec/fixtures/files/govpay/get_payment_response_success.json +62 -0
  23. data/spec/fixtures/{payment_request_invalid.xml → files/worldpay/payment_request_invalid.xml} +0 -0
  24. data/spec/fixtures/{payment_request_valid.xml → files/worldpay/payment_request_valid.xml} +0 -0
  25. data/spec/fixtures/{refund_request_invalid.xml → files/worldpay/refund_request_invalid.xml} +0 -0
  26. data/spec/fixtures/{refund_request_valid.xml → files/worldpay/refund_request_valid.xml} +0 -0
  27. data/spec/fixtures/{unrecognised_request.xml → files/worldpay/unrecognised_request.xml} +0 -0
  28. data/spec/requests/govpay_spec.rb +127 -0
  29. data/spec/requests/worldpay_spec.rb +3 -3
  30. data/spec/services/govpay_create_payment_service_spec.rb +44 -0
  31. data/spec/services/govpay_get_payment_service_spec.rb +30 -0
  32. data/spec/services/worldpay_payment_service_spec.rb +2 -2
  33. data/spec/services/worldpay_refund_service_spec.rb +2 -2
  34. data/spec/services/worldpay_request_handler_service_spec.rb +3 -3
  35. data/spec/services/worldpay_resource_service_spec.rb +8 -0
  36. data/spec/services/worldpay_response_service_spec.rb +9 -1
  37. metadata +44 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8db113c494c3e74f9f41a01055afcab1a917708e5ba35997d7f9dcd6829f342
4
- data.tar.gz: 6790a0a43812ae7eda27aa51096a846b1b0bda32ca2229a8c55c1bed9e3277cd
3
+ metadata.gz: 9215253284f8928c0b731ac83de618da7e328ee04a75453290956132bb72d65d
4
+ data.tar.gz: 56087ad7a0263a7d6cb70d2a6d02df385c33262735a544921fbd0f25a7a607f8
5
5
  SHA512:
6
- metadata.gz: 50a22b6011b95c82f65a20033d90e0b7622381e64aa9175a328a26e27b519203a2f5a72e7e2effa247514b130a675a5390144e7d68bee270315d6c74b62dc525
7
- data.tar.gz: 3df174fcab0e99ede6b049ba26aecfb36530a476dfb2a1c5e9f7ac688cc662fca18478fa23c5d30f58fbdf1ca8d404d2f8b586078d1ba38ea0090ae88735df52
6
+ metadata.gz: c2fa8dee0d93abf131a79cad79b6a94c58fa6e9541051c9d39fbba645b294b35ce7246a4ebc69a4854765ac002b6e77acb98fa6cad785b0a82bb4ad4b0c4f7f4
7
+ data.tar.gz: c01f83850554a60d11341677892d92e9c13613481aa48d5967ed3fdbdd6de5f45620ceb7623294d58656e23b3a4e4decfc9ffa1431ae656757db5bc559c9197e
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DefraRubyMocks
4
+ class GovpayController < ::DefraRubyMocks::ApplicationController
5
+
6
+ skip_before_action :verify_authenticity_token
7
+
8
+ def create_payment
9
+ valid_create_params
10
+
11
+ # Enqueue the payment callback to run after the controller responds
12
+ DefraRubyMocks::GovpayPaymentCallbackJob.perform_later(params[:return_url])
13
+
14
+ render json: GovpayCreatePaymentService.new.run(
15
+ amount: params[:amount], description: params[:description], return_url: params[:return_url]
16
+ )
17
+ rescue StandardError => e
18
+ Rails.logger.error("MOCKS: Govpay payment creation error: #{e.message}")
19
+ head 500
20
+ end
21
+
22
+ def payment_details
23
+ valid_payment_id
24
+ render json: GovpayGetPaymentService.new.run(payment_id: params[:payment_id])
25
+ rescue StandardError => e
26
+ Rails.logger.error("MOCKS: Govpay payment details error: #{e.message}")
27
+ head 422
28
+ end
29
+
30
+ def valid_create_params
31
+ params.require(%i[amount description return_url])
32
+ end
33
+
34
+ def valid_payment_id
35
+ return true if params[:payment_id].length > 20 && params[:payment_id].match(/\A[a-zA-Z0-9]*\z/)
36
+
37
+ raise ArgumentError, "Invalid Govpay payment ID #{params[:payment_id]}"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DefraRubyMocks
4
+ class ApplicationJob < ActiveJob::Base
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DefraRubyMocks
4
+ class GovpayPaymentCallbackJob < DefraRubyMocks::ApplicationJob
5
+ queue_as :default
6
+
7
+ def perform(*response_url)
8
+ Rails.logger.debug "GovpayPaymentCallbackJob calling response URL #{response_url}"
9
+ RestClient::Request.execute(method: :GET, url: response_url)
10
+ rescue RestClient::ExceptionWithResponse => e
11
+ Rails.logger.debug "GovpayPaymentCallbackJob: RestClient received response: #{e}"
12
+ rescue StandardError => e
13
+ Rails.logger.error("GovpayPaymentCallbackJob: Error sending request to govpay: #{e}")
14
+ Airbrake.notify(e, message: "Error on govpay request")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module DefraRubyMocks
6
+ class GovpayCreatePaymentService < BaseService
7
+
8
+ def run(amount:, description:, return_url:)
9
+ success_response.merge(
10
+ {
11
+ _links: {
12
+ self: { href: "#{base_url}/#{payment_id}", method: "GET" },
13
+ next_url: { href: return_url, method: "GET" }
14
+ },
15
+ amount: amount.to_i,
16
+ description: description,
17
+ payment_id: payment_id
18
+ }
19
+ )
20
+ end
21
+
22
+ private
23
+
24
+ def base_url
25
+ File.join(DefraRubyMocks.configuration.govpay_domain, "/payments")
26
+ end
27
+
28
+ def payment_id
29
+ @payment_id ||= SecureRandom.alphanumeric(26)
30
+ end
31
+
32
+ # rubocop:disable Metrics/MethodLength
33
+ def success_response
34
+ {
35
+ "created_date": "2020-03-03T16:17:19.554Z",
36
+ "state": {
37
+ "status": "created",
38
+ "finished": false
39
+ },
40
+ "_links": {
41
+ "self": {
42
+ "href": "https://publicapi.payments.service.gov.uk/v1/payments/hu20sqlact5260q2nanm0q8u93",
43
+ "method": "GET"
44
+ },
45
+ "next_url": {
46
+ "href": "https://www.payments.service.gov.uk/secure/bb0a272c-8eaf-468d-b3xf-ae5e000d2231",
47
+ "method": "GET"
48
+ }
49
+ },
50
+ "amount": 14_500,
51
+ "reference": "12345",
52
+ "description": "Pay your council tax",
53
+ "return_url": "https://your.service.gov.uk/completed",
54
+ "payment_id": "hu20sqlact5260q2nanm0q8u93",
55
+ "payment_provider": "worldpay",
56
+ "provider_id": "10987654321"
57
+ }
58
+ end
59
+ # rubocop:enable Metrics/MethodLength
60
+
61
+ end
62
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module DefraRubyMocks
6
+ class GovpayGetPaymentService < BaseService
7
+
8
+ def run(payment_id:, amount: Random.rand(100..1_000), created_at: Time.current)
9
+ # This currently supports only success results:
10
+ response_success.merge(
11
+ {
12
+ created_date: created_at,
13
+ amount: amount,
14
+ payment_id: payment_id,
15
+ total_amount: amount
16
+ }
17
+ )
18
+ end
19
+
20
+ private
21
+
22
+ # rubocop:disable Metrics/MethodLength
23
+ def response_success
24
+ {
25
+ "amount": 10_501,
26
+ "description": "Waste carrier registration upper tier",
27
+ "reference": "12345",
28
+ "language": "en",
29
+ "metadata": {
30
+ "ledger_code": "AB100",
31
+ "an_internal_reference_number": 200
32
+ },
33
+ "email": "sherlock.holmes@example.com",
34
+ "state": {
35
+ "status": "success",
36
+ "finished": true
37
+ },
38
+ "payment_id": "cnnffa1e6s3u9a6n24u2cp527d",
39
+ "payment_provider": "sandbox",
40
+ "created_date": "2022-05-18T11:52:13.669Z",
41
+ "refund_summary": {
42
+ "status": "available",
43
+ "amount_available": 10_501,
44
+ "amount_submitted": 0
45
+ },
46
+ "settlement_summary": {
47
+ "capture_submit_time": "2022-05-18T11:52:39.172Z",
48
+ "captured_date": "2022-05-18"
49
+ },
50
+ "card_details": {
51
+ "last_digits_card_number": "5100",
52
+ "first_digits_card_number": "510510",
53
+ "cardholder_name": "Sherlock Holmes",
54
+ "expiry_date": "01/24",
55
+ "billing_address": {
56
+ "line1": "221 Baker Street",
57
+ "line2": "Flat b",
58
+ "postcode": "NW1 6XE",
59
+ "city": "London",
60
+ "country": "GB"
61
+ },
62
+ "card_brand": "Mastercard",
63
+ "card_type": "debit"
64
+ },
65
+ "delayed_capture": false,
66
+ "moto": false,
67
+ "provider_id": "9bb0c2c1-d0c5-4a63-8945-f4240e06f8ae",
68
+ "return_url": "https://some-wcr-env.defra.gov.uk/completed",
69
+ "authorisation_mode": "web",
70
+ "card_brand": "Mastercard",
71
+ "_links": {
72
+ "self": {
73
+ "href": "https://publicapi.payments.service.gov.uk/v1/payments/cnnffa1e6s3u9a6n24u2cp527d",
74
+ "method": "GET"
75
+ },
76
+ "events": {
77
+ "href": "https://publicapi.payments.service.gov.uk/v1/payments/cnnffa1e6s3u9a6n24u2cp527d/events",
78
+ "method": "GET"
79
+ },
80
+ "refunds": {
81
+ "href": "https://publicapi.payments.service.gov.uk/v1/payments/cnnffa1e6s3u9a6n24u2cp527d/refunds",
82
+ "method": "GET"
83
+ }
84
+ }
85
+ }
86
+ end
87
+ # rubocop:enable Metrics/MethodLength
88
+
89
+ end
90
+ end
@@ -46,9 +46,9 @@ module DefraRubyMocks
46
46
 
47
47
  def company_name
48
48
  if resource.class.to_s == "WasteCarriersEngine::OrderCopyCardsRegistration"
49
- locate_original_registration(resource.reg_identifier).company_name.downcase
49
+ locate_original_registration(resource.reg_identifier).company_name&.downcase
50
50
  else
51
- resource.company_name.downcase
51
+ resource.company_name&.downcase
52
52
  end
53
53
  end
54
54
  end
@@ -65,6 +65,8 @@ module DefraRubyMocks
65
65
  end
66
66
 
67
67
  def payment_status
68
+ return :AUTHORISED unless @resource.company_name
69
+
68
70
  return :REFUSED if @resource.company_name.include?("reject")
69
71
  return :STUCK if @resource.company_name.include?("stuck")
70
72
  return :SENT_FOR_AUTHORISATION if @resource.company_name.include?("pending")
data/config/routes.rb CHANGED
@@ -21,4 +21,13 @@ DefraRubyMocks::Engine.routes.draw do
21
21
  as: "worldpay_dispatcher",
22
22
  constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
23
23
 
24
+ post "/govpay/v1/payments",
25
+ to: "govpay#create_payment",
26
+ as: "govpay_create_payment",
27
+ constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
28
+
29
+ get "/govpay/v1/payments/:payment_id",
30
+ to: "govpay#payment_details",
31
+ as: "govpay_payment_details",
32
+ constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
24
33
  end
@@ -5,7 +5,7 @@ module DefraRubyMocks
5
5
 
6
6
  DEFAULT_DELAY = 1000
7
7
 
8
- attr_accessor :worldpay_admin_code, :worldpay_mac_secret, :worldpay_merchant_code, :worldpay_domain
8
+ attr_accessor :worldpay_admin_code, :worldpay_mac_secret, :worldpay_merchant_code, :worldpay_domain, :govpay_domain
9
9
  attr_reader :delay
10
10
 
11
11
  def initialize
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DefraRubyMocks
4
- VERSION = "2.3.0"
4
+ VERSION = "2.3.3"
5
5
  end