From 453988c615612577de825e14eb091c49bf028262 Mon Sep 17 00:00:00 2001 From: lukaszreszke Date: Fri, 8 Sep 2023 10:38:41 +0200 Subject: [PATCH] Allow setting discount for an empty order --- .../app/controllers/orders_controller.rb | 3 ++- .../client_orders/update_discount.rb | 2 +- .../test/integration/orders_test.rb | 25 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/rails_application/app/controllers/orders_controller.rb b/rails_application/app/controllers/orders_controller.rb index 4cd7382d8..75a54c7e3 100644 --- a/rails_application/app/controllers/orders_controller.rb +++ b/rails_application/app/controllers/orders_controller.rb @@ -36,7 +36,8 @@ def edit_discount def update_discount @order_id = params[:id] - if Orders::Order.find_by_uid(params[:id]).percentage_discount + order = Orders::Order.find_or_create_by!(uid: params[:id]) + if order.percentage_discount command_bus.(Pricing::ChangePercentageDiscount.new(order_id: @order_id, amount: params[:amount])) else command_bus.(Pricing::SetPercentageDiscount.new(order_id: @order_id, amount: params[:amount])) diff --git a/rails_application/app/read_models/client_orders/update_discount.rb b/rails_application/app/read_models/client_orders/update_discount.rb index f7e13edf5..bd05b5f63 100644 --- a/rails_application/app/read_models/client_orders/update_discount.rb +++ b/rails_application/app/read_models/client_orders/update_discount.rb @@ -1,7 +1,7 @@ module ClientOrders class UpdateDiscount < Infra::EventHandler def call(event) - order = Order.find_by(order_uid: event.data.fetch(:order_id)) + order = Order.find_or_create_by!(order_uid: event.data.fetch(:order_id)) order.percentage_discount = event.data.fetch(:amount) order.save! end diff --git a/rails_application/test/integration/orders_test.rb b/rails_application/test/integration/orders_test.rb index dd355eeff..a21cce4d7 100644 --- a/rails_application/test/integration/orders_test.rb +++ b/rails_application/test/integration/orders_test.rb @@ -183,6 +183,31 @@ def test_order_value_doesnt_change_after_changing_price assert_select("td", text: "$78.00") end + def test_discount_is_applied_for_new_order + order_id = SecureRandom.uuid + async_remote_id = register_product("Async Remote", 39, 10) + fearless_id = register_product("Fearless Refactoring", 49, 10) + shopify_id = register_customer("Shopify") + + assert_nothing_raised { apply_discount_10_percent(order_id)} + + post "/orders/#{order_id}/add_item?product_id=#{async_remote_id}" + post "/orders/#{order_id}/add_item?product_id=#{fearless_id}" + + post "/orders", + params: { + "authenticity_token" => "[FILTERED]", + "order_id" => order_id, + "customer_id" => shopify_id, + "commit" => "Submit order" + } + + follow_redirect! + assert_select("td", "$79.20") + assert_select("dd", "Submitted") + assert_select("td", "10.0%") + end + private def verify_shipping(order_id)