defra_ruby_mocks 2.3.2 → 2.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -75
  3. data/app/controllers/defra_ruby_mocks/govpay_controller.rb +28 -3
  4. data/app/jobs/defra_ruby_mocks/application_job.rb +6 -0
  5. data/app/jobs/defra_ruby_mocks/govpay_payment_callback_job.rb +17 -0
  6. data/app/services/defra_ruby_mocks/govpay_create_payment_service.rb +41 -13
  7. data/app/services/defra_ruby_mocks/govpay_get_payment_service.rb +74 -16
  8. data/app/services/defra_ruby_mocks/govpay_refund_details_service.rb +43 -0
  9. data/app/services/defra_ruby_mocks/govpay_request_refund_service.rb +27 -0
  10. data/config/routes.rb +10 -10
  11. data/lib/defra_ruby_mocks/configuration.rb +1 -1
  12. data/lib/defra_ruby_mocks/engine.rb +0 -1
  13. data/lib/defra_ruby_mocks/version.rb +1 -1
  14. data/spec/dummy/log/test.log +1279 -972
  15. data/spec/examples.txt +68 -121
  16. data/spec/fixtures/files/govpay/create_payment_created_response.json +24 -0
  17. data/spec/fixtures/files/govpay/create_payment_error_response.json +5 -0
  18. data/spec/fixtures/files/govpay/get_payment_response_cancelled.json +61 -0
  19. data/spec/fixtures/files/govpay/get_payment_response_created.json +73 -0
  20. data/spec/fixtures/files/govpay/get_payment_response_error.json +5 -0
  21. data/spec/fixtures/files/govpay/get_payment_response_failure.json +9 -0
  22. data/spec/fixtures/files/govpay/get_payment_response_not_found.json +4 -0
  23. data/spec/fixtures/files/govpay/get_payment_response_submitted.json +75 -0
  24. data/spec/fixtures/files/govpay/get_payment_response_success.json +62 -0
  25. data/spec/requests/govpay_spec.rb +64 -1
  26. data/spec/services/govpay_create_payment_service_spec.rb +44 -0
  27. data/spec/services/govpay_get_payment_service_spec.rb +30 -0
  28. data/spec/services/govpay_refund_details_service_spec.rb +58 -0
  29. data/spec/services/govpay_request_refund_service_spec.rb +31 -0
  30. metadata +32 -48
  31. data/app/controllers/defra_ruby_mocks/worldpay_controller.rb +0 -57
  32. data/app/services/defra_ruby_mocks/worldpay_payment_service.rb +0 -47
  33. data/app/services/defra_ruby_mocks/worldpay_refund_service.rb +0 -37
  34. data/app/services/defra_ruby_mocks/worldpay_request_handler_service.rb +0 -40
  35. data/app/services/defra_ruby_mocks/worldpay_resource_service.rb +0 -55
  36. data/app/services/defra_ruby_mocks/worldpay_response_service.rb +0 -119
  37. data/app/views/defra_ruby_mocks/worldpay/payment_request.xml.erb +0 -4
  38. data/app/views/defra_ruby_mocks/worldpay/refund_request.xml.erb +0 -4
  39. data/app/views/defra_ruby_mocks/worldpay/stuck.html.erb +0 -37
  40. data/lib/defra_ruby_mocks/unrecognised_worldpay_request_error.rb +0 -5
  41. data/spec/fixtures/payment_request_invalid.xml +0 -6
  42. data/spec/fixtures/payment_request_valid.xml +0 -30
  43. data/spec/fixtures/refund_request_invalid.xml +0 -6
  44. data/spec/fixtures/refund_request_valid.xml +0 -11
  45. data/spec/fixtures/unrecognised_request.xml +0 -6
  46. data/spec/requests/worldpay_spec.rb +0 -163
  47. data/spec/services/worldpay_payment_service_spec.rb +0 -95
  48. data/spec/services/worldpay_refund_service_spec.rb +0 -68
  49. data/spec/services/worldpay_request_handler_service_spec.rb +0 -79
  50. data/spec/services/worldpay_resource_service_spec.rb +0 -120
  51. data/spec/services/worldpay_response_service_spec.rb +0 -280
@@ -1,37 +0,0 @@
1
- <!doctype html>
2
-
3
- <html lang="en">
4
- <head>
5
- <meta charset="utf-8">
6
-
7
- <title>You is stuck</title>
8
- <meta name="description" content="Thw Worldpay stuck page">
9
- <meta name="author" content="Defra">
10
- </head>
11
-
12
- <body>
13
- <main>
14
- <div id="message">
15
- <h1>Stuck!</h1>
16
- <p>Looks like your registration has gotten stuck whilst paying for it using Worldpay.</p>
17
- <p>We hope that's what you expected to happen.</p>
18
- <p>Regards, the Ruby Services Team</p>
19
- </div>
20
- <% if @response %>
21
- <div id="debug">
22
- <h2>Debug</h2>
23
- <ul>
24
- <li><strong>Supplied URL</strong> <code><%= @response.supplied_url %></code></li>
25
- <li><strong>Separator</strong> <code><%= @response.separator %></code></li>
26
- <li><strong>Order key</strong> <code><%= @response.order_key %></code></li>
27
- <li><strong>Mac</strong> <code><%= @response.mac %></code></li>
28
- <li><strong>Value</strong> <code><%= @response.value %></code></li>
29
- <li><strong>Status</strong> <code><%= @response.status %></code></li>
30
- <li><strong>Reference</strong> <code><%= @response.reference %></code></li>
31
- <li><strong>Url</strong> <code><%= @response.url %></code></li>
32
- </ul>
33
- </div>
34
- <% end %>
35
- </main>
36
- </body>
37
- </html>
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DefraRubyMocks
4
- class UnrecognisedWorldpayRequestError < StandardError; end
5
- end
@@ -1,6 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!DOCTYPE paymentService PUBLIC "-//WorldPay/DTD WorldPay PaymentService v1/EN" "http://dtd.worldpay.com/paymentService_v1.dtd">
3
- <paymentService version="1.4">
4
- <submit>
5
- </submit>
6
- </paymentService>
@@ -1,30 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!DOCTYPE paymentService PUBLIC "-//WorldPay/DTD WorldPay PaymentService v1/EN" "http://dtd.worldpay.com/paymentService_v1.dtd">
3
- <paymentService version="1.4" merchantCode="MERCHME">
4
- <submit>
5
- <order orderCode="1577726052">
6
- <description>Your Waste Carrier Registration CBDU2</description>
7
- <amount currencyCode="GBP" value="10500" exponent="2"/>
8
- <orderContent>Waste Carrier Registration renewal: CBDU2 for Booth Mcdaniel Associates</orderContent>
9
- <paymentMethodMask>
10
- <include code="VISA-SSL"/>
11
- <include code="MAESTRO-SSL"/>
12
- <include code="ECMC-SSL"/>
13
- </paymentMethodMask>
14
- <shopper>
15
- <shopperEmailAddress>vucij@example.com</shopperEmailAddress>
16
- </shopper>
17
- <billingAddress>
18
- <address>
19
- <firstName>Bell</firstName>
20
- <lastName>Cruz</lastName>
21
- <address1>HARMSEN GROUP DEANERY ROAD</address1>
22
- <address2/>
23
- <postalCode>BS1 5AH</postalCode>
24
- <city>BRISTOL</city>
25
- <countryCode>GB</countryCode>
26
- </address>
27
- </billingAddress>
28
- </order>
29
- </submit>
30
- </paymentService>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!DOCTYPE paymentService PUBLIC '-//WorldPay/DTD WorldPay PaymentService v1/EN' 'http://dtd.worldpay.com/paymentService_v1.dtd'>
3
- <paymentService version="1.4">
4
- <modify>
5
- </modify>
6
- </paymentService>
@@ -1,11 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!DOCTYPE paymentService PUBLIC '-//WorldPay/DTD WorldPay PaymentService v1/EN' 'http://dtd.worldpay.com/paymentService_v1.dtd'>
3
- <paymentService version="1.4" merchantCode="MERCHME">
4
- <modify>
5
- <orderModification orderCode="1579644835">
6
- <refund>
7
- <amount value="2500" currencyCode="GBP" exponent="2"/>
8
- </refund>
9
- </orderModification>
10
- </modify>
11
- </paymentService>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!DOCTYPE paymentService PUBLIC '-//WorldPay/DTD WorldPay PaymentService v1/EN' 'http://dtd.worldpay.com/paymentService_v1.dtd'>
3
- <paymentService version="1.4" merchantCode="MERCHME">
4
- <boom>
5
- </boom>
6
- </paymentService>
@@ -1,163 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rails_helper"
4
-
5
- module DefraRubyMocks
6
- RSpec.describe "Worldpay", type: :request do
7
- after(:all) { Helpers::Configuration.reset_for_tests }
8
-
9
- context "when mocks are enabled" do
10
- before(:each) do
11
- Helpers::Configuration.prep_for_tests
12
- DefraRubyMocks.configure do |config|
13
- config.worldpay_admin_code = "admincode1"
14
- config.worldpay_mac_secret = "macsecret1"
15
- config.worldpay_domain = "http://localhost:3000/defra_ruby_mocks"
16
- end
17
- end
18
-
19
- context "#payments_service" do
20
- let(:path) { "/defra_ruby_mocks/worldpay/payments-service" }
21
-
22
- context "when a payment request is received" do
23
- context "and the request is valid" do
24
- let(:data) { File.read("spec/fixtures/payment_request_valid.xml") }
25
-
26
- it "returns an XML response with a 200 code" do
27
- post path, headers: { "RAW_POST_DATA" => data }
28
-
29
- expect(response.media_type).to eq("application/xml")
30
- expect(response.code).to eq("200")
31
- expect(response.body).to be_xml
32
- end
33
- end
34
-
35
- context "and the request is invalid" do
36
- let(:data) { File.read("spec/fixtures/payment_request_invalid.xml") }
37
-
38
- it "returns a response with a 500 code" do
39
- post path, headers: { "RAW_POST_DATA" => data }
40
-
41
- expect(response.code).to eq("500")
42
- end
43
- end
44
- end
45
-
46
- context "when a refund request is received" do
47
- context "and the request is valid" do
48
- let(:data) { File.read("spec/fixtures/refund_request_valid.xml") }
49
-
50
- it "returns an XML response with a 200 code" do
51
- post path, headers: { "RAW_POST_DATA" => data }
52
-
53
- expect(response.media_type).to eq("application/xml")
54
- expect(response.code).to eq("200")
55
- expect(response.body).to be_xml
56
- end
57
- end
58
- end
59
- end
60
-
61
- context "#dispatcher" do
62
- let(:success_url) { "http://example.com/fo/12345/worldpay/success" }
63
- let(:failure_url) { "http://example.com/fo/12345/worldpay/failure" }
64
- let(:pending_url) { "http://example.com/fo/12345/worldpay/pending" }
65
- let(:cancel_url) { "http://example.com/fo/12345/worldpay/cancel" }
66
- let(:error_url) { "http://example.com/fo/12345/worldpay/error" }
67
- let(:response_url) { "#{success_url}?orderKey=admincode1^^987654&paymentStatus=#{status}&paymentAmount=10500&paymentCurrency=GBP&mac=0ba5271e1ed1b26f9bb428ef7fb536a4&source=WP" }
68
- let(:path) do
69
- root = "/defra_ruby_mocks/worldpay/dispatcher"
70
- escaped_success = CGI.escape(success_url)
71
- escaped_failure = CGI.escape(failure_url)
72
- escaped_pending = CGI.escape(pending_url)
73
- escaped_cancel = CGI.escape(cancel_url)
74
- escaped_error = CGI.escape(error_url)
75
-
76
- "#{root}?successURL=#{escaped_success}&failureURL=#{escaped_failure}&pendingURL=#{escaped_pending}&cancelURL=#{escaped_cancel}&errorURL=#{escaped_error}"
77
- end
78
- let(:service_response) do
79
- double(
80
- :response,
81
- supplied_url: success_url,
82
- url: response_url,
83
- status: status,
84
- separator: "?",
85
- order_key: "admincode1",
86
- mac: "e5bc7ce5dfe44d2000771ac2b157f0e9",
87
- value: 154_00,
88
- reference: "12345"
89
- )
90
- end
91
-
92
- context "and the request is valid" do
93
- before(:each) do
94
- allow(WorldpayResponseService).to receive(:run)
95
- .with(
96
- success_url: success_url,
97
- failure_url: failure_url,
98
- pending_url: pending_url,
99
- cancel_url: cancel_url,
100
- error_url: error_url
101
- ) { service_response }
102
- end
103
-
104
- context "and a response is expected" do
105
- let(:status) { "AUTHORISED" }
106
-
107
- it "redirects the user with a 300 code" do
108
- get path
109
-
110
- expect(response).to redirect_to(response_url)
111
- expect(response.code).to eq("302")
112
- end
113
- end
114
-
115
- context "and a response is not expected" do
116
- let(:status) { :STUCK }
117
-
118
- it "renders the Worldpay stuck page" do
119
- get path
120
-
121
- expect(response).to render_template(:stuck)
122
- expect(response.code).to eq("200")
123
- end
124
- end
125
- end
126
-
127
- context "and the request is invalid" do
128
- before(:each) { allow(WorldpayResponseService).to receive(:run).and_raise(MissingResourceError.new("foo")) }
129
-
130
- context "because the success url is not in a recognised format" do
131
- let(:success_url) { "http://example.com/forthewin" }
132
-
133
- it "returns a response with a 500 code" do
134
- get path
135
-
136
- expect(response.code).to eq("500")
137
- end
138
- end
139
- end
140
- end
141
- end
142
-
143
- context "when mocks are disabled" do
144
- before(:each) { DefraRubyMocks.configuration.enable = false }
145
-
146
- context "#payments_service" do
147
- let(:path) { "/defra_ruby_mocks/worldpay/payments-service" }
148
-
149
- it "cannot load the page" do
150
- expect { get path }.to raise_error(ActionController::RoutingError)
151
- end
152
- end
153
-
154
- context "#dispatcher" do
155
- let(:path) { "/defra_ruby_mocks/worldpay/dispatcher" }
156
-
157
- it "cannot load the page" do
158
- expect { get path }.to raise_error(ActionController::RoutingError)
159
- end
160
- end
161
- end
162
- end
163
- end
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rails_helper"
4
-
5
- module DefraRubyMocks
6
- RSpec.describe WorldpayPaymentService do
7
- describe ".run" do
8
- after(:each) { Helpers::Configuration.reset_for_tests }
9
-
10
- let(:merchant_code) { "MERCHME" }
11
- let(:args) { { merchant_code: merchant_code, xml: xml } }
12
-
13
- context "when the mocks config is missing a worldpay domain" do
14
- let(:xml) { nil }
15
-
16
- it "raises a 'InvalidConfigError'" do
17
- expect { described_class.run(args) }.to raise_error InvalidConfigError
18
- end
19
- end
20
-
21
- context "when the XML is valid" do
22
- before(:each) do
23
- DefraRubyMocks.configure do |config|
24
- config.worldpay_domain = "http://localhost:3000/defra_ruby_mocks"
25
- end
26
- end
27
-
28
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/payment_request_valid.xml")) }
29
-
30
- context "the result it returns" do
31
- it "is a hash" do
32
- expect(described_class.run(args)).to be_an_instance_of(Hash)
33
- end
34
-
35
- it "contains 4 values" do
36
- result = described_class.run(args).length
37
- expect(result).to eq(4)
38
- end
39
-
40
- it "has the merchant code passed in" do
41
- result = described_class.run(args)[:merchant_code]
42
-
43
- expect(result).to eq(merchant_code)
44
- end
45
-
46
- it "has an order code extracted from the XML" do
47
- result = described_class.run(args)[:order_code]
48
-
49
- expect(result).to eq("1577726052")
50
- end
51
-
52
- context "has a generated ID which is" do
53
- it "10 characters long" do
54
- result = described_class.run(args)[:id]
55
-
56
- expect(result.length).to eq(10)
57
- end
58
-
59
- it "only made up of the digits 0 to 9" do
60
- result = described_class.run(args)[:id]
61
-
62
- expect(result.scan(/\D/).empty?).to be_truthy
63
- end
64
-
65
- it "different each time" do
66
- results = []
67
- 3.times do
68
- results << described_class.run(args)[:id]
69
- end
70
-
71
- expect(results.uniq.length).to eq(results.length)
72
- end
73
- end
74
-
75
- context "has a url" do
76
- it "based on the configured domain, and extracted merchant and order codes" do
77
- result = described_class.run(args)[:url]
78
-
79
- expect(result).to eq("http://localhost:3000/defra_ruby_mocks/worldpay/dispatcher?OrderKey=MERCHME%5E1577726052")
80
- end
81
- end
82
- end
83
-
84
- end
85
-
86
- context "when the XML is invalid" do
87
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/payment_request_invalid.xml")) }
88
-
89
- it "raises an error" do
90
- expect { described_class.run(args) }.to raise_error StandardError
91
- end
92
- end
93
- end
94
- end
95
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rails_helper"
4
-
5
- module DefraRubyMocks
6
- RSpec.describe WorldpayRefundService do
7
- describe ".run" do
8
-
9
- let(:merchant_code) { "MERCHME" }
10
- let(:args) { { merchant_code: merchant_code, xml: xml } }
11
-
12
- context "when the XML is valid" do
13
-
14
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/refund_request_valid.xml")) }
15
-
16
- context "the result it returns" do
17
- it "is a hash" do
18
- expect(described_class.run(args)).to be_an_instance_of(Hash)
19
- end
20
-
21
- it "contains 5 values" do
22
- result = described_class.run(args).length
23
- expect(result).to eq(5)
24
- end
25
-
26
- it "has the merchant code passed in" do
27
- result = described_class.run(args)[:merchant_code]
28
-
29
- expect(result).to eq(merchant_code)
30
- end
31
-
32
- it "has an order code extracted from the XML" do
33
- result = described_class.run(args)[:order_code]
34
-
35
- expect(result).to eq("1579644835")
36
- end
37
-
38
- it "has the refund value extracted from the XML" do
39
- result = described_class.run(args)[:refund_value]
40
-
41
- expect(result).to eq("2500")
42
- end
43
-
44
- it "has a currency code extracted from the XML" do
45
- result = described_class.run(args)[:currency_code]
46
-
47
- expect(result).to eq("GBP")
48
- end
49
-
50
- it "has the exponent extracted from the XML" do
51
- result = described_class.run(args)[:exponent]
52
-
53
- expect(result).to eq("2")
54
- end
55
- end
56
-
57
- end
58
-
59
- context "when the XML is invalid" do
60
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/refund_request_invalid.xml")) }
61
-
62
- it "raises an error" do
63
- expect { described_class.run(args) }.to raise_error StandardError
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rails_helper"
4
-
5
- module DefraRubyMocks
6
- RSpec.describe WorldpayRequestHandlerService do
7
- describe ".run" do
8
- context "when a request is made" do
9
-
10
- let(:merchant_code) { "MERCHME" }
11
- let(:args) { { merchant_code: merchant_code, xml: xml } }
12
-
13
- context "and it's for a payment" do
14
- before do
15
- allow_any_instance_of(WorldpayPaymentService).to receive(:generate_id) { order_id }
16
- end
17
-
18
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/payment_request_valid.xml")) }
19
- let(:order_id) { "1234567890" }
20
- let(:request_type) { { request_type: :payment } }
21
- let(:response_values) do
22
- {
23
- merchant_code: merchant_code,
24
- order_code: "1577726052",
25
- id: order_id,
26
- url: "http://example.com"
27
- }
28
- end
29
-
30
- it "correctly determines the request service to use" do
31
- expect(WorldpayPaymentService).to receive(:run).with(args) { response_values }
32
-
33
- described_class.run(xml)
34
- end
35
-
36
- it "returns the values the controller needs to handle the request" do
37
- expect(WorldpayPaymentService).to receive(:run).with(args) { response_values }
38
-
39
- expect(described_class.run(xml)).to eq(request_type.merge(response_values))
40
- end
41
- end
42
-
43
- context "and it's for a refund" do
44
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/refund_request_valid.xml")) }
45
- let(:request_type) { { request_type: :refund } }
46
- let(:response_values) do
47
- {
48
- merchant_code: merchant_code,
49
- order_code: "1579644835",
50
- refund_value: "2500",
51
- currency_code: "GBP",
52
- exponent: "2"
53
- }
54
- end
55
-
56
- it "correctly determines the request service to use" do
57
- expect(WorldpayRefundService).to receive(:run).with(args) { response_values }
58
-
59
- described_class.run(xml)
60
- end
61
-
62
- it "returns the values the controller needs to handle the request" do
63
- expect(WorldpayRefundService).to receive(:run).with(args) { response_values }
64
-
65
- expect(described_class.run(xml)).to eq(request_type.merge(response_values))
66
- end
67
- end
68
-
69
- context "but it's not recognised" do
70
- let(:xml) { Nokogiri::XML(File.read("spec/fixtures/unrecognised_request.xml")) }
71
-
72
- it "raises a 'UnrecognisedWorldpayRequestError'" do
73
- expect { described_class.run(xml) }.to raise_error UnrecognisedWorldpayRequestError
74
- end
75
- end
76
- end
77
- end
78
- end
79
- end
@@ -1,120 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rails_helper"
4
-
5
- module DefraRubyMocks
6
- RSpec.describe WorldpayResourceService do
7
- before(:each) do
8
- allow(::WasteCarriersEngine::TransientRegistration).to receive(:where) { transient_relation }
9
- allow(::WasteCarriersEngine::Registration).to receive(:where) { registration_relation }
10
- end
11
-
12
- let(:reference) { "12345" }
13
- let(:company_name) { "Pay for the thing" }
14
-
15
- let(:resource) { double(:resource, finance_details: finance_details, company_name: company_name) }
16
- let(:finance_details) { double(:finance_details, orders: orders) }
17
- let(:orders) { double(:orders, order_by: sorted_orders) }
18
- let(:sorted_orders) { double(:sorted_orders, first: order) }
19
- let(:order) { double(:order) }
20
-
21
- let(:args) { { reference: reference } }
22
-
23
- describe ".run" do
24
-
25
- context "when the resource is a TransientRegistration" do
26
- let(:transient_relation) { double(:relation, first: resource) }
27
-
28
- it "will only search transient registrations" do
29
- described_class.run(args)
30
-
31
- expect(::WasteCarriersEngine::TransientRegistration).to have_received(:where).with(token: reference)
32
-
33
- expect(::WasteCarriersEngine::Registration).not_to have_received(:where).with(reg_uuid: reference)
34
- end
35
-
36
- it "returns an object with the matching resource" do
37
- expect(described_class.run(args).resource).to eq(resource)
38
- end
39
-
40
- it "returns an object with the expected order" do
41
- expect(described_class.run(args).order).to eq(order)
42
- end
43
-
44
- it "returns an object with the expected company name" do
45
- expect(described_class.run(args).company_name).to eq(company_name.downcase)
46
- end
47
-
48
- context "when the company name is not populated" do
49
- let(:company_name) { nil }
50
-
51
- it "returns the object" do
52
- expect(described_class.run(args).resource).to eq(resource)
53
- end
54
- end
55
- end
56
-
57
- context "when the resource is a Registration" do
58
- let(:transient_relation) { double(:relation, first: nil) }
59
- let(:registration_relation) { double(:relation, first: resource) }
60
-
61
- it "will search transient registrations first, then registrations" do
62
- described_class.run(args)
63
-
64
- expect(::WasteCarriersEngine::TransientRegistration).to have_received(:where).with(token: reference)
65
-
66
- expect(::WasteCarriersEngine::Registration).to have_received(:where).with(reg_uuid: reference)
67
- end
68
-
69
- it "returns an object with the matching resource" do
70
- expect(described_class.run(args).resource).to eq(resource)
71
- end
72
-
73
- it "returns an object with the expected order" do
74
- expect(described_class.run(args).order).to eq(order)
75
- end
76
-
77
- it "returns an object with the expected company name" do
78
- expect(described_class.run(args).company_name).to eq(company_name.downcase)
79
- end
80
- end
81
-
82
- context "when the resource is a OrderCopyCardsRegistration" do
83
- before do
84
- # Because we do not copy the company name to
85
- # `OrderCopyCardsRegistration` instances when we create them in WCR
86
- # we need to locate the orignal registration they are based on. We
87
- # determine in the class if the 'resource' is an instance of one by
88
- # comparing the result of resource.class.to_s to
89
- # "WasteCarriersEngine::OrderCopyCardsRegistration". The problem is
90
- # when testing 'resource' is actually an instance of
91
- # `RSpec::Mocks::Double`! So we subvert the call to class on
92
- # RSpec::Mocks::Double to return "WasteCarriersEngine::OrderCopyCardsRegistration"
93
- # just in this spec. We can then test that the service does indeed
94
- # locate the original registration for a company name
95
- allow_any_instance_of(RSpec::Mocks::Double).to receive(:class)
96
- .and_return("WasteCarriersEngine::OrderCopyCardsRegistration")
97
- end
98
-
99
- let(:copy_card_resource) { double(:resource, finance_details: finance_details, reg_identifier: "CBDU123") }
100
- let(:transient_relation) { double(:relation, first: copy_card_resource) }
101
- let(:registration_relation) { double(:relation, first: resource) }
102
-
103
- it "locates the original registration to grab the company name" do
104
- expect(described_class.run(args).company_name).to eq(company_name.downcase)
105
-
106
- expect(::WasteCarriersEngine::Registration).to have_received(:where).with(reg_identifier: "CBDU123")
107
- end
108
- end
109
-
110
- context "when the resource does not exist" do
111
- let(:transient_relation) { double(:relation, first: nil) }
112
- let(:registration_relation) { double(:relation, first: nil) }
113
-
114
- it "causes an error" do
115
- expect { described_class.run(args) }.to raise_error MissingResourceError
116
- end
117
- end
118
- end
119
- end
120
- end