require 'spec_helper'
# Specs ported from ActiveModel::Lint::Tests
#
# These tests do not attempt to determine the semantic correctness of the
# returned values. For instance, you could implement valid? to always
# return true, and the tests would pass. It is up to you to ensure that
# the values are semantically meaningful.
#
# Objects you pass in are expected to return a compliant object from a
# call to to_model. It is perfectly fine for to_model to return self.
module MongoModel
specs_for(Document, EmbeddedDocument) do
define_class(:TestModel, described_class)
subject { TestModel.new.to_model }
# == Responds to to_key
#
# Returns an Enumerable of all (primary) key attributes
# or nil if model.persisted? is false
it { should respond_to(:to_key) }
specify "to_key should return nil if subject.persisted? is false" do
subject.stub!(:persisted?).and_return(false)
subject.to_key.should be_nil
end
# == Responds to to_param
#
# Returns a string representing the object's key suitable for use in URLs
# or nil if model.persisted? is false.
#
# Implementers can decide to either raise an exception or provide a default
# in case the record uses a composite primary key. There are no tests for this
# behavior in lint because it doesn't make sense to force any of the possible
# implementation strategies on the implementer. However, if the resource is
# not persisted?, then to_param should always return nil.
it { should respond_to(:to_param) }
specify "to_param should return nil if subject.persisted? is false" do
subject.stub!(:to_key).and_return([1])
subject.stub!(:persisted?).and_return(false)
subject.to_param.should be_nil
end
# == Responds to valid?
#
# Returns a boolean that specifies whether the object is in a valid or invalid
# state.
it { should respond_to_boolean(:valid?) }
# == Responds to persisted?
#
# Returns a boolean that specifies whether the object has been persisted yet.
# This is used when calculating the URL for an object. If the object is
# not persisted, a form for that object, for instance, will be POSTed to the
# collection. If it is persisted, a form for the object will put PUTed to the
# URL for the object.
it { should respond_to_boolean(:persisted?) }
# == Naming
#
# Model.model_name must returns a string with some convenience methods as
# :human and :partial_path. Check ActiveModel::Naming for more information.
#
specify "the model class should respond to model_name" do
subject.class.should respond_to(:model_name)
end
it "should return strings for model_name" do
model_name = subject.class.model_name
model_name.should be_a_kind_of(String)
model_name.human.should be_a_kind_of(String)
model_name.partial_path.should be_a_kind_of(String)
model_name.singular.should be_a_kind_of(String)
model_name.plural.should be_a_kind_of(String)
end
# == Errors Testing
#
# Returns an object that has :[] and :full_messages defined on it. See below
# for more details.
describe "errors" do
it { should respond_to(:errors) }
# Returns an Array of Strings that are the errors for the attribute in
# question. If localization is used, the Strings should be localized
# for the current locale. If no error is present, this method should
# return an empty Array.
describe "#[]" do
it "should return an Array" do
subject.errors[:hello].should be_an(Array)
end
end
# Returns an Array of all error messages for the object. Each message
# should contain information about the field, if applicable.
describe "#full_messages" do
it "should return an Array" do
subject.errors.full_messages.should be_an(Array)
end
end
end
end
end