Here’s a messy, unoptimized Ruby method. Let’s clean it up.
- How can we make this more extensible?
- How should it handle invalid inputs (negative prices, nil codes)
- How could we extract this logic into a separate class/module
require "bundler/inline" | |
gemfile do | |
gem "rspec" | |
gem "minitest" | |
end | |
def messy_calculate_discount(price, discount_code) | |
if discount_code == 'SUMMER10' | |
discount = price * 0.1 | |
elsif discount_code == 'WELCOME5' | |
discount = price * 0.05 | |
elsif discount_code == 'SUPER20' | |
discount = price * 0.2 | |
else | |
discount = 0 | |
end | |
final_price = price - discount | |
if final_price < 0 | |
final_price = 0 | |
end | |
return final_price | |
end | |
# ------------------------------------------ | |
# RSpec Tests (if using rspec) | |
# Run: rspec discount_calculator.rb | |
# ------------------------------------------ | |
if defined?(RSpec) | |
RSpec.describe "Discount Calculator" do | |
it 'applies SUMMER10 correctly' do | |
expect(messy_calculate_discount(100, 'SUMMER10')).to eq(90) | |
end | |
it 'applies WELCOME5 correctly' do | |
expect(messy_calculate_discount(100, 'WELCOME5')).to eq(95) | |
end | |
it 'applies SUPER20 correctly' do | |
expect(messy_calculate_discount(100, 'SUPER20')).to eq(80) | |
end | |
it 'returns original price if code is unknown' do | |
expect(messy_calculate_discount(100, 'UNKNOWN')).to eq(100) | |
end | |
it 'caps final price at 0' do | |
expect(messy_calculate_discount(100, 'SUPER20')).to be >= 0 | |
expect(messy_calculate_discount(-100, 'SUPER20')).to eq(0) | |
end | |
end | |
end | |
# ------------------------------------------ | |
# Minitest Tests (if using minitest) | |
# Run: ruby discount_calculator.rb | |
# ------------------------------------------ | |
if __FILE__ == $0 | |
require 'minitest/autorun' | |
class DiscountCalculatorTest < Minitest::Test | |
def test_summer10 | |
assert_equal 90, messy_calculate_discount(100, 'SUMMER10') | |
end | |
def test_welcome5 | |
assert_equal 95, messy_calculate_discount(100, 'WELCOME5') | |
end | |
def test_super20 | |
assert_equal 80, messy_calculate_discount(100, 'SUPER20') | |
end | |
def test_unknown_code | |
assert_equal 100, messy_calculate_discount(100, 'INVALID') | |
end | |
def test_negative_price_returns_zero | |
assert_equal 0, messy_calculate_discount(-100, 'SUMMER10') | |
end | |
def test_nil_code | |
assert_equal 100, messy_calculate_discount(100, nil) | |
end | |
end | |
end |