defra_ruby_mocks 5.2.0 → 5.4.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 +4 -4
- data/README.md +35 -0
- data/app/controllers/defra_ruby_mocks/govpay_test_helpers_controller.rb +11 -10
- data/app/controllers/defra_ruby_mocks/os_places_controller.rb +10 -0
- data/app/jobs/base_send_webhook_job.rb +8 -7
- data/app/jobs/send_payment_webhook_job.rb +16 -3
- data/app/jobs/send_refund_webhook_job.rb +19 -3
- data/app/services/defra_ruby_mocks/aws_bucket_service.rb +2 -0
- data/app/services/defra_ruby_mocks/os_places_service.rb +86 -0
- data/config/routes.rb +7 -2
- data/lib/defra_ruby_mocks/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e24d648c7432078c7cc69a30923d8200fa3583702c60f573b28a02aeb46e3a73
|
|
4
|
+
data.tar.gz: 4748ab1db603a4a773ca7bd397895050606175b10c5f04ddf6f6b8aea4390cc4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5d5e22baf1ebcb28785f32a5578511ec0b5b7fd8888d7ec54a95970d7fef440f691f5ce2699b5590b601ea21b7f66d5c04556703ef5774c56f6ae96916ef637a
|
|
7
|
+
data.tar.gz: 9a4c263655f8903e6e452e1eeb996ae27c754d06dc852ae409b1cc962e3e88d25d41445f17dbe74c8200749cd1db2363c81c9fb66a2a3a29cf231d52b709e77a
|
data/README.md
CHANGED
|
@@ -132,6 +132,41 @@ The list of possible statuses was taken from
|
|
|
132
132
|
- [Companies House API](https://developer.companieshouse.gov.uk/api/docs/company/company_number/companyProfile-resource.html)
|
|
133
133
|
- [Companies House API enumerations](https://github.com/companieshouse/api-enumerations/blob/master/constants.yml)
|
|
134
134
|
|
|
135
|
+
### OS Places
|
|
136
|
+
|
|
137
|
+
When mounted into an app you can make requests to `/mocks/places/v1/postcode?postcode=[postcode]` to get a mock address lookup response in the OS Places API DPA format.
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
curl "http://localhost:3000/mocks/places/v1/postcode?postcode=BS1%205AH"
|
|
141
|
+
{
|
|
142
|
+
"results": [
|
|
143
|
+
{
|
|
144
|
+
"DPA": {
|
|
145
|
+
"UPRN": "340116",
|
|
146
|
+
"ADDRESS": "ENVIRONMENT AGENCY, HORIZON HOUSE, DEANERY ROAD, BRISTOL, BS1 5AH",
|
|
147
|
+
"ORGANISATION_NAME": "ENVIRONMENT AGENCY",
|
|
148
|
+
"BUILDING_NAME": "HORIZON HOUSE",
|
|
149
|
+
"THOROUGHFARE_NAME": "DEANERY ROAD",
|
|
150
|
+
"POST_TOWN": "BRISTOL",
|
|
151
|
+
"POSTCODE": "BS1 5AH",
|
|
152
|
+
"X_COORDINATE": 358205.0,
|
|
153
|
+
"Y_COORDINATE": 172708.0,
|
|
154
|
+
...
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
...
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### Postcodes
|
|
163
|
+
|
|
164
|
+
The mock normalizes postcodes by converting to uppercase and removing spaces. Currently the following postcodes return mock data:
|
|
165
|
+
|
|
166
|
+
- `BS1 5AH` - Returns two addresses (Environment Agency Horizon House, Bristol)
|
|
167
|
+
|
|
168
|
+
Any other postcode will return `{"results": []}`.
|
|
169
|
+
|
|
135
170
|
### Govpay
|
|
136
171
|
|
|
137
172
|
When mounted into an app you can simulate interacting with the Govpay hosted pages service. The following endpoints are supported:
|
|
@@ -25,16 +25,16 @@ module DefraRubyMocks
|
|
|
25
25
|
|
|
26
26
|
# This schedules a job to send a mock payment webhook.
|
|
27
27
|
def send_payment_webhook
|
|
28
|
-
Rails.logger.warn "[DefraRubyMocks] [send_payment_webhook]
|
|
29
|
-
|
|
28
|
+
Rails.logger.warn "[DefraRubyMocks] [send_payment_webhook] #{params.slice(:govpay_payment_id,
|
|
29
|
+
:govpay_payment_payment_status)}"
|
|
30
30
|
|
|
31
|
-
%w[
|
|
31
|
+
%w[govpay_payment_id govpay_payment_status callback_url signing_secret].each do |p|
|
|
32
32
|
raise StandardError, "Missing parameter: '#{p}'" unless params[p].present?
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
SendPaymentWebhookJob.perform_later(
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
govpay_payment_id: params[:govpay_payment_id],
|
|
37
|
+
govpay_payment_status: params[:govpay_payment_status],
|
|
38
38
|
callback_url: params[:callback_url],
|
|
39
39
|
signing_secret: params[:signing_secret]
|
|
40
40
|
)
|
|
@@ -44,16 +44,17 @@ module DefraRubyMocks
|
|
|
44
44
|
|
|
45
45
|
# This schedules a job to send a mock refund webhook.
|
|
46
46
|
def send_refund_webhook
|
|
47
|
-
Rails.logger.warn "[DefraRubyMocks] [send_refund webhook]
|
|
48
|
-
|
|
47
|
+
Rails.logger.warn "[DefraRubyMocks] [send_refund webhook] #{params.slice(:govpay_refund_id, :govpay_payment_id,
|
|
48
|
+
:govpay_refund_status)}"
|
|
49
49
|
|
|
50
|
-
%w[
|
|
50
|
+
%w[govpay_payment_id govpay_refund_id govpay_refund_status callback_url signing_secret].each do |p|
|
|
51
51
|
raise StandardError, "Missing parameter: '#{p}'" unless params[p].present?
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
SendRefundWebhookJob.perform_later(
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
govpay_payment_id: params[:govpay_payment_id],
|
|
56
|
+
govpay_refund_id: params[:govpay_refund_id],
|
|
57
|
+
govpay_refund_status: params[:govpay_refund_status],
|
|
57
58
|
callback_url: params[:callback_url],
|
|
58
59
|
signing_secret: params[:signing_secret]
|
|
59
60
|
)
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class BaseSendWebhookJob < ApplicationJob
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
attr_accessor :govpay_payment_id, :callback_url, :signing_secret
|
|
5
|
+
|
|
6
|
+
def post_callback
|
|
7
|
+
body = webhook_body
|
|
8
|
+
|
|
8
9
|
RestClient::Request.execute(
|
|
9
10
|
method: :post,
|
|
10
11
|
url: callback_url,
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
headers: { "Pay-Signature": webhook_signature(body, signing_secret) },
|
|
13
|
+
payload: body.to_json
|
|
13
14
|
)
|
|
14
15
|
rescue StandardError => e
|
|
15
16
|
Rails.logger.error "[DefraRubyMocks] [BaseSendWebhookJob] error sending " \
|
|
@@ -22,7 +23,7 @@ class BaseSendWebhookJob < ApplicationJob
|
|
|
22
23
|
raise NotImplementedError
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
def webhook_body
|
|
26
|
+
def webhook_body
|
|
26
27
|
raise NotImplementedError
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class SendPaymentWebhookJob < BaseSendWebhookJob
|
|
4
|
+
attr_accessor :govpay_payment_status
|
|
5
|
+
|
|
6
|
+
def perform(govpay_payment_id:, govpay_payment_status:, callback_url:, signing_secret:)
|
|
7
|
+
@govpay_payment_id = govpay_payment_id
|
|
8
|
+
@govpay_payment_status = govpay_payment_status
|
|
9
|
+
@callback_url = callback_url
|
|
10
|
+
@signing_secret = signing_secret
|
|
11
|
+
|
|
12
|
+
Rails.logger.warn "[DefraRubyMocks] [SendPaymentWebhookJob] sending #{webhook_type} webhook " \
|
|
13
|
+
"for #{govpay_payment_id}, status \"#{govpay_payment_status}\" to #{callback_url}"
|
|
14
|
+
|
|
15
|
+
post_callback
|
|
16
|
+
end
|
|
4
17
|
|
|
5
18
|
private
|
|
6
19
|
|
|
@@ -8,11 +21,11 @@ class SendPaymentWebhookJob < BaseSendWebhookJob
|
|
|
8
21
|
"payment"
|
|
9
22
|
end
|
|
10
23
|
|
|
11
|
-
def webhook_body
|
|
24
|
+
def webhook_body
|
|
12
25
|
webhook_body ||= JSON.parse(File.read("lib/fixtures/files/govpay/webhook_payment_update_body.json"))
|
|
13
26
|
|
|
14
|
-
webhook_body["resource"]["payment_id"] =
|
|
15
|
-
webhook_body["resource"]["state"]["status"] =
|
|
27
|
+
webhook_body["resource"]["payment_id"] = govpay_payment_id
|
|
28
|
+
webhook_body["resource"]["state"]["status"] = govpay_payment_status
|
|
16
29
|
|
|
17
30
|
webhook_body
|
|
18
31
|
end
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class SendRefundWebhookJob < BaseSendWebhookJob
|
|
4
|
+
attr_accessor :govpay_refund_id, :govpay_refund_status
|
|
5
|
+
|
|
6
|
+
def perform(govpay_payment_id:, govpay_refund_id:, govpay_refund_status:, callback_url:, signing_secret:)
|
|
7
|
+
@govpay_payment_id = govpay_payment_id
|
|
8
|
+
@govpay_refund_status = govpay_refund_status
|
|
9
|
+
@govpay_refund_id = govpay_refund_id
|
|
10
|
+
@callback_url = callback_url
|
|
11
|
+
@signing_secret = signing_secret
|
|
12
|
+
|
|
13
|
+
Rails.logger.warn "[DefraRubyMocks] [SendRefundWebhookJob] sending #{webhook_type} webhook " \
|
|
14
|
+
"for payment #{govpay_payment_id}, refund #{govpay_refund_id}, status " \
|
|
15
|
+
"\"#{govpay_refund_status}\" to #{callback_url}"
|
|
16
|
+
|
|
17
|
+
post_callback
|
|
18
|
+
end
|
|
4
19
|
|
|
5
20
|
private
|
|
6
21
|
|
|
@@ -8,11 +23,12 @@ class SendRefundWebhookJob < BaseSendWebhookJob
|
|
|
8
23
|
"refund"
|
|
9
24
|
end
|
|
10
25
|
|
|
11
|
-
def webhook_body
|
|
26
|
+
def webhook_body
|
|
12
27
|
webhook_body ||= JSON.parse(File.read("lib/fixtures/files/govpay/webhook_refund_update_body.json"))
|
|
13
28
|
|
|
14
|
-
webhook_body["refund_id"] =
|
|
15
|
-
webhook_body["
|
|
29
|
+
webhook_body["refund_id"] = govpay_refund_id
|
|
30
|
+
webhook_body["payment_id"] = govpay_payment_id
|
|
31
|
+
webhook_body["status"] = govpay_refund_status
|
|
16
32
|
|
|
17
33
|
webhook_body
|
|
18
34
|
end
|
|
@@ -21,6 +21,7 @@ module DefraRubyMocks
|
|
|
21
21
|
new.remove(bucket_name, file_name)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
# rubocop:disable Naming/PredicateMethod
|
|
24
25
|
def write(bucket_name, file_name, content)
|
|
25
26
|
@bucket_name = bucket_name
|
|
26
27
|
@file_name = file_name
|
|
@@ -32,6 +33,7 @@ module DefraRubyMocks
|
|
|
32
33
|
|
|
33
34
|
true
|
|
34
35
|
end
|
|
36
|
+
# rubocop:enable Naming/PredicateMethod
|
|
35
37
|
|
|
36
38
|
def read(bucket_name, file_name)
|
|
37
39
|
@bucket_name = bucket_name
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DefraRubyMocks
|
|
4
|
+
class OsPlacesService < BaseService
|
|
5
|
+
# Mock addresses in OS Places API DPA format, keyed by normalized postcode
|
|
6
|
+
MOCK_ADDRESSES = {
|
|
7
|
+
"BS15AH" => [
|
|
8
|
+
{
|
|
9
|
+
"DPA" => {
|
|
10
|
+
"UPRN" => "340116",
|
|
11
|
+
"ADDRESS" => "ENVIRONMENT AGENCY, HORIZON HOUSE, DEANERY ROAD, BRISTOL, BS1 5AH",
|
|
12
|
+
"ORGANISATION_NAME" => "ENVIRONMENT AGENCY",
|
|
13
|
+
"BUILDING_NAME" => "HORIZON HOUSE",
|
|
14
|
+
"THOROUGHFARE_NAME" => "DEANERY ROAD",
|
|
15
|
+
"POST_TOWN" => "BRISTOL",
|
|
16
|
+
"POSTCODE" => "BS1 5AH",
|
|
17
|
+
"X_COORDINATE" => 358_205.0,
|
|
18
|
+
"Y_COORDINATE" => 172_708.0,
|
|
19
|
+
"DEPENDENT_LOCALITY" => "",
|
|
20
|
+
"MATCH" => 1.0,
|
|
21
|
+
"MATCH_DESCRIPTION" => "EXACT",
|
|
22
|
+
"LANGUAGE" => "EN",
|
|
23
|
+
"LAST_UPDATE_DATE" => "2024-01-01",
|
|
24
|
+
"ENTRY_DATE" => "2020-01-01",
|
|
25
|
+
"BLPU_STATE_CODE" => "2",
|
|
26
|
+
"BLPU_STATE_CODE_DESCRIPTION" => "In use",
|
|
27
|
+
"CLASSIFICATION_CODE" => "CO01",
|
|
28
|
+
"CLASSIFICATION_CODE_DESCRIPTION" => "Office / Work Studio",
|
|
29
|
+
"POSTAL_ADDRESS_CODE" => "D",
|
|
30
|
+
"POSTAL_ADDRESS_CODE_DESCRIPTION" => "A record which is linked to PAF",
|
|
31
|
+
"LOGICAL_STATUS_CODE" => "1",
|
|
32
|
+
"STATUS" => "APPROVED",
|
|
33
|
+
"TOPOGRAPHY_LAYER_TOID" => "",
|
|
34
|
+
"PARENT_UPRN" => "",
|
|
35
|
+
"USRN" => ""
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"DPA" => {
|
|
40
|
+
"UPRN" => "340117",
|
|
41
|
+
"ADDRESS" => "THRIVE RENEWABLES PLC, DEANERY ROAD, BRISTOL, BS1 5AH",
|
|
42
|
+
"ORGANISATION_NAME" => "THRIVE RENEWABLES PLC",
|
|
43
|
+
"BUILDING_NAME" => "",
|
|
44
|
+
"THOROUGHFARE_NAME" => "DEANERY ROAD",
|
|
45
|
+
"POST_TOWN" => "BRISTOL",
|
|
46
|
+
"POSTCODE" => "BS1 5AH",
|
|
47
|
+
"X_COORDINATE" => 358_130.0,
|
|
48
|
+
"Y_COORDINATE" => 172_687.0,
|
|
49
|
+
"DEPENDENT_LOCALITY" => "",
|
|
50
|
+
"MATCH" => 1.0,
|
|
51
|
+
"MATCH_DESCRIPTION" => "EXACT",
|
|
52
|
+
"LANGUAGE" => "EN",
|
|
53
|
+
"LAST_UPDATE_DATE" => "2024-01-01",
|
|
54
|
+
"ENTRY_DATE" => "2020-01-01",
|
|
55
|
+
"BLPU_STATE_CODE" => "2",
|
|
56
|
+
"BLPU_STATE_CODE_DESCRIPTION" => "In use",
|
|
57
|
+
"CLASSIFICATION_CODE" => "CO01",
|
|
58
|
+
"CLASSIFICATION_CODE_DESCRIPTION" => "Office / Work Studio",
|
|
59
|
+
"POSTAL_ADDRESS_CODE" => "D",
|
|
60
|
+
"POSTAL_ADDRESS_CODE_DESCRIPTION" => "A record which is linked to PAF",
|
|
61
|
+
"LOGICAL_STATUS_CODE" => "1",
|
|
62
|
+
"STATUS" => "APPROVED",
|
|
63
|
+
"TOPOGRAPHY_LAYER_TOID" => "",
|
|
64
|
+
"PARENT_UPRN" => "",
|
|
65
|
+
"USRN" => ""
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}.freeze
|
|
70
|
+
|
|
71
|
+
def run(postcode)
|
|
72
|
+
@postcode = normalize_postcode(postcode)
|
|
73
|
+
self
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def results
|
|
77
|
+
MOCK_ADDRESSES.fetch(@postcode, [])
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def normalize_postcode(postcode)
|
|
83
|
+
postcode.to_s.upcase.gsub(/\s+/, "")
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
data/config/routes.rb
CHANGED
|
@@ -11,6 +11,11 @@ DefraRubyMocks::Engine.routes.draw do # rubocop:disable Metrics/BlockLength
|
|
|
11
11
|
as: "company_officers",
|
|
12
12
|
constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
|
|
13
13
|
|
|
14
|
+
get "/places/v1/postcode",
|
|
15
|
+
to: "os_places#postcode",
|
|
16
|
+
as: "os_places_addresses",
|
|
17
|
+
constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
|
|
18
|
+
|
|
14
19
|
post "/govpay/v1/payments",
|
|
15
20
|
to: "govpay#create_payment",
|
|
16
21
|
as: "govpay_create_payment",
|
|
@@ -47,12 +52,12 @@ DefraRubyMocks::Engine.routes.draw do # rubocop:disable Metrics/BlockLength
|
|
|
47
52
|
as: "govpay_set_test_refund_response_status",
|
|
48
53
|
constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
|
|
49
54
|
|
|
50
|
-
post "/govpay/v1/payments
|
|
55
|
+
post "/govpay/v1/payments/send_payment_webhook",
|
|
51
56
|
to: "govpay_test_helpers#send_payment_webhook",
|
|
52
57
|
as: "send_payment_webhook",
|
|
53
58
|
constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
|
|
54
59
|
|
|
55
|
-
post "/govpay/v1/payments
|
|
60
|
+
post "/govpay/v1/payments/send_refund_webhook",
|
|
56
61
|
to: "govpay_test_helpers#send_refund_webhook",
|
|
57
62
|
as: "send_refund_webhook",
|
|
58
63
|
constraints: ->(_request) { DefraRubyMocks.configuration.enabled? }
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: defra_ruby_mocks
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
4
|
+
version: 5.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Defra
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-03-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -58,14 +58,14 @@ dependencies:
|
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0.
|
|
61
|
+
version: '0.6'
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0.
|
|
68
|
+
version: '0.6'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: rest-client
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -96,6 +96,7 @@ files:
|
|
|
96
96
|
- app/controllers/defra_ruby_mocks/company_controller.rb
|
|
97
97
|
- app/controllers/defra_ruby_mocks/govpay_controller.rb
|
|
98
98
|
- app/controllers/defra_ruby_mocks/govpay_test_helpers_controller.rb
|
|
99
|
+
- app/controllers/defra_ruby_mocks/os_places_controller.rb
|
|
99
100
|
- app/jobs/application_job.rb
|
|
100
101
|
- app/jobs/base_send_webhook_job.rb
|
|
101
102
|
- app/jobs/send_payment_webhook_job.rb
|
|
@@ -107,6 +108,7 @@ files:
|
|
|
107
108
|
- app/services/defra_ruby_mocks/govpay_get_payment_service.rb
|
|
108
109
|
- app/services/defra_ruby_mocks/govpay_refund_details_service.rb
|
|
109
110
|
- app/services/defra_ruby_mocks/govpay_request_refund_service.rb
|
|
111
|
+
- app/services/defra_ruby_mocks/os_places_service.rb
|
|
110
112
|
- app/views/defra_ruby_mocks/company/not_found.json.erb
|
|
111
113
|
- app/views/defra_ruby_mocks/company/officers.json.erb
|
|
112
114
|
- app/views/defra_ruby_mocks/company/show.json.erb
|