-
Notifications
You must be signed in to change notification settings - Fork 21.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added validations to ActiveResource. Added a smoke test to see if we …
…can add a validation and use it, and add a validates callback and use it. Signed-off-by: Joshua Peek <josh@joshpeek.com>
- Loading branch information
Showing
3 changed files
with
123 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# used to test validations | ||
class Project < ActiveResource::Base | ||
self.site = "http://37s.sunrise.i:3000" | ||
|
||
validates_presence_of :name | ||
validate :description_greater_than_three_letters | ||
|
||
# to test the validate *callback* works | ||
def description_greater_than_three_letters | ||
errors.add :description, 'must be greater than three letters long' if description.length < 3 unless description.blank? | ||
end | ||
|
||
|
||
# stop-gap accessor to default this attribute to nil | ||
# Otherwise the validations fail saying that the method does not exist. | ||
# In future, method_missing will be updated to not explode on a known | ||
# attribute. | ||
def name | ||
attributes['name'] || nil | ||
end | ||
def description | ||
attributes['description'] || nil | ||
end | ||
end | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
require 'abstract_unit' | ||
require "fixtures/project" | ||
|
||
# The validations are tested thoroughly under ActiveModel::Validations | ||
# This test case simply makes sur that they are all accessible by | ||
# Active Resource objects. | ||
class ValidationsTest < ActiveModel::TestCase | ||
VALID_PROJECT_HASH = { :name => "My Project", :description => "A project" } | ||
def setup | ||
@my_proj = VALID_PROJECT_HASH.to_xml(:root => "person") | ||
ActiveResource::HttpMock.respond_to do |mock| | ||
mock.post "/projects.xml", {}, @my_proj, 201, 'Location' => '/projects/5.xml' | ||
end | ||
end | ||
|
||
def test_validates_presence_of | ||
p = new_project(:name => nil) | ||
assert !p.valid?, "should not be a valid record without name" | ||
assert !p.save, "should not have saved an invalid record" | ||
assert_equal ["can't be blank"], p.errors[:name], "should have an error on name" | ||
|
||
p.name = "something" | ||
|
||
assert p.save, "should have saved after fixing the validation, but had: #{p.errors.inspect}" | ||
end | ||
|
||
def test_validate_callback | ||
# we have a callback ensuring the description is longer thn three letters | ||
p = new_project(:description => 'a') | ||
assert !p.valid?, "should not be a valid record when it fails a validation callback" | ||
assert !p.save, "should not have saved an invalid record" | ||
assert_equal ["must be greater than three letters long"], p.errors[:description], "should be an error on description" | ||
|
||
# should now allow this description | ||
p.description = 'abcd' | ||
assert p.save, "should have saved after fixing the validation, but had: #{p.errors.inspect}" | ||
end | ||
|
||
protected | ||
|
||
# quickie helper to create a new project with all the required | ||
# attributes. | ||
# Pass in any params you specifically want to override | ||
def new_project(opts = {}) | ||
Project.new(VALID_PROJECT_HASH.merge(opts)) | ||
end | ||
|
||
end | ||
|