Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions ecommerce/pricing/test/coupons_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,19 @@ def test_100_is_ok
def test_0_01_is_ok
register_coupon(@uid, fake_name, @code, "0.01")
end

def test_negative_discount_is_rejected
assert_raises(Infra::Command::Invalid) do
register_coupon(@uid, fake_name, @code, -0.01)
end
end

def test_negative_discount_string_is_rejected
assert_raises(Infra::Command::Invalid) do
register_coupon(@uid, fake_name, @code, "-150")
end
end


end
end
27 changes: 23 additions & 4 deletions rails_application/app/controllers/coupons_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ def new
end

def create
coupon_id = params[:coupon_id]
@coupon_id = params[:coupon_id].presence || SecureRandom.uuid

discount = validated_discount(params[:discount])
return render_invalid_discount unless discount

ActiveRecord::Base.transaction do
create_coupon(coupon_id)
create_coupon(@coupon_id, discount)
end
rescue Pricing::Coupon::AlreadyRegistered
flash[:notice] = "Coupon is already registered"
Expand All @@ -22,13 +25,13 @@ def create

private

def create_coupon(coupon_id)
def create_coupon(coupon_id,discount)
command_bus.(
Pricing::RegisterCoupon.new(
coupon_id: coupon_id,
name: params[:name],
code: params[:code],
discount: params[:discount]
discount: discount
)
)
command_bus.(
Expand All @@ -39,4 +42,20 @@ def create_coupon(coupon_id)
)
end

def validated_discount(raw)
return nil if raw.blank?

value = BigDecimal(raw.to_s)
return nil unless value > 0 && value <= 100

value
rescue ArgumentError
nil
end

def render_invalid_discount
flash.now[:alert] = "Discount must be greater than 0 and less than or equal to 100"
render "new", status: :unprocessable_entity
end

end
6 changes: 3 additions & 3 deletions rails_application/app/views/coupons/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
<label for="coupon" class="block font-bold">
Name
</label>
<%= text_field_tag :name, "", required: true, class: "mt-1 focus:ring-blue-500 focus:border-blue-500 block shadow-sm sm:text-sm border-gray-300 rounded-md" %>
<%= text_field_tag :name, params[:name], required: true, class: "mt-1 focus:ring-blue-500 focus:border-blue-500 block shadow-sm sm:text-sm border-gray-300 rounded-md" %>

<label for="coupon" class="block font-bold">
Code
</label>
<%= text_field_tag :code, "", required: true, class: "mt-1 focus:ring-blue-500 focus:border-blue-500 block shadow-sm sm:text-sm border-gray-300 rounded-md" %>
<%= text_field_tag :code, params[:code], required: true, class: "mt-1 focus:ring-blue-500 focus:border-blue-500 block shadow-sm sm:text-sm border-gray-300 rounded-md" %>

<label for="coupon" class="block font-bold">
Discount
</label>
<%= number_field_tag :discount, nil, min: 1, max: 100, step: 0.01, id: "discount", required: true, class: "mt-1 focus:ring-blue-500 focus:border-blue-500 block shadow-sm sm:text-sm border-gray-300 rounded-md" %>
<%= number_field_tag :discount, params[:discount], min: 1, max: 100, step: 0.01, id: "discount", required: true, class: "mt-1 focus:ring-blue-500 focus:border-blue-500 block shadow-sm sm:text-sm border-gray-300 rounded-md" %>
<% end %>
21 changes: 21 additions & 0 deletions rails_application/test/integration/coupons_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,27 @@ def test_creation
assert_select("td", "6.69")
end

def test_creation_with_negative_discount_is_rejected
register_store("Test Store")

get "/coupons/new"
coupon_id = css_select("input[name='coupon_id']").first["value"]

post "/coupons", params: {
coupon_id: coupon_id,
name: "Bad Coupon",
code: "NEG",
discount: "-150"
}

assert_response :unprocessable_entity

get "/coupons"
assert_response :success
assert_select("td", text: "Bad Coupon", count: 0)
assert_select("td", text: "NEG", count: 0)
end

private

def register_coupon(name, code, discount)
Expand Down
Loading