module Shoulda::ActiveRecord::Macros

def should_allow_mass_assignment_of(*attributes)


should_allow_mass_assignment_of :first_name, :last_name

Ensures that the attribute can be set on mass update.

Deprecated: use ActiveRecord::Matchers#allow_mass_assignment_of instead.
def should_allow_mass_assignment_of(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should allow_mass_assignment_of")
  get_options!(attributes)
  attributes.each do |attribute|
    should allow_mass_assignment_of(attribute)
  end
end

def should_allow_values_for(attribute, *good_values)


should_allow_values_for :isbn, "isbn 1 2345 6789 0", "ISBN 1-2345-6789-0"
Example:

Ensures that the attribute can be set to the given values.

Deprecated: use ActiveRecord::Matchers#allow_value instead.
def should_allow_values_for(attribute, *good_values)
  ::ActiveSupport::Deprecation.warn("use: should allow_value")
  get_options!(good_values)
  good_values.each do |value|
    should allow_value(value).for(attribute)
  end
end

def should_belong_to(*associations)


should_belong_to :parent

Ensure that the belongs_to relationship exists.

Deprecated: use ActiveRecord::Matchers#belong_to instead.
def should_belong_to(*associations)
  ::ActiveSupport::Deprecation.warn("use: should belong_to")
  dependent = get_options!(associations, :dependent)
  associations.each do |association|
    should belong_to(association).dependent(dependent)
  end
end

def should_ensure_length_at_least(attribute, min_length, opts = {})


should_ensure_length_at_least :name, 3
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.too_short') % min_length
* :short_message - value the test expects to find in errors.on(:attribute).
Options:

Ensures that the length of the attribute is at least a certain length

Deprecated: use ActiveRecord::Matchers#ensure_length_of instead.
def should_ensure_length_at_least(attribute, min_length, opts = {})
  ::ActiveSupport::Deprecation.warn("use: should ensure_length_of.is_at_least")
  short_message = get_options!([opts], :short_message)
  should ensure_length_of(attribute).
    is_at_least(min_length).
    with_short_message(short_message)
end

def should_ensure_length_in_range(attribute, range, opts = {})


should_ensure_length_in_range :password, (6..20)
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.too_long') % range.last
* :long_message - value the test expects to find in errors.on(:attribute).
Regexp or string. Default = I18n.translate('activerecord.errors.messages.too_short') % range.first
* :short_message - value the test expects to find in errors.on(:attribute).
Options:

Ensures that the length of the attribute is in the given range

Deprecated: use ActiveRecord::Matchers#ensure_length_of instead.
def should_ensure_length_in_range(attribute, range, opts = {})
  ::ActiveSupport::Deprecation.warn("use: should ensure_length_of.is_at_least.is_at_most")
  short_message, long_message = get_options!([opts],
                                             :short_message,
                                             :long_message)
  should ensure_length_of(attribute).
    is_at_least(range.first).
    with_short_message(short_message).
    is_at_most(range.last).
    with_long_message(long_message)
end

def should_ensure_length_is(attribute, length, opts = {})


should_ensure_length_is :ssn, 9
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.wrong_length') % length
* :message - value the test expects to find in errors.on(:attribute).
Options:

Ensures that the length of the attribute is exactly a certain length

Deprecated: use ActiveRecord::Matchers#ensure_length_of instead.
def should_ensure_length_is(attribute, length, opts = {})
  ::ActiveSupport::Deprecation.warn("use: should ensure_length_of.is_equal_to")
  message = get_options!([opts], :message)
  should ensure_length_of(attribute).
    is_equal_to(length).
    with_message(message)
end

def should_ensure_value_in_range(attribute, range, opts = {})


should_ensure_value_in_range :age, (0..100)
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.inclusion')
* :high_message - value the test expects to find in errors.on(:attribute).
Regexp or string. Default = I18n.translate('activerecord.errors.messages.inclusion')
* :low_message - value the test expects to find in errors.on(:attribute).
Options:

Ensure that the attribute is in the range specified

Deprecated: use ActiveRecord::Matchers#ensure_inclusion_of instead.
def should_ensure_value_in_range(attribute, range, opts = {})
  ::ActiveSupport::Deprecation.warn("use: should ensure_inclusion_of.in_range")
  message, low_message, high_message = get_options!([opts],
                                                    :message,
                                                    :low_message,
                                                    :high_message)
  should ensure_inclusion_of(attribute).
    in_range(range).
    with_message(message).
    with_low_message(low_message).
    with_high_message(high_message)
end

def should_have_and_belong_to_many(*associations)


should_have_and_belong_to_many :posts, :cars

table is in place.
Ensures that the has_and_belongs_to_many relationship exists, and that the join

Deprecated: use ActiveRecord::Matchers#have_and_belong_to_many instead.
def should_have_and_belong_to_many(*associations)
  ::ActiveSupport::Deprecation.warn("use: should have_and_belong_to_many")
  get_options!(associations)
  associations.each do |association|
    should have_and_belong_to_many(association)
  end
end

def should_have_class_methods(*methods)


should_have_class_methods :find, :destroy

Ensure that the given class methods are defined on the model.

Deprecated.
def should_have_class_methods(*methods)
  ::ActiveSupport::Deprecation.warn
  get_options!(methods)
  klass = described_type
  methods.each do |method|
    should "respond to class method ##{method}" do
      assert_respond_to klass, method, "#{klass.name} does not have class method #{method}"
    end
  end
end

def should_have_db_columns(*columns)


should_have_db_column :admin, :default => false, :null => false
should_have_db_column :salary, :decimal, :precision => 15, :scale => 2
should_have_db_column :email, :type => "string", :limit => 255

should_have_db_columns :id, :email, :name, :created_at

Examples:

:type, :precision, :limit, :default, :null, and :scale
Takes the same options available in migrations:
Also aliased to should_have_db_column for readability.
Ensure that the given columns are defined on the models backing SQL table.

Deprecated: use ActiveRecord::Matchers#have_db_column instead.
def should_have_db_columns(*columns)
  ::ActiveSupport::Deprecation.warn("use: should have_db_column")
  column_type, precision, limit, default, null, scale, sql_type =
    get_options!(columns, :type, :precision, :limit,
                          :default, :null, :scale, :sql_type)
  columns.each do |name|
    should have_db_column(name).
                of_type(column_type).
                with_options(:precision => precision, :limit    => limit,
                             :default   => default,   :null     => null,
                             :scale     => scale,     :sql_type => sql_type)
  end
end

def should_have_db_indices(*columns)


should_have_db_index :ssn, :unique => true
should_have_db_index :age
should_have_db_indices :email, :name, [:commentable_type, :commentable_id]

Examples:

unique or not. Default = nil
constraint. Use nil if you don't care whether the index is
constraint. Use false to explicitly test for a non-unique
constraint. Use true to explicitly test for a unique
* :unique - whether or not the index has a unique
Options:

Also aliased to should_have_db_index for readability
Ensures that there are DB indices on the given columns or tuples of columns.

Deprecated: use ActiveRecord::Matchers#have_db_index instead.
def should_have_db_indices(*columns)
  ::ActiveSupport::Deprecation.warn("use: should have_db_index")
  unique = get_options!(columns, :unique)
  columns.each do |column|
    should have_db_index(column).unique(unique)
  end
end

def should_have_instance_methods(*methods)


should_have_instance_methods :email, :name, :name=

Ensure that the given instance methods are defined on the model.

Deprecated.
def should_have_instance_methods(*methods)
  ::ActiveSupport::Deprecation.warn
  get_options!(methods)
  klass = described_type
  methods.each do |method|
    should "respond to instance method ##{method}" do
      assert_respond_to klass.new, method, "#{klass.name} does not have instance method #{method}"
    end
  end
end

def should_have_many(*associations)


should_have_many :enemies, :dependent => :destroy
should_have_many :enemies, :through => :friends
should_have_many :friends
Example:

* :dependent - tests that the association makes use of the dependent option.
* :through - association name for has_many :through
Options:

associations.
associated table has the required columns. Works with polymorphic
Ensures that the has_many relationship exists. Will also test that the

Deprecated: use ActiveRecord::Matchers#have_many instead.
def should_have_many(*associations)
  ::ActiveSupport::Deprecation.warn("use: should have_many")
  through, dependent = get_options!(associations, :through, :dependent)
  associations.each do |association|
    should have_many(association).through(through).dependent(dependent)
  end
end

def should_have_one(*associations)


should_have_one :god # unless hindu
Example:

* :dependent - tests that the association makes use of the dependent option.
Options:

associations.
associated table has the required columns. Works with polymorphic
Ensure that the has_one relationship exists. Will also test that the

Deprecated: use ActiveRecord::Matchers#have_one instead.
def should_have_one(*associations)
  ::ActiveSupport::Deprecation.warn("use: should have_one")
  dependent, through = get_options!(associations, :dependent, :through)
  associations.each do |association|
    should have_one(association).dependent(dependent).through(through)
  end
end

def should_have_readonly_attributes(*attributes)


should_have_readonly_attributes :password, :admin_flag

Ensures that the attribute cannot be changed once the record has been created.

Deprecated: use ActiveRecord::Matchers#have_readonly_attribute instead.
def should_have_readonly_attributes(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should have_readonly_attribute")
  get_options!(attributes)
  attributes.each do |attribute|
    should have_readonly_attribute(attribute)
  end
end

def should_not_allow_mass_assignment_of(*attributes)


should_not_allow_mass_assignment_of :password, :admin_flag

Ensures that the attribute cannot be set on mass update.

Deprecated: use ActiveRecord::Matchers#allow_mass_assignment_of instead.
def should_not_allow_mass_assignment_of(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should_not allow_mass_assignment_of")
  get_options!(attributes)
  attributes.each do |attribute|
    should_not allow_mass_assignment_of(attribute)
  end
end

def should_not_allow_values_for(attribute, *bad_values)


should_not_allow_values_for :isbn, "bad 1", "bad 2"
Example:

errors.on(:attribute).
Regexp or string. If omitted, the test will pass if there is ANY error in
* :message - value the test expects to find in errors.on(:attribute).
Options:

Ensures that the attribute cannot be set to the given values

Deprecated: use ActiveRecord::Matchers#allow_value instead.
def should_not_allow_values_for(attribute, *bad_values)
  ::ActiveSupport::Deprecation.warn("use: should_not allow_value")
  message = get_options!(bad_values, :message)
  bad_values.each do |value|
    should_not allow_value(value).for(attribute).with_message(message)
  end
end

def should_validate_acceptance_of(*attributes)


should_validate_acceptance_of :eula
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.accepted')
* :message - value the test expects to find in errors.on(:attribute).
Options:

Ensures that the model cannot be saved if one of the attributes listed is not accepted.

Deprecated: use ActiveRecord::Matchers#validate_acceptance_of instead.
def should_validate_acceptance_of(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should validate_acceptance_of")
  message = get_options!(attributes, :message)
  attributes.each do |attribute|
    should validate_acceptance_of(attribute).with_message(message)
  end
end

def should_validate_numericality_of(*attributes)


should_validate_numericality_of :age
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.not_a_number')
* :message - value the test expects to find in errors.on(:attribute).
Options:

Ensure that the attribute is numeric

Deprecated: use ActiveRecord::Matchers#validate_numericality_of instead.
def should_validate_numericality_of(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should validate_numericality_of")
  message = get_options!(attributes, :message)
  attributes.each do |attribute|
    should validate_numericality_of(attribute).
      with_message(message)
  end
end

def should_validate_presence_of(*attributes)


should_validate_presence_of :name, :phone_number
Example:

Regexp or string. Default = I18n.translate('activerecord.errors.messages.blank')
* :message - value the test expects to find in errors.on(:attribute).
Options:

Ensures that the model cannot be saved if one of the attributes listed is not present.

Deprecated: use ActiveRecord::Matchers#validate_presence_of instead.
def should_validate_presence_of(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should validate_presence_of")
  message = get_options!(attributes, :message)
  attributes.each do |attribute|
    should validate_presence_of(attribute).with_message(message)
  end
end

def should_validate_uniqueness_of(*attributes)


should_validate_uniqueness_of :email, :case_sensitive => false
should_validate_uniqueness_of :address, :scoped_to => [:first_name, :last_name]
should_validate_uniqueness_of :email, :scoped_to => :name
should_validate_uniqueness_of :name, :message => "O NOES! SOMEONE STOELED YER NAME!"
should_validate_uniqueness_of :keyword, :username
Examples:

exact match. Ignored by non-text attributes. Default = true
* :case_sensitive - whether or not uniqueness is defined by an
* :scoped_to - field(s) to scope the uniqueness to.
Regexp or string. Default = I18n.translate('activerecord.errors.messages.taken')
* :message - value the test expects to find in errors.on(:attribute).
Options:

Requires an existing record
Ensures that the model cannot be saved if one of the attributes listed is not unique.

Deprecated: use ActiveRecord::Matchers#validate_uniqueness_of instead.
def should_validate_uniqueness_of(*attributes)
  ::ActiveSupport::Deprecation.warn("use: should validate_uniqueness_of")
  message, scope, case_sensitive = get_options!(attributes, :message, :scoped_to, :case_sensitive)
  scope = [*scope].compact
  case_sensitive = true if case_sensitive.nil?
  attributes.each do |attribute|
    matcher = validate_uniqueness_of(attribute).
      with_message(message).scoped_to(scope)
    matcher = matcher.case_insensitive unless case_sensitive
    should matcher
  end
end