diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index fd4b9ed7e7..f2132a4fe0 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -34,12 +34,6 @@ Lint/EmptyClass: Exclude: - 'spec/lib/reports/report_loader_spec.rb' -# Offense count: 1 -# Configuration parameters: AllowComments. -Lint/EmptyFile: - Exclude: - - 'spec/lib/open_food_network/enterprise_injection_data_spec.rb' - # Offense count: 2 Lint/FloatComparison: Exclude: @@ -85,14 +79,13 @@ Lint/UselessMethodDefinition: Exclude: - 'app/models/spree/gateway.rb' -# Offense count: 24 +# Offense count: 23 # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max. Metrics/AbcSize: Exclude: - 'app/controllers/admin/enterprises_controller.rb' - 'app/controllers/payment_gateways/paypal_controller.rb' - 'app/controllers/spree/admin/payments_controller.rb' - - 'app/controllers/spree/admin/taxons_controller.rb' - 'app/controllers/spree/admin/variants_controller.rb' - 'app/controllers/spree/orders_controller.rb' - 'app/helpers/spree/admin/navigation_helper.rb' @@ -127,7 +120,7 @@ Metrics/BlockNesting: Exclude: - 'app/models/spree/payment/processing.rb' -# Offense count: 46 +# Offense count: 47 # Configuration parameters: CountComments, Max, CountAsOne. Metrics/ClassLength: Exclude: @@ -137,6 +130,7 @@ Metrics/ClassLength: - 'app/controllers/admin/resource_controller.rb' - 'app/controllers/admin/subscriptions_controller.rb' - 'app/controllers/application_controller.rb' + - 'app/controllers/checkout_controller.rb' - 'app/controllers/payment_gateways/paypal_controller.rb' - 'app/controllers/spree/admin/orders_controller.rb' - 'app/controllers/spree/admin/payment_methods_controller.rb' @@ -178,12 +172,11 @@ Metrics/ClassLength: - 'lib/reporting/reports/enterprise_fee_summary/scope.rb' - 'lib/reporting/reports/xero_invoices/base.rb' -# Offense count: 32 +# Offense count: 31 # Configuration parameters: AllowedMethods, AllowedPatterns, Max. Metrics/CyclomaticComplexity: Exclude: - 'app/controllers/admin/enterprises_controller.rb' - - 'app/controllers/spree/admin/taxons_controller.rb' - 'app/controllers/spree/orders_controller.rb' - 'app/helpers/checkout_helper.rb' - 'app/helpers/order_cycles_helper.rb' @@ -208,13 +201,12 @@ Metrics/CyclomaticComplexity: - 'lib/spree/localized_number.rb' - 'spec/models/product_importer_spec.rb' -# Offense count: 24 +# Offense count: 23 # Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns. Metrics/MethodLength: Exclude: - 'app/controllers/admin/enterprises_controller.rb' - 'app/controllers/payment_gateways/paypal_controller.rb' - - 'app/controllers/spree/admin/taxons_controller.rb' - 'app/controllers/spree/orders_controller.rb' - 'app/helpers/spree/admin/navigation_helper.rb' - 'app/models/spree/ability.rb' @@ -293,19 +285,17 @@ Metrics/ParameterLists: - 'spec/support/controller_requests_helper.rb' - 'spec/system/admin/reports_spec.rb' -# Offense count: 4 +# Offense count: 3 # Configuration parameters: AllowedMethods, AllowedPatterns, Max. Metrics/PerceivedComplexity: Exclude: - - 'app/controllers/spree/admin/taxons_controller.rb' - 'app/models/enterprise_relationship.rb' - 'app/models/spree/ability.rb' - 'app/models/spree/order/checkout.rb' -# Offense count: 8 +# Offense count: 7 Naming/AccessorMethodName: Exclude: - - 'app/controllers/spree/admin/taxonomies_controller.rb' - 'app/mailers/producer_mailer.rb' - 'app/models/spree/order.rb' - 'app/services/checkout/post_checkout_actions.rb' @@ -353,7 +343,7 @@ Naming/VariableNumber: - 'spec/models/spree/tax_rate_spec.rb' - 'spec/requests/api/orders_spec.rb' -# Offense count: 142 +# Offense count: 143 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: ResponseMethods. # ResponseMethods: response, last_response @@ -557,7 +547,7 @@ RSpecRails/InferredSpecType: - 'spec/requests/voucher_adjustments_spec.rb' - 'spec/routing/stripe_spec.rb' -# Offense count: 22 +# Offense count: 21 # Configuration parameters: IgnoreScopes, Include. # Include: app/models/**/*.rb Rails/InverseOf: @@ -572,7 +562,6 @@ Rails/InverseOf: - 'app/models/spree/price.rb' - 'app/models/spree/product.rb' - 'app/models/spree/stock_item.rb' - - 'app/models/spree/taxonomy.rb' - 'app/models/spree/variant.rb' - 'app/models/subscription_line_item.rb' @@ -720,7 +709,7 @@ Style/GlobalStdStream: - 'lib/tasks/subscriptions/debug.rake' - 'lib/tasks/subscriptions/test.rake' -# Offense count: 12 +# Offense count: 10 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: AllowSplatArgument. Style/HashConversion: @@ -728,9 +717,7 @@ Style/HashConversion: - 'app/controllers/admin/column_preferences_controller.rb' - 'app/controllers/admin/variant_overrides_controller.rb' - 'app/controllers/spree/admin/products_controller.rb' - - 'app/models/order_cycle.rb' - 'app/models/product_import/product_importer.rb' - - 'app/models/spree/shipping_method.rb' - 'app/serializers/api/admin/exchange_serializer.rb' - 'app/services/variants_stock_levels.rb' - 'spec/controllers/admin/inventory_items_controller_spec.rb' diff --git a/app/controllers/checkout_controller.rb b/app/controllers/checkout_controller.rb index efd8e80eeb..c5bce3a5e1 100644 --- a/app/controllers/checkout_controller.rb +++ b/app/controllers/checkout_controller.rb @@ -78,6 +78,18 @@ class CheckoutController < BaseController return true if redirect_to_payment_gateway + # Redeem VINE voucher + vine_voucher_redeemer = VineVoucherRedeemerService.new(order: @order) + if vine_voucher_redeemer.call == false + # rubocop:disable Rails/DeprecatedActiveModelErrorsMethods + flash[:error] = if vine_voucher_redeemer.errors.keys.include?(:redeeming_failed) + vine_voucher_redeemer.errors[:redeeming_failed] + else + I18n.t('checkout.errors.voucher_redeeming_error') + end + return false + # rubocop:enable Rails/DeprecatedActiveModelErrorsMethods + end @order.process_payments! @order.confirm! order_completion_reset @order diff --git a/config/locales/en.yml b/config/locales/en.yml index abbbc23c4b..8e71f4b38b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2134,6 +2134,7 @@ en: voucher_not_found: Not found add_voucher_error: There was an error while adding the voucher create_voucher_error: "There was an error while creating the voucher: %{error}" + voucher_redeeming_error: There was an error while trying to redeem your voucher shops: hubs: show_closed_shops: "Show closed shops" diff --git a/spec/controllers/checkout_controller_spec.rb b/spec/controllers/checkout_controller_spec.rb index ed1da29653..37957c2ff9 100644 --- a/spec/controllers/checkout_controller_spec.rb +++ b/spec/controllers/checkout_controller_spec.rb @@ -433,6 +433,7 @@ RSpec.describe CheckoutController, type: :controller do context "summary step" do let(:step) { "summary" } + let(:checkout_params) { { confirm_order: "Complete order" } } before do order.bill_address = address @@ -496,6 +497,60 @@ RSpec.describe CheckoutController, type: :controller do end end + context "with a VINE voucher", feature: :connected_apps do + let(:vine_voucher) { + create(:voucher_flat_rate, voucher_type: "VINE", code: 'some_code', + enterprise: distributor, amount: 6) + } + let(:vine_voucher_redeemer) { instance_double(VineVoucherRedeemerService) } + + before do + # Adding voucher to the order + vine_voucher.create_adjustment(vine_voucher.code, order) + VoucherAdjustmentsService.new(order).update + order.update_totals_and_states + + allow(VineVoucherRedeemerService).to receive(:new).and_return(vine_voucher_redeemer) + end + + it "completes the order and redirects to order confirmation" do + expect(vine_voucher_redeemer).to receive(:call).and_return(true) + + put(:update, params:) + + expect(response).to redirect_to order_path(order, order_token: order.token) + expect(order.reload.state).to eq "complete" + end + + context "when redeeming the voucher fails" do + it "returns 422 and some error" do + allow(vine_voucher_redeemer).to receive(:call).and_return(false) + allow(vine_voucher_redeemer).to receive(:errors).and_return( + { redeeming_failed: "Redeeming the voucher failed" } + ) + + put(:update, params:) + + expect(response.status).to eq 422 + expect(flash[:error]).to match "Redeeming the voucher failed" + end + end + + context "when an other error happens" do + it "returns 422 and some error" do + allow(vine_voucher_redeemer).to receive(:call).and_return(false) + allow(vine_voucher_redeemer).to receive(:errors).and_return( + { vine_api: "There was an error communicating with the API" } + ) + + put(:update, params:) + + expect(response.status).to eq 422 + expect(flash[:error]).to match "There was an error while trying to redeem your voucher" + end + end + end + context "when an external payment gateway is used" do before do expect(Checkout::PaymentMethodFetcher).