defra_ruby_mocks 1.0.0 → 1.4.1
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 +5 -5
- data/README.md +90 -2
- data/Rakefile +0 -2
- data/app/controllers/defra_ruby_mocks/company_controller.rb +1 -1
- data/app/controllers/defra_ruby_mocks/worldpay_controller.rb +51 -0
- data/app/services/defra_ruby_mocks/worldpay_payment_service.rb +47 -0
- data/app/services/defra_ruby_mocks/worldpay_refund_service.rb +37 -0
- data/app/services/defra_ruby_mocks/worldpay_request_handler_service.rb +40 -0
- data/app/services/defra_ruby_mocks/worldpay_resource_service.rb +55 -0
- data/app/services/defra_ruby_mocks/worldpay_response_service.rb +92 -0
- data/app/views/defra_ruby_mocks/worldpay/payment_request.xml.erb +4 -0
- data/app/views/defra_ruby_mocks/worldpay/refund_request.xml.erb +4 -0
- data/app/views/defra_ruby_mocks/worldpay/stuck.html.erb +37 -0
- data/config/routes.rb +11 -0
- data/lib/defra_ruby_mocks/configuration.rb +2 -0
- data/lib/defra_ruby_mocks/engine.rb +3 -0
- data/lib/defra_ruby_mocks/invalid_config_error.rb +9 -0
- data/lib/defra_ruby_mocks/missing_resource_error.rb +9 -0
- data/lib/defra_ruby_mocks/unrecognised_worldpay_request_error.rb +5 -0
- data/lib/defra_ruby_mocks/version.rb +1 -1
- data/spec/dummy/log/development.log +180 -0
- data/spec/dummy/log/test.log +679 -99
- data/spec/examples.txt +83 -30
- data/spec/fixtures/payment_request_invalid.xml +6 -0
- data/spec/fixtures/payment_request_valid.xml +30 -0
- data/spec/fixtures/refund_request_invalid.xml +6 -0
- data/spec/fixtures/refund_request_valid.xml +11 -0
- data/spec/fixtures/unrecognised_request.xml +6 -0
- data/spec/requests/company_spec.rb +3 -3
- data/spec/requests/worldpay_spec.rb +142 -0
- data/spec/services/worldpay_payment_service_spec.rb +95 -0
- data/spec/services/worldpay_refund_service_spec.rb +68 -0
- data/spec/services/worldpay_request_handler_service_spec.rb +79 -0
- data/spec/services/worldpay_resource_service_spec.rb +112 -0
- data/spec/services/worldpay_response_service_spec.rb +156 -0
- data/spec/spec_helper.rb +3 -2
- data/spec/support/helpers/configuration.rb +1 -0
- data/spec/support/helpers/helpers.rb +13 -0
- data/spec/support/helpers/waste_carriers_engine.rb +10 -0
- data/spec/support/helpers/xml_matchers.rb +19 -0
- metadata +75 -8
    
        data/spec/examples.txt
    CHANGED
    
    | @@ -1,30 +1,83 @@ | |
| 1 | 
            -
            example_id | 
| 2 | 
            -
             | 
| 3 | 
            -
            ./spec/defra_ruby_mocks_spec.rb[1:1:1] | 
| 4 | 
            -
            ./spec/defra_ruby_mocks_spec.rb[1:2:1:1] | 
| 5 | 
            -
            ./spec/defra_ruby_mocks_spec.rb[1:2:2:1] | 
| 6 | 
            -
            ./spec/lib/configuration_spec.rb[1:1:1:1] | 
| 7 | 
            -
            ./spec/lib/configuration_spec.rb[1:1:2:1] | 
| 8 | 
            -
            ./spec/lib/configuration_spec.rb[1:1:3:1] | 
| 9 | 
            -
            ./spec/lib/configuration_spec.rb[1:1:4:1] | 
| 10 | 
            -
            ./spec/lib/configuration_spec.rb[1:2:1:1] | 
| 11 | 
            -
            ./spec/lib/configuration_spec.rb[1:2:2:1] | 
| 12 | 
            -
            ./spec/lib/configuration_spec.rb[1:2:3:1] | 
| 13 | 
            -
            ./spec/lib/configuration_spec.rb[1:2:4:1] | 
| 14 | 
            -
            ./spec/requests/company_spec.rb[1:1:1:1] | 
| 15 | 
            -
            ./spec/requests/company_spec.rb[1:1:2:1] | 
| 16 | 
            -
            ./spec/requests/company_spec.rb[1:1:3:1:1] | 
| 17 | 
            -
            ./spec/requests/company_spec.rb[1:1:3:2:1] | 
| 18 | 
            -
            ./spec/requests/company_spec.rb[1:2:1] | 
| 19 | 
            -
            ./spec/ | 
| 20 | 
            -
            ./spec/ | 
| 21 | 
            -
            ./spec/ | 
| 22 | 
            -
            ./spec/ | 
| 23 | 
            -
            ./spec/ | 
| 24 | 
            -
            ./spec/ | 
| 25 | 
            -
            ./spec/ | 
| 26 | 
            -
            ./spec/ | 
| 27 | 
            -
            ./spec/services/companies_house_service_spec.rb[1:1: | 
| 28 | 
            -
            ./spec/services/companies_house_service_spec.rb[1:1:2: | 
| 29 | 
            -
            ./spec/services/companies_house_service_spec.rb[1:1: | 
| 30 | 
            -
            ./spec/services/companies_house_service_spec.rb[1:1:3: | 
| 1 | 
            +
            example_id                                                          | status | run_time        |
         | 
| 2 | 
            +
            ------------------------------------------------------------------- | ------ | --------------- |
         | 
| 3 | 
            +
            ./spec/defra_ruby_mocks_spec.rb[1:1:1]                              | passed | 0.02254 seconds |
         | 
| 4 | 
            +
            ./spec/defra_ruby_mocks_spec.rb[1:2:1:1]                            | passed | 0.00022 seconds |
         | 
| 5 | 
            +
            ./spec/defra_ruby_mocks_spec.rb[1:2:2:1]                            | passed | 0.00565 seconds |
         | 
| 6 | 
            +
            ./spec/lib/configuration_spec.rb[1:1:1:1]                           | passed | 0.00008 seconds |
         | 
| 7 | 
            +
            ./spec/lib/configuration_spec.rb[1:1:2:1]                           | passed | 0.00008 seconds |
         | 
| 8 | 
            +
            ./spec/lib/configuration_spec.rb[1:1:3:1]                           | passed | 0.00008 seconds |
         | 
| 9 | 
            +
            ./spec/lib/configuration_spec.rb[1:1:4:1]                           | passed | 0.00009 seconds |
         | 
| 10 | 
            +
            ./spec/lib/configuration_spec.rb[1:2:1:1]                           | passed | 0.00009 seconds |
         | 
| 11 | 
            +
            ./spec/lib/configuration_spec.rb[1:2:2:1]                           | passed | 0.00009 seconds |
         | 
| 12 | 
            +
            ./spec/lib/configuration_spec.rb[1:2:3:1]                           | passed | 0.00011 seconds |
         | 
| 13 | 
            +
            ./spec/lib/configuration_spec.rb[1:2:4:1]                           | passed | 0.00236 seconds |
         | 
| 14 | 
            +
            ./spec/requests/company_spec.rb[1:1:1:1]                            | passed | 0.01096 seconds |
         | 
| 15 | 
            +
            ./spec/requests/company_spec.rb[1:1:2:1]                            | passed | 0.04303 seconds |
         | 
| 16 | 
            +
            ./spec/requests/company_spec.rb[1:1:3:1:1]                          | passed | 0.00435 seconds |
         | 
| 17 | 
            +
            ./spec/requests/company_spec.rb[1:1:3:2:1]                          | passed | 0.00458 seconds |
         | 
| 18 | 
            +
            ./spec/requests/company_spec.rb[1:2:1]                              | passed | 0.00311 seconds |
         | 
| 19 | 
            +
            ./spec/requests/worldpay_spec.rb[1:1:1:1:1:1]                       | passed | 0.02388 seconds |
         | 
| 20 | 
            +
            ./spec/requests/worldpay_spec.rb[1:1:1:1:2:1]                       | passed | 0.00636 seconds |
         | 
| 21 | 
            +
            ./spec/requests/worldpay_spec.rb[1:1:1:2:1:1]                       | passed | 0.01838 seconds |
         | 
| 22 | 
            +
            ./spec/requests/worldpay_spec.rb[1:1:2:1:1:1]                       | passed | 0.03425 seconds |
         | 
| 23 | 
            +
            ./spec/requests/worldpay_spec.rb[1:1:2:1:2:1]                       | passed | 0.04753 seconds |
         | 
| 24 | 
            +
            ./spec/requests/worldpay_spec.rb[1:1:2:2:1:1]                       | passed | 0.00465 seconds |
         | 
| 25 | 
            +
            ./spec/requests/worldpay_spec.rb[1:2:1:1]                           | passed | 0.0037 seconds  |
         | 
| 26 | 
            +
            ./spec/requests/worldpay_spec.rb[1:2:2:1]                           | passed | 0.01137 seconds |
         | 
| 27 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:1:1]            | passed | 0.00017 seconds |
         | 
| 28 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:1:1]          | passed | 0.00011 seconds |
         | 
| 29 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:2:1]          | passed | 0.0001 seconds  |
         | 
| 30 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:3:1]          | passed | 0.00012 seconds |
         | 
| 31 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:4:1]          | passed | 0.00009 seconds |
         | 
| 32 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:5:1]          | passed | 0.00009 seconds |
         | 
| 33 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:6:1]          | passed | 0.0001 seconds  |
         | 
| 34 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:7:1]          | passed | 0.0001 seconds  |
         | 
| 35 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:8:1]          | passed | 0.00009 seconds |
         | 
| 36 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:2:9:1]          | passed | 0.0001 seconds  |
         | 
| 37 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:3:1:1]          | passed | 0.00009 seconds |
         | 
| 38 | 
            +
            ./spec/services/companies_house_service_spec.rb[1:1:3:2:1]          | passed | 0.00012 seconds |
         | 
| 39 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:1:1]           | passed | 0.00019 seconds |
         | 
| 40 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:1]         | passed | 0.002 seconds   |
         | 
| 41 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:2]         | passed | 0.00135 seconds |
         | 
| 42 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:3]         | passed | 0.00059 seconds |
         | 
| 43 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:4]         | passed | 0.00101 seconds |
         | 
| 44 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:5:1]       | passed | 0.00086 seconds |
         | 
| 45 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:5:2]       | passed | 0.01732 seconds |
         | 
| 46 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:5:3]       | passed | 0.00079 seconds |
         | 
| 47 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:2:1:6:1]       | passed | 0.00094 seconds |
         | 
| 48 | 
            +
            ./spec/services/worldpay_payment_service_spec.rb[1:1:3:1]           | passed | 0.00208 seconds |
         | 
| 49 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:1]          | passed | 0.00063 seconds |
         | 
| 50 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:2]          | passed | 0.00065 seconds |
         | 
| 51 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:3]          | passed | 0.0006 seconds  |
         | 
| 52 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:4]          | passed | 0.00066 seconds |
         | 
| 53 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:5]          | passed | 0.00218 seconds |
         | 
| 54 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:6]          | passed | 0.00064 seconds |
         | 
| 55 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:1:1:7]          | passed | 0.00061 seconds |
         | 
| 56 | 
            +
            ./spec/services/worldpay_refund_service_spec.rb[1:1:2:1]            | passed | 0.01948 seconds |
         | 
| 57 | 
            +
            ./spec/services/worldpay_request_handler_service_spec.rb[1:1:1:1:1] | passed | 0.00125 seconds |
         | 
| 58 | 
            +
            ./spec/services/worldpay_request_handler_service_spec.rb[1:1:1:1:2] | passed | 0.00146 seconds |
         | 
| 59 | 
            +
            ./spec/services/worldpay_request_handler_service_spec.rb[1:1:1:2:1] | passed | 0.00086 seconds |
         | 
| 60 | 
            +
            ./spec/services/worldpay_request_handler_service_spec.rb[1:1:1:2:2] | passed | 0.00077 seconds |
         | 
| 61 | 
            +
            ./spec/services/worldpay_request_handler_service_spec.rb[1:1:1:3:1] | passed | 0.00141 seconds |
         | 
| 62 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:1:1]          | passed | 0.00068 seconds |
         | 
| 63 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:1:2]          | passed | 0.00062 seconds |
         | 
| 64 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:1:3]          | passed | 0.00065 seconds |
         | 
| 65 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:1:4]          | passed | 0.00056 seconds |
         | 
| 66 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:2:1]          | passed | 0.00075 seconds |
         | 
| 67 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:2:2]          | passed | 0.00067 seconds |
         | 
| 68 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:2:3]          | passed | 0.00067 seconds |
         | 
| 69 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:2:4]          | passed | 0.00064 seconds |
         | 
| 70 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:3:1]          | passed | 0.05549 seconds |
         | 
| 71 | 
            +
            ./spec/services/worldpay_resource_service_spec.rb[1:1:4:1]          | passed | 0.00428 seconds |
         | 
| 72 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:1:1:1]        | passed | 0.00066 seconds |
         | 
| 73 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:1:1:2]        | passed | 0.00055 seconds |
         | 
| 74 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:1:1:3]        | passed | 0.00058 seconds |
         | 
| 75 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:1:1:4:1]      | passed | 0.00059 seconds |
         | 
| 76 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:1:1:5:1]      | passed | 0.0006 seconds  |
         | 
| 77 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:1:1:6:1]      | passed | 0.00057 seconds |
         | 
| 78 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:2:1:1]        | passed | 0.00061 seconds |
         | 
| 79 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:2:1:2]        | passed | 0.00059 seconds |
         | 
| 80 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:2:1:3]        | passed | 0.00059 seconds |
         | 
| 81 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:2:1:4:1]      | passed | 0.00072 seconds |
         | 
| 82 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:2:1:5:1]      | passed | 0.00291 seconds |
         | 
| 83 | 
            +
            ./spec/services/worldpay_response_service_spec.rb[1:1:2:1:6:1]      | passed | 0.00091 seconds |
         | 
| @@ -0,0 +1,30 @@ | |
| 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>
         | 
| @@ -0,0 +1,11 @@ | |
| 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>
         | 
| @@ -2,14 +2,14 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require "rails_helper"
         | 
| 4 4 |  | 
| 5 | 
            -
            module  | 
| 5 | 
            +
            module DefraRubyMocks
         | 
| 6 6 | 
             
              RSpec.describe "Company", type: :request do
         | 
| 7 | 
            +
                after(:all) { Helpers::Configuration.reset_for_tests }
         | 
| 7 8 |  | 
| 8 9 | 
             
                let(:path) { "/defra_ruby_mocks/company" }
         | 
| 9 10 |  | 
| 10 11 | 
             
                context "when mocks are enabled" do
         | 
| 11 | 
            -
                  before(: | 
| 12 | 
            -
                  after(:all) { Helpers::Configuration.reset_for_tests }
         | 
| 12 | 
            +
                  before(:each) { Helpers::Configuration.prep_for_tests }
         | 
| 13 13 |  | 
| 14 14 | 
             
                  context "when the company number is 99999999 for not found" do
         | 
| 15 15 | 
             
                    let(:company_number) { "99999999" }
         | 
| @@ -0,0 +1,142 @@ | |
| 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 | 
            +
                          get path, {}, "RAW_POST_DATA" => data
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                          expect(response.content_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 | 
            +
                          get path, {}, "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 | 
            +
                          get path, {}, "RAW_POST_DATA" => data
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                          expect(response.content_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(:response_url) { "#{success_url}?orderKey=admincode1^^987654&paymentStatus=#{status}&paymentAmount=10500&paymentCurrency=GBP&mac=0ba5271e1ed1b26f9bb428ef7fb536a4&source=WP" }
         | 
| 63 | 
            +
                    let(:path) { "/defra_ruby_mocks/worldpay/dispatcher?successURL=#{CGI.escape(success_url)}" }
         | 
| 64 | 
            +
                    let(:service_response) do
         | 
| 65 | 
            +
                      double(
         | 
| 66 | 
            +
                        :response,
         | 
| 67 | 
            +
                        supplied_url: success_url,
         | 
| 68 | 
            +
                        url: response_url,
         | 
| 69 | 
            +
                        status: status,
         | 
| 70 | 
            +
                        separator: "?",
         | 
| 71 | 
            +
                        order_key: "admincode1",
         | 
| 72 | 
            +
                        mac: "e5bc7ce5dfe44d2000771ac2b157f0e9",
         | 
| 73 | 
            +
                        value: 154_00,
         | 
| 74 | 
            +
                        reference: "12345"
         | 
| 75 | 
            +
                      )
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    context "and the request is valid" do
         | 
| 79 | 
            +
                      before(:each) { allow(WorldpayResponseService).to receive(:run) { service_response } }
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                      let(:success_url) { "http://example.com/fo/12345/worldpay/success" }
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                      context "and a response is expected" do
         | 
| 84 | 
            +
                        let(:status) { "AUTHORISED" }
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                        it "redirects the user with a 300 code" do
         | 
| 87 | 
            +
                          get path
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                          expect(response).to redirect_to(response_url)
         | 
| 90 | 
            +
                          expect(response.code).to eq("302")
         | 
| 91 | 
            +
                        end
         | 
| 92 | 
            +
                      end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                      context "and a response is not expected" do
         | 
| 95 | 
            +
                        let(:status) { :STUCK }
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                        it "renders the Worldpay stuck page" do
         | 
| 98 | 
            +
                          get path
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                          expect(response).to render_template(:stuck)
         | 
| 101 | 
            +
                          expect(response.code).to eq("200")
         | 
| 102 | 
            +
                        end
         | 
| 103 | 
            +
                      end
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    context "and the request is invalid" do
         | 
| 107 | 
            +
                      before(:each) { allow(WorldpayResponseService).to receive(:run).and_raise(MissingResourceError.new("foo")) }
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                      context "because the success url is not in a recognised format" do
         | 
| 110 | 
            +
                        let(:success_url) { "http://example.com/forthewin" }
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                        it "returns a response with a 500 code" do
         | 
| 113 | 
            +
                          get path
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                          expect(response.code).to eq("500")
         | 
| 116 | 
            +
                        end
         | 
| 117 | 
            +
                      end
         | 
| 118 | 
            +
                    end
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                context "when mocks are disabled" do
         | 
| 123 | 
            +
                  before(:each) { DefraRubyMocks.configuration.enable = false }
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  context "#payments_service" do
         | 
| 126 | 
            +
                    let(:path) { "/defra_ruby_mocks/worldpay/payments-service" }
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                    it "cannot load the page" do
         | 
| 129 | 
            +
                      expect { get path }.to raise_error(ActionController::RoutingError)
         | 
| 130 | 
            +
                    end
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  context "#dispatcher" do
         | 
| 134 | 
            +
                    let(:path) { "/defra_ruby_mocks/worldpay/dispatcher" }
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                    it "cannot load the page" do
         | 
| 137 | 
            +
                      expect { get path }.to raise_error(ActionController::RoutingError)
         | 
| 138 | 
            +
                    end
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
            end
         | 
| @@ -0,0 +1,95 @@ | |
| 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
         | 
| @@ -0,0 +1,68 @@ | |
| 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
         |