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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2050966a0416ac33fdb18d7b5e99dddb3548ef4d704792441a7a77a6c664b58e
4
- data.tar.gz: 555e7313d1587a5f83108a5f3ed42de143cb5b0695ab4e11582e883e0fe0e0a3
3
+ metadata.gz: e24d648c7432078c7cc69a30923d8200fa3583702c60f573b28a02aeb46e3a73
4
+ data.tar.gz: 4748ab1db603a4a773ca7bd397895050606175b10c5f04ddf6f6b8aea4390cc4
5
5
  SHA512:
6
- metadata.gz: 6a423e4730a149e0999d21e47b601b0fa83a011b3048c7eb03eebd2534f01752143b3c0f3c273dc6df37191287e6345cb32b1075c7fe745aab415034f6c8b43e
7
- data.tar.gz: 1cb2bc2402d47184315227ba57d31687c1163c0eeacde31b2addd75cdf0e0d41bdbe3710f5c4853a9abbd2d4489a28ccee48f8aeaf4dcaf2beae464b8b4e1696
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
- "params: #{params[:govpay_id]}, status #{params[:payment_status]}"
28
+ Rails.logger.warn "[DefraRubyMocks] [send_payment_webhook] #{params.slice(:govpay_payment_id,
29
+ :govpay_payment_payment_status)}"
30
30
 
31
- %w[govpay_id payment_status callback_url signing_secret].each do |p|
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
- govpay_id: params[:govpay_id],
37
- status: params[:payment_status],
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
- "params: #{params[:govpay_id]}, status #{params[:refund_status]}"
47
+ Rails.logger.warn "[DefraRubyMocks] [send_refund webhook] #{params.slice(:govpay_refund_id, :govpay_payment_id,
48
+ :govpay_refund_status)}"
49
49
 
50
- %w[govpay_id refund_status callback_url signing_secret].each do |p|
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
- govpay_id: params[:govpay_id],
56
- status: params[:refund_status],
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
  )
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DefraRubyMocks
4
+ class OsPlacesController < ::DefraRubyMocks::ApplicationController
5
+ def postcode
6
+ results = OsPlacesService.run(params[:postcode]).results
7
+ render json: { "results" => results }
8
+ end
9
+ end
10
+ end
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class BaseSendWebhookJob < ApplicationJob
4
- def perform(govpay_id:, status:, callback_url:, signing_secret:)
5
- body = webhook_body(govpay_id:, status:)
6
- Rails.logger.warn "[DefraRubyMocks] [BaseSendWebhookJob] sending #{webhook_type} webhook " \
7
- "for #{govpay_id}, status \"#{status}\" to #{callback_url}"
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
- payload: body.to_json,
12
- headers: { "Pay-Signature": webhook_signature(body, signing_secret) }
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(govpay_id:, status:)
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(govpay_id:, status:)
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"] = govpay_id
15
- webhook_body["resource"]["state"]["status"] = 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(govpay_id:, status:)
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"] = govpay_id
15
- webhook_body["status"] = status
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/:govpay_id/send_payment_webhook",
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/:govpay_id/send_refund_webhook",
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? }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DefraRubyMocks
4
- VERSION = "5.2.0"
4
+ VERSION = "5.4.0"
5
5
  end
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.2.0
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: 2025-06-11 00:00:00.000000000 Z
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.5'
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.5'
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