Skip to content

Commit

Permalink
Raise exceptions on invalid user params
Browse files Browse the repository at this point in the history
  • Loading branch information
dessy committed Dec 1, 2014
1 parent 4971ae7 commit e1dcb56
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 60 deletions.
28 changes: 8 additions & 20 deletions pedometer/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,18 @@ class User
attr_reader :gender, :height, :stride

def initialize(gender = nil, height = nil, stride = nil)
@gender = gender.to_s.downcase if GENDER.include? gender.to_s.downcase
# @height = height.to_f if height.to_f > 0
# @stride = (stride.to_f > 0) ? stride.to_f : calculate_stride
@height = float_or_default(height, nil, 0)
@stride = float_or_default(stride, calculate_stride, 0)
end
@gender = gender.to_s.downcase unless gender.to_s.empty?
@height = height.to_f unless height.to_s.empty?
@stride = stride.to_f unless stride.to_s.empty?

private
raise('Invalid gender') if @gender && !GENDER.include?(@gender)
raise('Invalid height') if @height && (@height <= 0)
raise('Invalid stride') if @stride && (@stride <= 0)

def float_or_default(val, default, greater_than_val)
float = Float(val)
(float > greater_than_val) ? float : default
rescue ArgumentError, TypeError
default
@stride ||= calculate_stride
end

# def float_or_default(val, default, greater_than_val)
# float = val.to_f
# if (float.to_s == val.to_s || float.to_s.gsub('.0', '') == val.to_s)
# (float > greater_than_val) ? float : default
# else
# default
# end
# end
private

def calculate_stride
if gender && height
Expand Down
74 changes: 34 additions & 40 deletions pedometer/test/unit/user_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ def test_create
user = User.new('male', 167.5, 80)

assert_equal 'male', user.gender
assert_equal 167.5, user.height
assert_equal 80, user.stride
assert_equal 167.5, user.height
assert_equal 80, user.stride
end

def test_create_no_params
Expand All @@ -19,27 +19,31 @@ def test_create_no_params
assert_equal 74, user.stride
end

def test_create_bad_params
user = User.new('bad params')
def test_create_with_gender
assert_nil User.new.gender
assert_nil User.new(nil).gender
assert_nil User.new('').gender

assert_nil user.gender
assert_nil user.height
assert_equal 74, user.stride
end
['invalid gender', 1].each do |gender|
assert_raise_with_message(RuntimeError, 'Invalid gender') do
User.new(gender)
end
end

def test_create_with_gender
assert_equal 'female', User.new('Female').gender
assert_equal 'male', User.new('MALE').gender

assert_nil User.new('invalid value').gender
assert_nil User.new(1).gender
end

def test_create_with_height
assert_nil User.new(nil).height
assert_nil User.new(nil, nil).height
assert_nil User.new(nil, '').height
assert_nil User.new(nil, 'bad height').height

['invalid height', 0, '0', -1, '-1'].each do |height|
assert_raise_with_message(RuntimeError, 'Invalid height') do
User.new(nil, height)
end
end

assert_equal 150, User.new(nil, 150).height
assert_equal 150, User.new(nil, '150').height
Expand All @@ -49,25 +53,30 @@ def test_create_with_height
assert_equal 167.5, User.new(nil, '167.5').height
assert_equal 181.12, User.new(nil, 181.12).height
assert_equal 181.12, User.new(nil, '181.12').height

assert_nil User.new(nil, 0).height
assert_nil User.new(nil, '0').height
assert_nil User.new(nil, -1).height
assert_nil User.new(nil, '-1').height
end

def test_create_with_height_and_gender
assert_equal 0.415, User.new('male', 1).stride
assert_equal 0.413, User.new('female', 1).stride
end

def test_create_with_stride
assert_equal 74, User.new.stride
assert_equal 74, User.new(nil, nil, 'bad stride').stride
assert_equal 74, User.new(nil, nil, -1).stride
assert_equal 74, User.new(nil, nil, nil).stride
assert_equal 74, User.new(nil, nil, '').stride

['invalid stride', 0, '0', -1, '-1'].each do |stride|
assert_raise_with_message(RuntimeError, 'Invalid stride') do
User.new(nil, nil, stride)
end
end

assert_equal 80, User.new(nil, nil, 80).stride
assert_equal 80, User.new(nil, nil, '80').stride
assert_equal 80, User.new(nil, nil, 80.0).stride
assert_equal 80, User.new(nil, nil, '80.0').stride
assert_equal 75.25, User.new(nil, nil, 75.25).stride
assert_equal 75.25, User.new(nil, nil, '75.25').stride
end

def test_create_with_height_and_gender
assert_equal 0.415, User.new('male', 1).stride
assert_equal 0.413, User.new('female', 1).stride
end

def test_calculate_stride
Expand All @@ -80,19 +89,4 @@ def test_calculate_stride
assert_equal 82.6, User.new('female', 200).stride
end

def test_for_chapter
User.new.stride
# => 74
User.new('Female').stride
# => 70
User.new(nil, '167.5').stride
# => 69.345
User.new('male', 191).stride
# => 79.265
User.new(nil, nil, '80').stride
# => 80.0
User.new('female', 1, '72').stride
# => 72.0
end

end

0 comments on commit e1dcb56

Please sign in to comment.