|
|
|
@@ -1,7 +1,76 @@ |
|
|
|
require 'test_helper' |
|
|
|
|
|
|
|
class ProductTest < ActiveSupport::TestCase |
|
|
|
# Rails is already doing this! (convention over configuration!) |
|
|
|
fixtures :products |
|
|
|
# test "the truth" do |
|
|
|
# assert true |
|
|
|
# end |
|
|
|
|
|
|
|
test "product attributes must not be empty" do |
|
|
|
product = Product.new |
|
|
|
assert product.invalid? |
|
|
|
assert product.errors[:title].any? |
|
|
|
assert product.errors[:description].any? |
|
|
|
assert product.errors[:image_url].any? |
|
|
|
assert product.errors[:price].any? |
|
|
|
end |
|
|
|
|
|
|
|
test "product price be positive" do |
|
|
|
product = Product.new(title: 'My Book Title', |
|
|
|
description: 'My Description.', |
|
|
|
image_url: 'image.jpg') |
|
|
|
|
|
|
|
product.price = -1 |
|
|
|
assert product.invalid? |
|
|
|
assert_equal ['must be greater than or equal to 0.01'], |
|
|
|
product.errors[:price] |
|
|
|
|
|
|
|
product.price = 0 |
|
|
|
assert product.invalid? |
|
|
|
assert_equal ['must be greater than or equal to 0.01'], |
|
|
|
product.errors[:price] |
|
|
|
|
|
|
|
product.price = 1 |
|
|
|
assert product.valid? |
|
|
|
end |
|
|
|
|
|
|
|
def new_product(image_url) |
|
|
|
product = Product.new(title: 'My Book Title', |
|
|
|
description: 'My Description.', |
|
|
|
image_url: image_url, |
|
|
|
price: 1) |
|
|
|
end |
|
|
|
|
|
|
|
test "image url" do |
|
|
|
ok = %w{ fred.jpg hans.png paul.Png peter.JPG |
|
|
|
http://a.b.c.d/images/foo.gif } |
|
|
|
bad =%w{ fred.doc hans.gif/more } |
|
|
|
|
|
|
|
ok.each { |name| assert new_product(name).valid? "#{name} shouldn't be invalid" } |
|
|
|
|
|
|
|
bad.each do |name| |
|
|
|
assert new_product(name).invalid? "#{name} shouldn't be valid" |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
test "product is not valid without a unique title - i18n" do |
|
|
|
product = Product.new(title: products(:ruby).title, |
|
|
|
description: 'Foo.', |
|
|
|
price: 1, |
|
|
|
image_url: "foo.jpg") |
|
|
|
assert product.invalid? |
|
|
|
assert_equal [I18n.translate('errors.messages.taken')], |
|
|
|
product.errors[:title] |
|
|
|
end |
|
|
|
|
|
|
|
test "product is not valid without minimum 5 characters in title" do |
|
|
|
product = Product.new(title: 'Shrt', |
|
|
|
description: 'A short work.', |
|
|
|
price: 0.99, |
|
|
|
image_url: 'short.jpg') |
|
|
|
assert product.invalid? |
|
|
|
assert_equal ['is too short (minimum is 5 characters)'], |
|
|
|
product.errors[:title] |
|
|
|
end |
|
|
|
end |