2020-03-20 14:34:07 -04:00
|
|
|
# HEAD (unreleased)
|
|
|
|
|
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add an `ignoring_check_for_db_index` qualifier to the `have_secure_token`
|
|
|
|
matcher, since `has_secure_token` encourages use of an index but does not
|
|
|
|
enforce it. ([#1278])
|
|
|
|
|
|
|
|
[#1278]: https://github.com/thoughtbot/shoulda-matchers/pull/1278
|
|
|
|
|
2020-02-18 02:23:52 -05:00
|
|
|
# 4.3.0
|
|
|
|
|
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add `have_rich_text` matcher for `ActionText` ([#1263])
|
|
|
|
|
|
|
|
### Improvements
|
2020-03-20 14:34:07 -04:00
|
|
|
|
2020-02-18 02:23:52 -05:00
|
|
|
* Use range on `validate_exclusion_of#in_range` documentation ([#1273])
|
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix `missing attribute:: scope 1` intermittent test: ([#1274])
|
|
|
|
|
|
|
|
[#1263]: https://github.com/thoughtbot/shoulda-matchers/pull/1263
|
|
|
|
[#1273]: https://github.com/thoughtbot/shoulda-matchers/pull/1273
|
|
|
|
[#1273]: https://github.com/thoughtbot/shoulda-matchers/pull/1274
|
|
|
|
|
2020-01-09 01:50:09 -05:00
|
|
|
# 4.2.0
|
|
|
|
|
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add support for `optional: false` in `belongs_to` associations. ([#1237])
|
|
|
|
* Add support for associations with `inverse_of: false` and non-standard foreign key ([#1106])
|
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix typos in documentation of `allow_values` ([#1241])
|
|
|
|
* Fix appraisal command in CONTRIBUTING.md file ([#1253])
|
|
|
|
|
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Remove `minitest-reporters` dependency ([#1251])
|
|
|
|
* Development dependency updates
|
|
|
|
|
|
|
|
[#1106]: https://github.com/thoughtbot/shoulda-matchers/pull/1106
|
|
|
|
[#1237]: https://github.com/thoughtbot/shoulda-matchers/pull/1237
|
|
|
|
[#1241]: https://github.com/thoughtbot/shoulda-matchers/pull/1241
|
|
|
|
[#1253]: https://github.com/thoughtbot/shoulda-matchers/pull/1253
|
|
|
|
|
2019-07-31 23:33:48 -04:00
|
|
|
# 4.1.2
|
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix another regression with `validate_presence_of` so that it works against an
|
|
|
|
attribute that has been decorated with `serialize` using a custom serializer
|
|
|
|
class. ([#1236])
|
|
|
|
|
|
|
|
[#1236]: https://github.com/thoughtbot/shoulda-matchers/pull/1236
|
|
|
|
|
2019-07-15 22:22:35 -04:00
|
|
|
# 4.1.1
|
2019-07-14 19:55:04 -04:00
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Patch some backward-incompatible changes to `validate_presence_of` that were
|
|
|
|
made in the last version. As of 4.1.0 the presence matcher now checks to
|
|
|
|
ensure that empty string will cause the record to be invalid (in addition to
|
|
|
|
nil, which it was already checking against). However, this check was being
|
|
|
|
performed even if the attribute or column the presence matcher is being run
|
|
|
|
against didn't support being set to an empty string. This releases fixes this.
|
|
|
|
([#1222], [#1224], [#1231])
|
|
|
|
|
|
|
|
[#1222]: https://github.com/thoughtbot/shoulda-matchers/pull/1222
|
|
|
|
[#1224]: https://github.com/thoughtbot/shoulda-matchers/pull/1224
|
|
|
|
[#1231]: https://github.com/thoughtbot/shoulda-matchers/pull/1231
|
|
|
|
|
2019-06-09 15:03:23 -04:00
|
|
|
# 4.1.0
|
2019-05-31 10:14:51 -04:00
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix `validate_uniqueness_of` so that it works when a scope is defined as a
|
|
|
|
string instead of a symbol on the model. ([#1176])
|
|
|
|
* Fix `have_db_index` so that it can be used against multiple models that are
|
|
|
|
connected to different databases. ([#1200])
|
|
|
|
|
|
|
|
[#1176]: https://github.com/thoughtbot/shoulda-matchers/pull/1176
|
|
|
|
[#1200]: https://github.com/thoughtbot/shoulda-matchers/pull/1200
|
|
|
|
|
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add support for Rails 6. No new Rails 6 features are supported, but only
|
|
|
|
existing features that broke with the upgrade. ([#1193])
|
|
|
|
* Add support for expression indexes (Rails 5, Postgres only) to
|
|
|
|
`have_db_index`. ([#1211])
|
2019-05-31 21:58:46 -04:00
|
|
|
* Add `allow_nil` to the `validate_presence_of` matcher. ([834d8d0], [#1100])
|
2019-05-31 10:14:51 -04:00
|
|
|
|
|
|
|
[#1193]: https://github.com/thoughtbot/shoulda-matchers/pull/1193
|
|
|
|
[#1211]: https://github.com/thoughtbot/shoulda-matchers/pull/1211
|
2019-05-31 21:58:46 -04:00
|
|
|
[834d8d0]: https://github.com/thoughtbot/shoulda-matchers/commit/834d8d0356573b9f47e63a1b910cfa8f3d815e51
|
2019-05-24 00:09:13 -04:00
|
|
|
[#1100]: https://github.com/thoughtbot/shoulda-matchers/pull/1100
|
2019-05-31 10:14:51 -04:00
|
|
|
|
2019-06-07 23:02:35 -04:00
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Update `validate_presence_of` so that if it is being used against an
|
|
|
|
association which is `required: true` or `optional: false`, or it is not
|
|
|
|
configured as such but ActiveRecord defaults `belong_to` associations to
|
|
|
|
`optional: false`, and the matcher fails, the developer is reminded in the
|
|
|
|
failure message that the `belong_to` matcher can be used instead. ([#1214],
|
|
|
|
[8697b01])
|
2019-06-09 13:53:22 -04:00
|
|
|
* Update `define_enum_for` so that it produces a more helpful message on
|
|
|
|
failure. ([#1216])
|
2019-06-07 23:02:35 -04:00
|
|
|
|
|
|
|
[#1214]: https://github.com/thoughtbot/shoulda-matchers/pull/1214
|
|
|
|
[8697b01]: https://github.com/thoughtbot/shoulda-matchers/commit/8697b015ed88fdbbbcf5d31bf98670f17c3df9e1
|
2019-06-09 13:53:22 -04:00
|
|
|
[#1216]: https://github.com/thoughtbot/shoulda-matchers/pull/1216
|
2019-06-07 23:02:35 -04:00
|
|
|
|
2019-02-26 00:10:26 -05:00
|
|
|
# 4.0.1
|
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix gemspec so that `setup` script isn't installed globally when gem is
|
|
|
|
installed. ([#1180])
|
|
|
|
|
2019-02-26 12:42:48 -05:00
|
|
|
[#1180]: https://github.com/thoughtbot/shoulda-matchers/pull/1180
|
2019-02-26 00:10:26 -05:00
|
|
|
|
|
|
|
# 4.0.0 (yanked)
|
2017-09-17 18:45:55 -04:00
|
|
|
|
|
|
|
This release mainly brings the gem up to date with modern versions of Ruby and
|
|
|
|
Rails and drops support for older, unsupported versions. The compatibility list
|
|
|
|
is now:
|
|
|
|
|
2019-01-29 01:43:47 -05:00
|
|
|
* **Ruby:** 2.6.0, 2.5.1, 2.4.4, 2.3.7
|
2019-02-16 03:31:10 -05:00
|
|
|
* **Rails:** 5.2.2, 5.1.6.1, 5.0.7, 4.2.10
|
2017-09-17 18:45:55 -04:00
|
|
|
|
|
|
|
### Backward-incompatible changes
|
|
|
|
|
2019-01-08 15:15:10 -05:00
|
|
|
* Drop support for Rails 4.0 and 4.1 as well as Ruby 2.0, 2.1, and 2.2, since
|
|
|
|
they've been end-of-lifed. The gem now supports Ruby 2.3+ and Rails 4.2+.
|
2017-09-17 18:45:55 -04:00
|
|
|
|
2017-09-17 20:51:41 -04:00
|
|
|
* `use_before_filter`, `use_after_filter`, and `use_around_filter` are no longer
|
|
|
|
usable when using shoulda-matchers under Rails 5.x, as the corresponding
|
2018-01-24 01:12:59 -05:00
|
|
|
controller callbacks don't exist there.
|
2017-09-17 20:51:41 -04:00
|
|
|
|
|
|
|
* *PR: [#1054]*
|
|
|
|
|
2018-01-28 03:22:01 -05:00
|
|
|
### Deprecations
|
|
|
|
|
|
|
|
* `define_enum_for`: `with` is deprecated in favor of `with_values`. This is to
|
|
|
|
prevent confusion with `with_prefix` and `with_suffix`, which are new.
|
|
|
|
|
2018-09-13 01:52:14 -04:00
|
|
|
* *PR: [#1077]*
|
2018-01-28 03:22:01 -05:00
|
|
|
|
2017-09-17 18:45:55 -04:00
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix association matchers when used under Rails 5.x so that they make use of
|
|
|
|
`ActiveRecord::Base.connection.data_sources` instead of
|
|
|
|
`ActiveRecord::Base.connection.tables`, which was deprecated.
|
|
|
|
|
|
|
|
* *Commit: [61c3654]*
|
|
|
|
* *PR: [#943]*
|
|
|
|
* *Original issue: [#933]*
|
|
|
|
|
|
|
|
* Fix the `serialize` matcher so that it works with Rails 5.x.
|
|
|
|
|
|
|
|
* *Commit: [df04f87]*
|
|
|
|
* *PR: [#965]*
|
|
|
|
* *Original issue: [#913]*
|
|
|
|
|
|
|
|
* Fix our custom mocking library Doublespeak, which is used by
|
|
|
|
`delegate_method`, so that it does not produce a warning under Ruby 2.4.
|
|
|
|
|
|
|
|
* *Commit: [8d7dcb8]*
|
|
|
|
* *PR: [#1038]*
|
|
|
|
* *Original issue: [#1006]*
|
|
|
|
|
2018-01-24 01:12:59 -05:00
|
|
|
* Fix the `permit` matcher so that it uses the correct method signature to call
|
|
|
|
the controller action with params in order to prevent a warning under Rails
|
|
|
|
5.x.
|
2017-09-17 18:45:55 -04:00
|
|
|
|
|
|
|
* *Commit: [ce9624b]*
|
|
|
|
* *PRs: [#989], [#964], [#917]*
|
|
|
|
* *Original issue: [#867]*
|
|
|
|
|
2018-01-24 01:12:59 -05:00
|
|
|
* Fix the `define_enum_for` matcher so that it once more allows string columns
|
|
|
|
to be used as enum attributes.
|
2018-01-24 00:06:28 -05:00
|
|
|
|
2018-01-24 01:12:59 -05:00
|
|
|
* *Commit: [5650aae]*
|
2018-01-24 00:06:28 -05:00
|
|
|
* *PR: [#1063]*
|
|
|
|
* *Original issue: [#912]*
|
|
|
|
|
2018-01-24 01:12:59 -05:00
|
|
|
* Fix `validate_uniqueness_of` when used under Rails 4.2 so that when the
|
|
|
|
attribute you're testing is a boolean column, it will no longer emit a
|
|
|
|
warning.
|
|
|
|
|
|
|
|
* *PR: [#1073]*
|
|
|
|
* *Original issue: [#949]*
|
|
|
|
|
Fix inclusion to correctly disallow outside values
The inclusion matcher, when qualified with `in_array`, was using
AllowValueMatcher to check that values outside the array were disallowed
by the model (and then inverting its result). However, it should have
been using DisallowValueMatcher all this time. This commit fixes that.
Without this fix, the following error is raised when using the inclusion
matcher against a model which does not have the proper inclusion
validation on it:
undefined method `attribute_setter' for nil:NilClass
This happens because the inclusion matcher is a complex matcher, i.e.,
it runs a series of submatchers internally and the result of those
submatchers contributes to whether or not the matcher matches. If one of
those submatchers fails, the inclusion matcher immediately fails and
spits out the failure message associated with that submatcher.
However, there is a fundamental difference between AllowValueMatcher and
DisallowValueMatcher as it relates to how they function:
* AllowValueMatcher sets an attribute to a value on a record and expects
the record not to fail validation.
* DisallowValueMatcher sets an attribute to a value on a record, but
expects the record *to* fail validation.
The issue in this case is that, because AllowValueMatcher was used
instead of DisallowValueMatcher, the inclusion matcher thought that the
AllowValueMatcher failed, when in fact it passed (this result was just
inverted). So it tried to generate a failure message for a matcher that
didn't fail in the first place. By using DisallowValueMatcher, we set
the proper expectations.
2018-09-12 01:05:06 -04:00
|
|
|
* Fix `validate_inclusion_of` so that if it fails, it will no longer blow up
|
|
|
|
with the error "undefined method \`attribute_setter' for nil:NilClass".
|
|
|
|
|
|
|
|
* *Original issue: [#904]*
|
|
|
|
|
2018-09-12 01:37:41 -04:00
|
|
|
* Add negative versions of all validation matchers (i.e. implement
|
|
|
|
`does_not_match?` for them) to prevent them from blowing up with
|
|
|
|
"undefined method \`attribute_setter' for nil:NilClass".
|
|
|
|
|
|
|
|
* *Original issue: [#904]*
|
|
|
|
|
2017-10-02 01:19:03 -04:00
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add `required` and `optional` qualifiers to `belong_to` and `have_one`
|
|
|
|
matchers. (When using the `belong_to` matcher under Rails 5+, `required` is
|
|
|
|
assumed unless overridden.)
|
|
|
|
|
2018-01-24 04:46:16 -05:00
|
|
|
* *Commit: [3af3d9f]*
|
2017-10-02 01:19:03 -04:00
|
|
|
* *Original PR: [#956]*
|
|
|
|
* *Original issues: [#870], [#861]*
|
|
|
|
|
2019-02-20 11:14:25 -05:00
|
|
|
* Add `without_validating_presence` qualifier to `belong_to` to get around the
|
Add without_presence_validation q to belong_to
With the new Rails 5 behavior, `belong_to` will check to ensure that the
association has a presence validation on it. In some cases, however,
this is not desirable. For instance, say we have this setup:
class Employee < ApplicationRecord
# Assume belongs_to_required_by_default is true
belongs_to :manager
before_validation :add_manager
private
def add_manager
self.manager = Manager.create
end
end
In this case, even though the association is effectively defined with
`required: true`, the ensuing presence validation never fails, because
`manager` is always set to something before validations kick off. So
this test won't work:
it { should belong_to(:manager) }
To get around this, this commit allows us to say:
it { should belong_to(:manager).without_presence_validation }
which instructs the matcher not to test for any presence (or absence,
for that matter) of a presence validation, mimicking the pre-Rails 5
behavior.
2019-01-29 03:19:12 -05:00
|
|
|
fact that `required` is assumed, above.
|
|
|
|
|
|
|
|
* *Original issues: [#1153], [#1154]*
|
|
|
|
|
2018-01-24 03:54:38 -05:00
|
|
|
* Add `allow_nil` qualifier to `delegate_method`.
|
|
|
|
|
2018-01-24 04:46:16 -05:00
|
|
|
* *Commit: [d49cfca]*
|
2018-01-25 23:54:34 -05:00
|
|
|
* *Original PR: [#798]*
|
2018-01-24 03:54:38 -05:00
|
|
|
|
2018-01-24 04:46:16 -05:00
|
|
|
* Add `allow_nil` qualifier to `validate_length_of`.
|
|
|
|
|
|
|
|
* *Original PR: [#724]*
|
|
|
|
|
2018-01-25 23:31:23 -05:00
|
|
|
* Add a `port` option to the `route` matcher to allow testing a route that has
|
|
|
|
a constraint on it such that only a specific port may be used to access that
|
|
|
|
route.
|
2018-01-25 22:36:00 -05:00
|
|
|
|
2018-01-25 23:54:34 -05:00
|
|
|
* *PRs: [#1074], [#1075]*
|
2018-01-25 22:36:00 -05:00
|
|
|
* *Original issue: [#954]*
|
|
|
|
|
2018-01-28 03:22:01 -05:00
|
|
|
* Add `with_prefix` and `with_suffix` to `define_enum_for` to allow testing
|
|
|
|
the `enum` macro with corresponding `prefix` and `suffix` options (Rails 5
|
|
|
|
only).
|
|
|
|
|
|
|
|
* *PR: [#1077]
|
|
|
|
* *Original issue: [#961]
|
|
|
|
|
2018-04-04 16:55:21 -04:00
|
|
|
* Add `index_errors` option to `has_many` (Rails 5 only).
|
|
|
|
|
|
|
|
* *Commit: [795ca68]*
|
|
|
|
* *PR: [#1089]*
|
|
|
|
|
2017-09-17 18:45:55 -04:00
|
|
|
[a6d09aa]: https://github.com/thoughtbot/shoulda-matchers/commit/a6d09aa5de0d546367e7b3d7177dfde6c66f7f05
|
|
|
|
[#943]: https://github.com/thoughtbot/shoulda-matchers/pulls/943
|
|
|
|
[#933]: https://github.com/thoughtbot/shoulda-matchers/issues/933
|
|
|
|
[df04f87]: https://github.com/thoughtbot/shoulda-matchers/commit/df04f8704abc3754c63c488433dac8c30573da6b
|
|
|
|
[#965]: https://github.com/thoughtbot/shoulda-matchers/pulls/965
|
|
|
|
[#913]: https://github.com/thoughtbot/shoulda-matchers/issues/913
|
|
|
|
[8d7dcb8]: https://github.com/thoughtbot/shoulda-matchers/commit/8d7dcb88c3bae8315e4107a39ae17fe19a4b6786
|
|
|
|
[#1038]: https://github.com/thoughtbot/shoulda-matchers/pulls/1038
|
|
|
|
[#1006]: httpce9624b3c5a08b9134150e228440c771d95782b7s://github.com/thoughtbot/shoulda-matchers/issues/1006
|
|
|
|
[ce9624b]: https://github.com/thoughtbot/shoulda-matchers/commit/ce9624b3c5a08b9134150e228440c771d95782b7
|
|
|
|
[#989]: https://github.com/thoughtbot/shoulda-matchers/pulls/989
|
|
|
|
[#964]: https://github.com/thoughtbot/shoulda-matchers/pulls/964
|
|
|
|
[#917]: https://github.com/thoughtbot/shoulda-matchers/pulls/917
|
|
|
|
[#867]: https://github.com/thoughtbot/shoulda-matchers/issues/867
|
2017-09-17 20:51:41 -04:00
|
|
|
[#1054]: https://github.com/thoughtbot/shoulda-matchers/pulls/1054
|
2018-01-24 01:12:59 -05:00
|
|
|
[5650aae]: https://github.com/thoughtbot/shoulda-matchers/commit/5650aae35de85aeabd75bc544324fda33ce1a092
|
2018-01-24 00:06:28 -05:00
|
|
|
[#1063]: https://github.com/thoughtbot/shoulda-matchers/pulls/1063
|
|
|
|
[#912]: https://github.com/thoughtbot/shoulda-matchers/issues/912
|
2018-01-24 01:12:59 -05:00
|
|
|
[#1073]: https://github.com/thoughtbot/shoulda-matchers/pulls/1073
|
|
|
|
[#949]: https://github.com/thoughtbot/shoulda-matchers/issues/949
|
2018-01-24 04:46:16 -05:00
|
|
|
[d49cfca]: https://github.com/thoughtbot/shoulda-matchers/commit/d49cfcae1b294e12a05e06a5612cb8ebb22a7df1
|
2018-01-25 23:54:34 -05:00
|
|
|
[#798]: https://github.com/thoughtbot/shoulda-matchers/pulls/798
|
2018-01-24 04:46:16 -05:00
|
|
|
[#724]: https://github.com/thoughtbot/shoulda-matchers/issues/724
|
|
|
|
[d49cfca]: https://github.com/thoughtbot/shoulda-matchers/commit/d49cfcae1b294e12a05e06a5612cb8ebb22a7df1
|
|
|
|
[3af3d9f]: https://github.com/thoughtbot/shoulda-matchers/commit/3af3d9f7abb768c063759941724ccae48c7b76d6
|
|
|
|
[#956]: https://github.com/thoughtbot/shoulda-matchers/pulls/956
|
|
|
|
[#870]: https://github.com/thoughtbot/shoulda-matchers/issues/870
|
|
|
|
[#861]: https://github.com/thoughtbot/shoulda-matchers/issues/861
|
Add without_presence_validation q to belong_to
With the new Rails 5 behavior, `belong_to` will check to ensure that the
association has a presence validation on it. In some cases, however,
this is not desirable. For instance, say we have this setup:
class Employee < ApplicationRecord
# Assume belongs_to_required_by_default is true
belongs_to :manager
before_validation :add_manager
private
def add_manager
self.manager = Manager.create
end
end
In this case, even though the association is effectively defined with
`required: true`, the ensuing presence validation never fails, because
`manager` is always set to something before validations kick off. So
this test won't work:
it { should belong_to(:manager) }
To get around this, this commit allows us to say:
it { should belong_to(:manager).without_presence_validation }
which instructs the matcher not to test for any presence (or absence,
for that matter) of a presence validation, mimicking the pre-Rails 5
behavior.
2019-01-29 03:19:12 -05:00
|
|
|
[#1153]: https://github.com/thoughtbot/shoulda-matchers/issues/1153
|
|
|
|
[#1154]: https://github.com/thoughtbot/shoulda-matchers/issues/1154
|
2018-01-25 22:36:00 -05:00
|
|
|
[#954]: https://github.com/thoughtbot/shoulda-matchers/issues/954
|
2018-01-25 23:54:34 -05:00
|
|
|
[#1074]: https://github.com/thoughtbot/shoulda-matchers/pulls/1074
|
|
|
|
[#1075]: https://github.com/thoughtbot/shoulda-matchers/pulls/1075
|
2018-01-28 03:22:01 -05:00
|
|
|
[#1077]: https://github.com/thoughtbot/shoulda-matchers/pulls/1077
|
|
|
|
[#961]: https://github.com/thoughtbot/shoulda-matchers/issues/961
|
2018-04-04 16:55:21 -04:00
|
|
|
[795ca68]: https://github.com/thoughtbot/shoulda-matchers/commit/795ca688bff08590dbd2ab6f2b51ea415e0c7473
|
|
|
|
[#1089]: https://github.com/thoughtbot/shoulda-matchers/pulls/1089
|
Fix inclusion to correctly disallow outside values
The inclusion matcher, when qualified with `in_array`, was using
AllowValueMatcher to check that values outside the array were disallowed
by the model (and then inverting its result). However, it should have
been using DisallowValueMatcher all this time. This commit fixes that.
Without this fix, the following error is raised when using the inclusion
matcher against a model which does not have the proper inclusion
validation on it:
undefined method `attribute_setter' for nil:NilClass
This happens because the inclusion matcher is a complex matcher, i.e.,
it runs a series of submatchers internally and the result of those
submatchers contributes to whether or not the matcher matches. If one of
those submatchers fails, the inclusion matcher immediately fails and
spits out the failure message associated with that submatcher.
However, there is a fundamental difference between AllowValueMatcher and
DisallowValueMatcher as it relates to how they function:
* AllowValueMatcher sets an attribute to a value on a record and expects
the record not to fail validation.
* DisallowValueMatcher sets an attribute to a value on a record, but
expects the record *to* fail validation.
The issue in this case is that, because AllowValueMatcher was used
instead of DisallowValueMatcher, the inclusion matcher thought that the
AllowValueMatcher failed, when in fact it passed (this result was just
inverted). So it tried to generate a failure message for a matcher that
didn't fail in the first place. By using DisallowValueMatcher, we set
the proper expectations.
2018-09-12 01:05:06 -04:00
|
|
|
[#904]: https://github.com/thoughtbot/shoulda-matchers/issues/904
|
2017-09-17 18:45:55 -04:00
|
|
|
|
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Replace usage of Fixnum with Integer to prevent Ruby 2.4 from emitting
|
|
|
|
deprecation warnings.
|
|
|
|
|
2018-09-13 01:52:14 -04:00
|
|
|
* *Commits: [61c3654], [03a1d21]*
|
|
|
|
* *PRs: [#1040], [#1031], [#1009]*
|
|
|
|
* *Original issue: [#1001]*
|
2017-09-17 18:45:55 -04:00
|
|
|
|
|
|
|
[61c3654]: https://github.com/thoughtbot/shoulda-matchers/commit/61c365416a09c5cffd7fcb774a07de4abf8e9afd
|
2017-10-03 01:18:55 -04:00
|
|
|
[03a1d21]: https://github.com/thoughtbot/shoulda-matchers/commit/03a1d213805a44a0aec99857e01cab8524aa0c05
|
|
|
|
[#1040]: https://github.com/thoughtbot/shoulda-matchers/pulls/1040
|
|
|
|
[#1031]: https://github.com/thoughtbot/shoulda-matchers/pulls/1031
|
2017-09-17 18:45:55 -04:00
|
|
|
[#1009]: https://github.com/thoughtbot/shoulda-matchers/pulls/1009
|
|
|
|
[#1001]: https://github.com/thoughtbot/shoulda-matchers/issues/1001
|
|
|
|
|
2019-01-18 13:24:06 -05:00
|
|
|
# 3.1.3
|
|
|
|
|
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Update `BigDecimal.new()` to use `BigDecimal()` and avoid deprecation warnings
|
|
|
|
in Ruby 2.6.
|
|
|
|
|
2016-11-22 17:12:54 -05:00
|
|
|
# 3.1.2
|
|
|
|
|
2017-07-12 14:02:02 -04:00
|
|
|
### Deprecations
|
|
|
|
|
2017-09-17 18:45:55 -04:00
|
|
|
* This is the **last version** that supports Rails 4.0 and 4.1 and Ruby 2.0 and
|
|
|
|
2.1.
|
2017-07-12 14:02:02 -04:00
|
|
|
|
2016-11-22 17:12:54 -05:00
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* When the `permit` matcher was used without `#on`, the controller did not use
|
|
|
|
`params#require`, the params object was duplicated, and the matcher did not
|
|
|
|
recognize the `#permit` call inside the controller. This behavior happened
|
|
|
|
because the matcher overwrote double registries with the same parameter hash
|
|
|
|
whenever ActionController::Parameters was instantiated.
|
|
|
|
|
|
|
|
* *Commit: [44c019]*
|
|
|
|
* *Issue: [#899]*
|
|
|
|
* *Pull request: [#902]*
|
|
|
|
|
2017-09-17 18:45:55 -04:00
|
|
|
[44c019]: https://github.com/thoughtbot/shoulda-matchers/commit/44c0198830921650af3b4a56f5d72aaae2168480
|
|
|
|
[#899]: https://github.com/thoughtbot/shoulda-matchers/issues/899
|
|
|
|
[#902]: https://github.com/thoughtbot/shoulda-matchers/pulls/902
|
|
|
|
|
2016-01-28 02:20:45 -05:00
|
|
|
# 3.1.1
|
2016-01-11 15:33:57 -05:00
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Some matchers make use of ActiveSupport's `in?` method, but do not include the
|
|
|
|
file where this is defined in ActiveSupport. This causes problems with
|
|
|
|
projects using shoulda-matchers that do not include all of ActiveSupport by
|
|
|
|
default. To fix this, replace `in?` with Ruby's builtin `include?`.
|
|
|
|
|
2016-01-18 13:57:25 -05:00
|
|
|
* *Pull request: [#879]*
|
|
|
|
|
2016-01-16 12:20:44 -05:00
|
|
|
* `validate_uniqueness_of` works by creating a record if it doesn't exist, and
|
|
|
|
then testing against a new record with various attributes set that are equal
|
|
|
|
to (or different than) corresponding attributes in the existing record. In
|
|
|
|
3.1.0 a change was made whereby when the uniqueness matcher is given a new
|
|
|
|
record and creates an existing record out of it, it ensures that the record is
|
|
|
|
valid before continuing on. This created a problem because if the subject,
|
|
|
|
before it was saved, was empty and therefore in an invalid state, it could not
|
|
|
|
effectively be saved. While ideally this should be enforced, doing so would be
|
|
|
|
a backward-incompatible change, so this behavior has been rolled back.
|
2016-01-18 13:57:25 -05:00
|
|
|
([#880], [#884], [#885])
|
|
|
|
|
2016-01-28 01:46:30 -05:00
|
|
|
* *Commit: [45de869]*
|
2016-01-28 01:44:19 -05:00
|
|
|
* *Issues: [#880], [#884], [#885]*
|
2016-01-18 13:57:25 -05:00
|
|
|
|
Support multiple uniq validations on same attr
It turns out that you can have multiple uniqueness validations on the
same attribute. This is useful if you want the attribute to be unique
under different sets of scopes. For instance:
```
class CalibrationConstantVersion < ActiveRecord::Base
validates_uniqueness_of(
:calibration_constant,
scope: [:name]
)
validates_uniqueness_of(
:calibration_constant,
scope: [:begin_at, :physical_device_id]
)
end
```
So if you have a test like this:
```
describe CalibrationConstantVersion do
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:name).
case_insensitive
end
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:begin_at, :physical_device_id)
end
end
```
the first test will fail because the matcher doesn't know that
:calibration_constant is supposed to be unique relative to :begin_at and
:physical_device_id, and the second test will fail because it doesn't
know :calibration_constant is supposed to be unique relative to :name.
Now, in order to properly fix this, we'll need to add another matcher.
However, for the time being we *can* fix the following case:
```
class CalibrationConstantVersion < ActiveRecord::Base
validates_uniqueness_of(
:calibration_constant,
scope: [:name],
message: 'first message'
)
validates_uniqueness_of(
:calibration_constant,
scope: [:begin_at, :physical_device_id],
message: 'second message'
)
end
describe CalibrationConstantVersion do
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:name).
with_message('first message')
end
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:begin_at, :physical_device_id).
with_message('second message')
end
end
```
These tests also fail, but for a different reason. One of the checks we
make is to compare the list of scopes you've provided with the list of
scopes that are actually on the validation. Notice I said "validation"
-- we don't expect there to be multiple, we just look for the first
uniqueness validation that's on the attribute in question. So in this
case, the first test will pass, but the second test will fail, because
it thinks all that :calibration_constant is scoped to is :name.
2016-01-28 00:35:01 -05:00
|
|
|
* Fix an issue with `validate_uniqueness_of` + `scoped_to` when used against a
|
|
|
|
model where the attribute has multiple uniqueness validations and each
|
|
|
|
validation has a different set of scopes. In this case, a test written for the
|
|
|
|
first validation (and its scopes) would pass, but tests for the other
|
|
|
|
validations (and their scopes) would not, as the matcher only considered the
|
|
|
|
first set of scopes as the *actual* set of scopes.
|
|
|
|
|
2016-01-28 01:46:30 -05:00
|
|
|
* *Commit: [28bd9a1]*
|
2016-01-28 01:44:19 -05:00
|
|
|
* *Issues: [#830]*
|
Support multiple uniq validations on same attr
It turns out that you can have multiple uniqueness validations on the
same attribute. This is useful if you want the attribute to be unique
under different sets of scopes. For instance:
```
class CalibrationConstantVersion < ActiveRecord::Base
validates_uniqueness_of(
:calibration_constant,
scope: [:name]
)
validates_uniqueness_of(
:calibration_constant,
scope: [:begin_at, :physical_device_id]
)
end
```
So if you have a test like this:
```
describe CalibrationConstantVersion do
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:name).
case_insensitive
end
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:begin_at, :physical_device_id)
end
end
```
the first test will fail because the matcher doesn't know that
:calibration_constant is supposed to be unique relative to :begin_at and
:physical_device_id, and the second test will fail because it doesn't
know :calibration_constant is supposed to be unique relative to :name.
Now, in order to properly fix this, we'll need to add another matcher.
However, for the time being we *can* fix the following case:
```
class CalibrationConstantVersion < ActiveRecord::Base
validates_uniqueness_of(
:calibration_constant,
scope: [:name],
message: 'first message'
)
validates_uniqueness_of(
:calibration_constant,
scope: [:begin_at, :physical_device_id],
message: 'second message'
)
end
describe CalibrationConstantVersion do
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:name).
with_message('first message')
end
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:begin_at, :physical_device_id).
with_message('second message')
end
end
```
These tests also fail, but for a different reason. One of the checks we
make is to compare the list of scopes you've provided with the list of
scopes that are actually on the validation. Notice I said "validation"
-- we don't expect there to be multiple, we just look for the first
uniqueness validation that's on the attribute in question. So in this
case, the first test will pass, but the second test will fail, because
it thinks all that :calibration_constant is scoped to is :name.
2016-01-28 00:35:01 -05:00
|
|
|
|
2016-01-18 13:57:25 -05:00
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Update `validate_uniqueness_of` so that if an existing record fails to be
|
|
|
|
created because a column is non-nullable and was not filled in, raise an
|
|
|
|
ExistingRecordInvalid exception with details on how to fix the test.
|
|
|
|
|
2016-01-28 01:46:30 -05:00
|
|
|
* *Commit: [78ccfc5]*
|
2016-01-18 13:57:25 -05:00
|
|
|
|
|
|
|
[#879]: https://github.com/thoughtbot/shoulda-matchers/issues/879
|
|
|
|
[45de869]: https://github.com/thoughtbot/shoulda-matchers/commit/45de8698487d57f559c5bf35818d1c1ee82b0e77
|
|
|
|
[#880]: https://github.com/thoughtbot/shoulda-matchers/issues/880
|
|
|
|
[#884]: https://github.com/thoughtbot/shoulda-matchers/issues/884
|
|
|
|
[#885]: https://github.com/thoughtbot/shoulda-matchers/issues/885
|
|
|
|
[78ccfc5]: https://github.com/thoughtbot/shoulda-matchers/commit/78ccfc50b52fa686c109d614df66744b0da65380
|
2016-01-28 01:44:19 -05:00
|
|
|
[28bd9a1]: https://github.com/thoughtbot/shoulda-matchers/commit/28bd9a10c71af4d541b692d6204163c394ebd33c
|
Support multiple uniq validations on same attr
It turns out that you can have multiple uniqueness validations on the
same attribute. This is useful if you want the attribute to be unique
under different sets of scopes. For instance:
```
class CalibrationConstantVersion < ActiveRecord::Base
validates_uniqueness_of(
:calibration_constant,
scope: [:name]
)
validates_uniqueness_of(
:calibration_constant,
scope: [:begin_at, :physical_device_id]
)
end
```
So if you have a test like this:
```
describe CalibrationConstantVersion do
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:name).
case_insensitive
end
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:begin_at, :physical_device_id)
end
end
```
the first test will fail because the matcher doesn't know that
:calibration_constant is supposed to be unique relative to :begin_at and
:physical_device_id, and the second test will fail because it doesn't
know :calibration_constant is supposed to be unique relative to :name.
Now, in order to properly fix this, we'll need to add another matcher.
However, for the time being we *can* fix the following case:
```
class CalibrationConstantVersion < ActiveRecord::Base
validates_uniqueness_of(
:calibration_constant,
scope: [:name],
message: 'first message'
)
validates_uniqueness_of(
:calibration_constant,
scope: [:begin_at, :physical_device_id],
message: 'second message'
)
end
describe CalibrationConstantVersion do
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:name).
with_message('first message')
end
it do
should validate_uniqueness_of(:calibration_constant).
scoped_to(:begin_at, :physical_device_id).
with_message('second message')
end
end
```
These tests also fail, but for a different reason. One of the checks we
make is to compare the list of scopes you've provided with the list of
scopes that are actually on the validation. Notice I said "validation"
-- we don't expect there to be multiple, we just look for the first
uniqueness validation that's on the attribute in question. So in this
case, the first test will pass, but the second test will fail, because
it thinks all that :calibration_constant is scoped to is :name.
2016-01-28 00:35:01 -05:00
|
|
|
[#830]: https://github.com/thoughtbot/shoulda-matchers/issues/830
|
2016-01-16 12:20:44 -05:00
|
|
|
|
2016-01-11 01:22:30 -05:00
|
|
|
# 3.1.0
|
2015-12-13 20:19:29 -05:00
|
|
|
|
2015-12-30 13:55:17 -05:00
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Update `validate_numericality_of` so that submatchers are applied lazily
|
|
|
|
instead of immediately. Previously, qualifiers were order-dependent, meaning
|
|
|
|
that if you used `strict` before you used, say, `odd`, then `strict` wouldn't
|
|
|
|
actually apply to `odd`. Now the order that you specify qualifiers doesn't
|
|
|
|
matter.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [6c67a5e]*
|
|
|
|
|
2015-12-30 13:55:17 -05:00
|
|
|
* Fix `allow_value` so that it does not raise an AttributeChangedValueError
|
|
|
|
(formerly CouldNotSetAttributeError) when used against an attribute that is an
|
|
|
|
enum in an ActiveRecord model.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [9e8603e]*
|
|
|
|
|
Add ignoring_interference_by_writer to all matchers
`allow_value` matcher is, of course, concerned with setting values on a
particular attribute on a particular record, and then checking that the
record is valid after doing so. That comes with a caveat: if the
attribute is overridden in such a way so that the same value going into
the attribute isn't the same value coming out of it, then `allow_value`
will balk -- it'll say, "I can't do that because that changes how I
work."
That's all well and good, but what the attribute intentionally changes
incoming values? ActiveRecord's typecasting behavior, for instance,
would trigger such an exception. What if the developer needs a way to
get around this? This is where `ignoring_interference_by_writer` comes
into play. You can tack it on to the end of the matcher, and you're free
to go on your way.
So, prior to this commit you could already apply it to `allow_value`,
but now in this commit it also works on any other matcher.
But, one little thing: sometimes using this qualifier isn't going to
work. Perhaps you or something else actually *is* overriding the
attribute to change incoming values in a specific way, and perhaps the
value that comes out makes the record fail validation, and there's
nothing you can do about it. So in this case, even if you're using
`ignoring_interference_by_writer`, we want to inform you about what the
attribute is doing -- what the input and output was. And so we do.
2015-12-30 20:47:46 -05:00
|
|
|
* Add a `ignoring_interference_by_writer` qualifier to all matchers, not just
|
2016-01-05 00:45:48 -05:00
|
|
|
`allow_value`. *This is enabled by default, which means that you should never
|
|
|
|
get a CouldNotSetAttributeError again.* (You may get some more information if
|
|
|
|
a test fails, however.)
|
Add ignoring_interference_by_writer to all matchers
`allow_value` matcher is, of course, concerned with setting values on a
particular attribute on a particular record, and then checking that the
record is valid after doing so. That comes with a caveat: if the
attribute is overridden in such a way so that the same value going into
the attribute isn't the same value coming out of it, then `allow_value`
will balk -- it'll say, "I can't do that because that changes how I
work."
That's all well and good, but what the attribute intentionally changes
incoming values? ActiveRecord's typecasting behavior, for instance,
would trigger such an exception. What if the developer needs a way to
get around this? This is where `ignoring_interference_by_writer` comes
into play. You can tack it on to the end of the matcher, and you're free
to go on your way.
So, prior to this commit you could already apply it to `allow_value`,
but now in this commit it also works on any other matcher.
But, one little thing: sometimes using this qualifier isn't going to
work. Perhaps you or something else actually *is* overriding the
attribute to change incoming values in a specific way, and perhaps the
value that comes out makes the record fail validation, and there's
nothing you can do about it. So in this case, even if you're using
`ignoring_interference_by_writer`, we want to inform you about what the
attribute is doing -- what the input and output was. And so we do.
2015-12-30 20:47:46 -05:00
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [1189934], [5532f43]*
|
|
|
|
* *Fixes: [#786], [#799], [#801], [#804], [#817], [#841], [#849], [#872],
|
|
|
|
[#873], and [#874]*
|
|
|
|
|
2015-10-28 13:01:26 -04:00
|
|
|
* Fix `validate_numericality_of` so that it does not blow up when used against
|
|
|
|
a virtual attribute defined in an ActiveRecord model (that is, an attribute
|
|
|
|
that is not present in the database but is defined using `attr_accessor`).
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [#822]*
|
|
|
|
|
|
|
|
* Update `validate_numericality_of` so that it no longer raises an
|
|
|
|
IneffectiveTestError if used against a numeric column.
|
|
|
|
|
|
|
|
* *Source: [5ed0362]*
|
|
|
|
* *Fixes: [#832]*
|
|
|
|
|
|
|
|
[6c67a5e]: https://github.com/thoughtbot/shoulda-matchers/commit/6c67a5eb0df265d3a565aa7d1a7e2b645051eb5a
|
|
|
|
[9e8603e]: https://github.com/thoughtbot/shoulda-matchers/commit/9e8603eb745bfa2a5aea6dfef85adf680d447151
|
|
|
|
[1189934]: https://github.com/thoughtbot/shoulda-matchers/commit/118993480604d39c73687d069f7af3726f3e3f3e
|
|
|
|
[5532f43]: https://github.com/thoughtbot/shoulda-matchers/commit/5532f4359aa332b10de7d46f876eaffd4a95b5b6
|
|
|
|
[#786]: https://github.com/thoughtbot/shoulda-matchers/issues/786
|
|
|
|
[#799]: https://github.com/thoughtbot/shoulda-matchers/issues/799
|
|
|
|
[#801]: https://github.com/thoughtbot/shoulda-matchers/issues/801
|
|
|
|
[#804]: https://github.com/thoughtbot/shoulda-matchers/issues/804
|
|
|
|
[#817]: https://github.com/thoughtbot/shoulda-matchers/issues/817
|
|
|
|
[#841]: https://github.com/thoughtbot/shoulda-matchers/issues/841
|
|
|
|
[#849]: https://github.com/thoughtbot/shoulda-matchers/issues/849
|
|
|
|
[#872]: https://github.com/thoughtbot/shoulda-matchers/issues/872
|
|
|
|
[#873]: https://github.com/thoughtbot/shoulda-matchers/issues/873
|
|
|
|
[#874]: https://github.com/thoughtbot/shoulda-matchers/issues/874
|
|
|
|
[#822]: https://github.com/thoughtbot/shoulda-matchers/pull/822
|
|
|
|
[5ed0362]: https://github.com/thoughtbot/shoulda-matchers/commit/5ed03624197314865ff5463e473e5e84bb91d9ea
|
|
|
|
[#832]: https://github.com/thoughtbot/shoulda-matchers/issues/832
|
2016-01-10 01:15:03 -05:00
|
|
|
|
2015-11-12 18:07:03 -05:00
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add a new qualifier, `ignoring_case_sensitivity`, to `validate_uniqueness_of`.
|
|
|
|
This provides a way to test uniqueness of an attribute whose case is
|
|
|
|
normalized, either in a custom writer method for that attribute, or in a
|
|
|
|
custom `before_validation` callback.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [#840]*
|
|
|
|
* *Fixes: [#836]*
|
|
|
|
|
|
|
|
[#840]: https://github.com/thoughtbot/shoulda-matchers/pull/840
|
|
|
|
[#836]: https://github.com/thoughtbot/shoulda-matchers/issues/836
|
|
|
|
|
2015-12-13 20:19:29 -05:00
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Improve failure messages and descriptions of all matchers across the board so
|
|
|
|
that it is easier to understand what the matcher was doing when it failed.
|
|
|
|
(You'll see a huge difference in the output of the numericality and uniqueness
|
|
|
|
matchers in particular.)
|
|
|
|
|
2015-12-31 00:32:43 -05:00
|
|
|
* Matchers now raise an error if any attributes that the matcher is attempting
|
|
|
|
to set do not exist on the model.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [2962112]*
|
|
|
|
|
2015-12-31 00:32:43 -05:00
|
|
|
* Update `validate_numericality_of` so that it doesn't always run all of the
|
|
|
|
submatchers, but stops on the first one that fails. Since failure messages
|
|
|
|
now contain information as to what value the matcher set on the attribute when
|
|
|
|
it failed, this change guarantees that the correct value will be shown.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [8e24a6e]*
|
|
|
|
|
2016-01-05 00:45:48 -05:00
|
|
|
* Continue to detect if attributes change incoming values, but now instead of
|
|
|
|
immediately seeing a CouldNotSetAttributeError, you will only be informed
|
|
|
|
about it if the test you've written fails.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [1189934]*
|
2016-01-05 23:30:21 -05:00
|
|
|
|
2015-11-02 09:26:02 -05:00
|
|
|
* Add an additional check to `define_enum_for` to ensure that the column that
|
|
|
|
underlies the enum attribute you're testing is an integer column.
|
|
|
|
|
2016-01-11 01:11:32 -05:00
|
|
|
* *Source: [68dd70a]*
|
|
|
|
|
|
|
|
* Add a test for `validate_numericality_of` so that it officially supports money
|
|
|
|
columns.
|
|
|
|
|
|
|
|
* *Source: [a559713]*
|
|
|
|
* *Refs: [#841]*
|
|
|
|
|
|
|
|
[2962112]: https://github.com/thoughtbot/shoulda-matchers/commit/296211211497e624dde87adae68b385ad4cdae3a
|
|
|
|
[8e24a6e]: https://github.com/thoughtbot/shoulda-matchers/commit/8e24a6e9b2b147f2c51fb03aa02543f213acab34
|
|
|
|
[68dd70a]: https://github.com/thoughtbot/shoulda-matchers/commit/68dd70a23d8997a490683adcd2108a4a5cadf8ba
|
|
|
|
[a559713]: https://github.com/thoughtbot/shoulda-matchers/commit/a559713f96303414551c0bc1767fb11eb19bcc5d
|
|
|
|
|
2015-10-23 16:42:10 -04:00
|
|
|
# 3.0.1
|
2015-10-04 18:25:32 -04:00
|
|
|
|
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* Fix `validate_inclusion_of` + `in_array` when used against a date or datetime
|
2015-10-04 19:03:55 -04:00
|
|
|
column/attribute so that it does not raise a CouldNotSetAttributeError.
|
2015-10-07 01:12:30 -04:00
|
|
|
([#783], [8fa97b4])
|
|
|
|
|
|
|
|
* Fix `validate_numericality_of` when used against a numeric column so that it
|
|
|
|
no longer raises a CouldNotSetAttributeError if the matcher has been qualified
|
2015-10-23 16:40:28 -04:00
|
|
|
in any way (`only_integer`, `greater_than`, `odd`, etc.). ([#784], [#812])
|
2015-10-08 22:39:38 -04:00
|
|
|
|
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* `validate_uniqueness_of` now raises a NonCaseSwappableValueError if the value
|
|
|
|
the matcher is using to test uniqueness cannot be case-swapped -- in other
|
|
|
|
words, if it doesn't contain any alpha characters. When this is the case, the
|
2015-10-07 01:12:30 -04:00
|
|
|
matcher cannot work effectively. ([#789], [ada9bd3])
|
2015-10-08 22:39:38 -04:00
|
|
|
|
2015-10-07 01:12:30 -04:00
|
|
|
[#783]: https://github.com/thoughtbot/shoulda-matchers/pull/783
|
2015-10-08 22:39:38 -04:00
|
|
|
[8fa97b4]: https://github.com/thoughtbot/shoulda-matchers/commit/8fa97b4ff33b57ce16dfb96be1ec892502f2aa9e
|
2015-10-07 01:12:30 -04:00
|
|
|
[#784]: https://github.com/thoughtbot/shoulda-matchers/pull/784
|
|
|
|
[#789]: https://github.com/thoughtbot/shoulda-matchers/pull/789
|
|
|
|
[ada9bd3]: https://github.com/thoughtbot/shoulda-matchers/commit/ada9bd3a1b9f2bb9fa74d0dfe1f8f7080314298c
|
2015-10-23 16:40:28 -04:00
|
|
|
[#812]: https://github.com/thoughtbot/shoulda-matchers/pull/812
|
2015-10-04 18:25:32 -04:00
|
|
|
|
2015-09-30 16:08:34 -04:00
|
|
|
# 3.0.0
|
2014-10-22 03:18:54 -04:00
|
|
|
|
|
|
|
### Backward-incompatible changes
|
|
|
|
|
2015-05-22 12:48:42 -04:00
|
|
|
* We've dropped support for Rails 3.x, Ruby 1.9.2, and Ruby 1.9.3, and RSpec 2.
|
Fix #permit so #on works and is properly tested
Why:
* When using #permit with the #on qualifier to assert that #permit was
called on a subset of the params hash (selected using #require), the
matcher would fail. The matcher didn't properly detect that #permit
was called on the slice -- it thought it was called on the parent
params object.
* It turns out this was a bug in Doublespeak. When #require is called,
we take the subset of the params, which is also an
ActionController::Parameters object like params, and we stub #permit
on it at runtime. Unfortunately the Double object created here was
never activated, so when #permit was called, this Double wasn't the
one run. Instead, the Double on #permit within the
ActionController::Parameters class (which is stubbed at the beginning)
was the one that was run, and it's this object that recorded the call
on #permit incorrectly.
* This bug slipped through because it turns out when #on was added it
wasn't tested very well.
To satisfy the above:
* Modify Doublespeak so that when it is in activated mode, whenever
new doubles are created, activate them immediately.
* Fix all of the tests for #permit around operating on a slice of the
params hash so that they use the #on qualifier.
2015-09-28 18:48:14 -04:00
|
|
|
All of these have been end-of-lifed. ([a4045a1], [b7fe87a], [32c0e62])
|
2015-05-22 12:48:42 -04:00
|
|
|
|
|
|
|
* The gem no longer detects the test framework you're using or mixes itself into
|
|
|
|
that framework automatically. [History][no-auto-integration-1] has
|
|
|
|
[shown][no-auto-integration-2] that performing any kind of detection is prone
|
|
|
|
to bugs and more complicated than it should be.
|
|
|
|
|
|
|
|
Here are the updated instructions:
|
|
|
|
|
|
|
|
* You no longer need to say `require: false` in your Gemfile; you can
|
|
|
|
include the gem as normal.
|
|
|
|
* You'll need to add the following somewhere in your `rails_helper` (for
|
|
|
|
RSpec) or `test_helper` (for Minitest / Test::Unit):
|
2015-05-07 00:43:35 -04:00
|
|
|
|
2015-05-22 12:48:42 -04:00
|
|
|
``` ruby
|
|
|
|
Shoulda::Matchers.configure do |config|
|
|
|
|
config.integrate do |with|
|
|
|
|
# Choose a test framework:
|
|
|
|
with.test_framework :rspec
|
|
|
|
with.test_framework :minitest
|
|
|
|
with.test_framework :minitest_4
|
|
|
|
with.test_framework :test_unit
|
|
|
|
|
2015-05-07 00:43:35 -04:00
|
|
|
# Choose one or more libraries:
|
2015-05-22 12:48:42 -04:00
|
|
|
with.library :active_record
|
|
|
|
with.library :active_model
|
|
|
|
with.library :action_controller
|
2015-05-07 00:43:35 -04:00
|
|
|
# Or, choose the following (which implies all of the above):
|
2015-05-22 12:48:42 -04:00
|
|
|
with.library :rails
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
([1900071])
|
|
|
|
|
2015-09-25 19:51:47 -04:00
|
|
|
* Previously, under RSpec, all of the matchers were mixed into all of the
|
|
|
|
example groups. This created a problem because some gems, such as
|
|
|
|
[active_model_serializers-matchers], provide matchers that share the same
|
|
|
|
name as some of our own matchers. Now, matchers are only mixed into whichever
|
|
|
|
example group they belong to:
|
|
|
|
|
|
|
|
* ActiveModel and ActiveRecord matchers are available only in model example
|
|
|
|
groups.
|
|
|
|
* ActionController matchers are available only in controller example groups.
|
|
|
|
* The `route` matcher is available only in routing example groups.
|
|
|
|
|
|
|
|
([af98a23], [8cf449b])
|
|
|
|
|
2015-05-22 12:48:42 -04:00
|
|
|
* There are two changes to `allow_value`:
|
|
|
|
|
Tighten CouldNotSetAttributeError restriction
Why:
* Previously, `allow_value` would raise a CouldNotSetAttributeError
if the value being set didn't match the value the attribute had after
being set, but only if the attribute was being changed from nil to
non-nil or non-nil to nil.
* It turns out it doesn't matter which value you're trying to set the
attribute to -- if the attribute rejects that change it's confusing
either way. (In fact, I was recently bit by a case in which I was
trying to validate numericality of an attribute, where the writer
method for that attribute was overridden to ensure that the attribute
always stored a number and never contained non-number characters.
This ended up making the numericality validation useless, of
course -- but it caused confusion because the test acted in a way
I didn't expect.)
To satisfy the above:
* `allow_value` now raises a CouldNotSetAttributeError if the attribute
rejects the value being set in *any* way.
* However, add a `ignoring_interference_by_writer` qualifier so that
it is possible to manually override this behavior.
* Fix tests that are failing now because of this new change:
* Fix tests for allow_value matcher
* Fix tests for numericality matcher
* Remove tests for numericality matcher + integer column
* An integer column will typecast any non-integer value to an
integer.
* Because of the typecasting, our tests for the numericality matcher
against an integer column don't quite work, because we can't
really test what happens when the attribute is set to a
non-integer value. Now that `allow_value` is more strict, we're
getting a CouldNotSetAttributeError when attempting to do so.
* The tests mentioned were originally added to ensure that we are
handling RangeErrors that ActiveRecord used to emit. This doesn't
happen anymore, so the tests aren't necessary anymore either.
* Fix tests for acceptance matcher
* Fix tests for absence matcher
2015-09-26 01:10:00 -04:00
|
|
|
* The negative form of `allow_value` has been changed so that instead of
|
2015-05-22 12:48:42 -04:00
|
|
|
asserting that any of the given values is an invalid value (allowing good
|
|
|
|
values to pass through), assert that *all* values are invalid values
|
|
|
|
(allowing good values not to pass through). This means that this test which
|
|
|
|
formerly passed will now fail:
|
|
|
|
|
Tighten CouldNotSetAttributeError restriction
Why:
* Previously, `allow_value` would raise a CouldNotSetAttributeError
if the value being set didn't match the value the attribute had after
being set, but only if the attribute was being changed from nil to
non-nil or non-nil to nil.
* It turns out it doesn't matter which value you're trying to set the
attribute to -- if the attribute rejects that change it's confusing
either way. (In fact, I was recently bit by a case in which I was
trying to validate numericality of an attribute, where the writer
method for that attribute was overridden to ensure that the attribute
always stored a number and never contained non-number characters.
This ended up making the numericality validation useless, of
course -- but it caused confusion because the test acted in a way
I didn't expect.)
To satisfy the above:
* `allow_value` now raises a CouldNotSetAttributeError if the attribute
rejects the value being set in *any* way.
* However, add a `ignoring_interference_by_writer` qualifier so that
it is possible to manually override this behavior.
* Fix tests that are failing now because of this new change:
* Fix tests for allow_value matcher
* Fix tests for numericality matcher
* Remove tests for numericality matcher + integer column
* An integer column will typecast any non-integer value to an
integer.
* Because of the typecasting, our tests for the numericality matcher
against an integer column don't quite work, because we can't
really test what happens when the attribute is set to a
non-integer value. Now that `allow_value` is more strict, we're
getting a CouldNotSetAttributeError when attempting to do so.
* The tests mentioned were originally added to ensure that we are
handling RangeErrors that ActiveRecord used to emit. This doesn't
happen anymore, so the tests aren't necessary anymore either.
* Fix tests for acceptance matcher
* Fix tests for absence matcher
2015-09-26 01:10:00 -04:00
|
|
|
``` ruby
|
|
|
|
expect(record).not_to allow_value('good value', *bad_values)
|
|
|
|
```
|
2015-05-22 12:48:42 -04:00
|
|
|
|
|
|
|
([19ce8a6])
|
|
|
|
|
Tighten CouldNotSetAttributeError restriction
Why:
* Previously, `allow_value` would raise a CouldNotSetAttributeError
if the value being set didn't match the value the attribute had after
being set, but only if the attribute was being changed from nil to
non-nil or non-nil to nil.
* It turns out it doesn't matter which value you're trying to set the
attribute to -- if the attribute rejects that change it's confusing
either way. (In fact, I was recently bit by a case in which I was
trying to validate numericality of an attribute, where the writer
method for that attribute was overridden to ensure that the attribute
always stored a number and never contained non-number characters.
This ended up making the numericality validation useless, of
course -- but it caused confusion because the test acted in a way
I didn't expect.)
To satisfy the above:
* `allow_value` now raises a CouldNotSetAttributeError if the attribute
rejects the value being set in *any* way.
* However, add a `ignoring_interference_by_writer` qualifier so that
it is possible to manually override this behavior.
* Fix tests that are failing now because of this new change:
* Fix tests for allow_value matcher
* Fix tests for numericality matcher
* Remove tests for numericality matcher + integer column
* An integer column will typecast any non-integer value to an
integer.
* Because of the typecasting, our tests for the numericality matcher
against an integer column don't quite work, because we can't
really test what happens when the attribute is set to a
non-integer value. Now that `allow_value` is more strict, we're
getting a CouldNotSetAttributeError when attempting to do so.
* The tests mentioned were originally added to ensure that we are
handling RangeErrors that ActiveRecord used to emit. This doesn't
happen anymore, so the tests aren't necessary anymore either.
* Fix tests for acceptance matcher
* Fix tests for absence matcher
2015-09-26 01:10:00 -04:00
|
|
|
* `allow_value` now raises a CouldNotSetAttributeError if in setting the
|
|
|
|
attribute, the value of the attribute from reading the attribute back is
|
|
|
|
different from the one used to set it.
|
|
|
|
|
|
|
|
This would happen if the writer method for that attribute has custom logic
|
|
|
|
to ignore certain incoming values or change them in any way. Here are three
|
|
|
|
examples we've seen:
|
|
|
|
|
|
|
|
* You're attempting to assert that an attribute should not allow nil, yet
|
|
|
|
the attribute's writer method contains a conditional to do nothing if
|
|
|
|
the attribute is set to nil:
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
class Foo
|
|
|
|
include ActiveModel::Model
|
|
|
|
|
|
|
|
attr_reader :bar
|
|
|
|
|
|
|
|
def bar=(value)
|
|
|
|
return if value.nil?
|
|
|
|
@bar = value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe Foo do
|
|
|
|
it do
|
|
|
|
foo = Foo.new
|
|
|
|
foo.bar = "baz"
|
|
|
|
# This will raise a CouldNotSetAttributeError since `foo.bar` is now "123"
|
|
|
|
expect(foo).not_to allow_value(nil).for(:bar)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
* You're attempting to assert that an numeric attribute should not allow a
|
|
|
|
string that contains non-numeric characters, yet the writer method for
|
|
|
|
that attribute strips out non-numeric characters:
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
class Foo
|
|
|
|
include ActiveModel::Model
|
|
|
|
|
|
|
|
attr_reader :bar
|
|
|
|
|
|
|
|
def bar=(value)
|
|
|
|
@bar = value.gsub(/\D+/, '')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe Foo do
|
|
|
|
it do
|
|
|
|
foo = Foo.new
|
|
|
|
# This will raise a CouldNotSetAttributeError since `foo.bar` is now "123"
|
|
|
|
expect(foo).not_to allow_value("abc123").for(:bar)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
* You're passing a value to `allow_value` that the model typecasts into
|
|
|
|
another value:
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
describe Foo do
|
|
|
|
# Assume that `attr` is a string
|
|
|
|
# This will raise a CouldNotSetAttributeError since `attr` typecasts `[]` to `"[]"`
|
|
|
|
it { should_not allow_value([]).for(:attr) }
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
With all of these failing examples, why are we making this change? We want
|
|
|
|
to guard you (as the developer) from writing a test that you think acts one
|
|
|
|
way but actually acts a different way, as this could lead to a confusing
|
|
|
|
false positive or negative.
|
|
|
|
|
|
|
|
If you understand the problem and wish to override this behavior so that
|
|
|
|
you do not get a CouldNotSetAttributeError, you can add the
|
|
|
|
`ignoring_interference_by_writer` qualifier like so. Note that this will not
|
|
|
|
always cause the test to pass.
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
it { should_not allow_value([]).for(:attr).ignoring_interference_by_writer }
|
|
|
|
```
|
|
|
|
|
2015-09-27 17:00:46 -04:00
|
|
|
([9d9dc4e])
|
2015-05-22 12:48:42 -04:00
|
|
|
|
2015-10-04 16:04:52 -04:00
|
|
|
* `validate_uniqueness_of` is now properly case-sensitive by default, to match
|
2015-05-22 12:48:42 -04:00
|
|
|
the default behavior of the validation itself. This is a backward-incompatible
|
|
|
|
change because this test which incorrectly passed before will now fail:
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
class Product < ActiveRecord::Base
|
|
|
|
validates_uniqueness_of :name, case_sensitive: false
|
|
|
|
end
|
|
|
|
|
|
|
|
describe Product do
|
|
|
|
it { is_expected.to validate_uniqueness_of(:name) }
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
([57a1922])
|
2015-05-22 12:10:29 -04:00
|
|
|
|
2014-11-18 04:58:09 -05:00
|
|
|
* `ensure_inclusion_of`, `ensure_exclusion_of`, and `ensure_length_of` have been
|
2015-05-22 12:10:29 -04:00
|
|
|
removed in favor of their `validate_*` counterparts. ([55c8d09])
|
2014-11-18 04:58:09 -05:00
|
|
|
|
2014-11-19 18:13:59 -05:00
|
|
|
* `set_the_flash` and `set_session` have been changed to more closely align with
|
|
|
|
each other:
|
2015-05-22 12:10:29 -04:00
|
|
|
* `set_the_flash` has been removed in favor of `set_flash`. ([801f2c7])
|
2014-11-19 18:13:59 -05:00
|
|
|
* `set_session('foo')` is no longer valid syntax, please use
|
2015-05-22 12:10:29 -04:00
|
|
|
`set_session['foo']` instead. ([535fe05])
|
2014-11-19 18:13:59 -05:00
|
|
|
* `set_session['key'].to(nil)` will no longer pass when the key in question
|
2015-05-22 12:10:29 -04:00
|
|
|
has not been set yet. ([535fe05])
|
2014-11-19 18:17:48 -05:00
|
|
|
|
2015-07-08 18:43:10 -04:00
|
|
|
* Change `set_flash` so that `set_flash[:foo].now` is no longer valid syntax.
|
|
|
|
You'll want to use `set_flash.now[:foo]` instead. This was changed in order to
|
|
|
|
more closely align with how `flash.now` works when used in a controller.
|
|
|
|
([#755], [#752])
|
|
|
|
|
2015-05-22 16:37:19 -04:00
|
|
|
* Change behavior of `validate_uniqueness_of` when the matcher is not
|
|
|
|
qualified with any scopes, but your validation is. Previously the following
|
|
|
|
test would pass when it now fails:
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
class Post < ActiveRecord::Base
|
|
|
|
validate :slug, uniqueness: { scope: :user_id }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe Post do
|
|
|
|
it { should validate_uniqueness_of(:slug) }
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2015-05-22 12:48:42 -04:00
|
|
|
([6ac7b81])
|
|
|
|
|
2015-09-25 19:51:47 -04:00
|
|
|
[active_model_serializers-matchers]: https://github.com/adambarber/active_model_serializers-matchers
|
2015-05-22 12:48:42 -04:00
|
|
|
[no-auto-integration-1]: https://github.com/freerange/mocha/commit/049080c673ee3f76e76adc1e1a6122c7869f1648
|
|
|
|
[no-auto-integration-2]: https://github.com/rr/rr/issues/29
|
|
|
|
[1900071]: https://github.com/thoughtbot/shoulda-matchers/commit/190007155e0676aae84d08d8ed8eed3beebc3a06
|
|
|
|
[b7fe87a]: https://github.com/thoughtbot/shoulda-matchers/commit/b7fe87ae915f6b1f99d64e847fea536ad0f78024
|
|
|
|
[a4045a1]: https://github.com/thoughtbot/shoulda-matchers/commit/a4045a1f9bc454e618a7c55960942eb030f02fdd
|
|
|
|
[57a1922]: https://github.com/thoughtbot/shoulda-matchers/commit/57a19228b6a85f12ba7a79a26dae5869c1499c6d
|
|
|
|
[19ce8a6]: https://github.com/thoughtbot/shoulda-matchers/commit/19c38a642a2ae1316ef12540a0185cd026901e74
|
|
|
|
[eaaa2d8]: https://github.com/thoughtbot/shoulda-matchers/commit/eaaa2d83e5cd31a3ca0a1aaa65441ea1a4fffa49
|
|
|
|
[55c8d09]: https://github.com/thoughtbot/shoulda-matchers/commit/55c8d09bf2af886540924efa83c3b518d926a770
|
|
|
|
[801f2c7]: https://github.com/thoughtbot/shoulda-matchers/commit/801f2c7c1eab3b2053244485c9800f850959cfef
|
|
|
|
[535fe05]: https://github.com/thoughtbot/shoulda-matchers/commit/535fe05be8686fdafd8b22f2ed5c4192bd565d50
|
|
|
|
[6ac7b81]: https://github.com/thoughtbot/shoulda-matchers/commit/6ac7b8158cfba3b518eb3da3c24345e4473b416f
|
2015-07-08 18:43:10 -04:00
|
|
|
[#755]: https://github.com/thoughtbot/shoulda-matchers/pull/755
|
|
|
|
[#752]: https://github.com/thoughtbot/shoulda-matchers/pull/752
|
2015-09-27 17:00:46 -04:00
|
|
|
[9d9dc4e]: https://github.com/thoughtbot/shoulda-matchers/commit/9d9dc4e6b9cf2c19df66a1b4ba432ad8d3e5dded
|
Fix #permit so #on works and is properly tested
Why:
* When using #permit with the #on qualifier to assert that #permit was
called on a subset of the params hash (selected using #require), the
matcher would fail. The matcher didn't properly detect that #permit
was called on the slice -- it thought it was called on the parent
params object.
* It turns out this was a bug in Doublespeak. When #require is called,
we take the subset of the params, which is also an
ActionController::Parameters object like params, and we stub #permit
on it at runtime. Unfortunately the Double object created here was
never activated, so when #permit was called, this Double wasn't the
one run. Instead, the Double on #permit within the
ActionController::Parameters class (which is stubbed at the beginning)
was the one that was run, and it's this object that recorded the call
on #permit incorrectly.
* This bug slipped through because it turns out when #on was added it
wasn't tested very well.
To satisfy the above:
* Modify Doublespeak so that when it is in activated mode, whenever
new doubles are created, activate them immediately.
* Fix all of the tests for #permit around operating on a slice of the
params hash so that they use the #on qualifier.
2015-09-28 18:48:14 -04:00
|
|
|
[32c0e62]: https://github.com/thoughtbot/shoulda-matchers/commit/32c0e62596b87e37a301f87bbe21cfcc77750552
|
2015-10-08 22:39:38 -04:00
|
|
|
[af98a23]: https://github.com/thoughtbot/shoulda-matchers/commit/af98a23091551fb40aded5a8d4f9e5be926f53a9
|
|
|
|
[8cf449b]: https://github.com/thoughtbot/shoulda-matchers/commit/8cf449b4ca37d0d7446d2cabbfa5a1582358256d
|
2015-05-22 12:48:42 -04:00
|
|
|
|
2015-02-09 18:40:52 -05:00
|
|
|
### Bug fixes
|
|
|
|
|
|
|
|
* So far the tests for the gem have been running against only SQLite. Now they
|
|
|
|
run against PostgreSQL, too. As a result we were able to fix some
|
2015-02-11 16:34:18 -05:00
|
|
|
Postgres-related bugs, specifically around `validate_uniqueness_of`:
|
2015-02-09 18:40:52 -05:00
|
|
|
|
2015-02-11 16:34:18 -05:00
|
|
|
* When scoped to a UUID column that ends in an "f", the matcher is able to
|
2015-02-10 12:31:17 -05:00
|
|
|
generate a proper "next" value without erroring. ([#402], [#587], [#662])
|
|
|
|
|
2015-02-11 16:34:18 -05:00
|
|
|
* Support scopes that are PostgreSQL array columns. Please note that this is
|
|
|
|
only supported for Rails 4.2 and greater, as versions before this cannot
|
|
|
|
handle array columns correctly, particularly in conjunction with the
|
|
|
|
uniqueness validator. ([#554])
|
2015-02-10 12:31:17 -05:00
|
|
|
|
2015-02-11 16:34:18 -05:00
|
|
|
* Fix so that when scoped to a text column and the scope is set to nil before
|
|
|
|
running it through the matcher, the matcher does not fail. ([#521], [#607])
|
2015-02-09 18:40:52 -05:00
|
|
|
|
2015-01-15 14:18:22 -05:00
|
|
|
* Fix `define_enum_for` so that it actually tests that the attribute is present
|
|
|
|
in the list of defined enums, as you could fool it by merely defining a class
|
|
|
|
method that was the pluralized version of the attribute name. In the same
|
|
|
|
vein, passing a pluralized version of the attribute name to `define_enum_for`
|
|
|
|
would erroneously pass, and now it fails. ([#641])
|
|
|
|
|
Permit matcher now supports subparameters
Previously we were taking ActionController::Parameters and completely
overriding #require, forcing it to return `self`, i.e, the entire
ActionController::Parameters object. This meant that we broke its
functionality, which is to return a slice of the params hash instead.
The consequence of this is that attempting to call #permit on a slice of
the params hash obtained via #require would not work:
``` ruby
params = ActionController::Parameters.new(
{ "course" => { "foo" => "bar" } }
)
params.require(:course)
params.require(:course).permit(:foo)
```
This commit fixes the permit matcher so that #require is proxied
instead, retaining the existing behavior.
This commit also adds a qualifier, #on, for asserting that your action
places a restriction on a slice of the params hash. The `permit` matcher
will properly track calls on child `params` instances. For example:
``` ruby
class UsersController < ActionController::Base
def create
User.create!(user_params)
...
end
private
def user_params
params.require(:user).permit(:name, :age)
end
end
describe UsersController do
it { should permit(:name, :age).for(:create).on(:user) }
end
```
If this fails, you'll get the following error message:
```
Expected POST #create to restrict parameters for :user to :name and :age,
but restricted parameters were :first_name and :last_name.
```
2015-02-19 13:35:45 -05:00
|
|
|
* Fix `permit` so that it does not break the functionality of
|
|
|
|
ActionController::Parameters#require. ([#648], [#675])
|
|
|
|
|
2015-03-01 17:39:44 -05:00
|
|
|
* Fix `validate_uniqueness_of` + `scoped_to` so that it does not raise an error
|
|
|
|
if a record exists where the scoped attribute is nil. ([#677])
|
|
|
|
|
2015-03-30 19:14:33 -04:00
|
|
|
* Fix `route` matcher so if your route includes a default `format`, you can
|
|
|
|
specify this as a symbol or string. ([#693])
|
|
|
|
|
2015-03-31 09:44:09 -04:00
|
|
|
* Fix `validate_uniqueness_of` so that it allows you to test against scoped
|
|
|
|
attributes that are boolean columns. ([#457], [#694])
|
|
|
|
|
2015-04-09 10:27:26 -04:00
|
|
|
* Fix failure message for `validate_numericality_of` as it sometimes didn't
|
|
|
|
provide the reason for failure. ([#699])
|
|
|
|
|
2015-07-01 17:21:03 -04:00
|
|
|
* Fix `shoulda/matchers/independent` so that it can be required
|
2015-10-01 12:29:17 -04:00
|
|
|
independently, without having to require all of the gem. ([#746], [e0a0200])
|
2015-07-01 17:21:03 -04:00
|
|
|
|
Permit matcher now supports subparameters
Previously we were taking ActionController::Parameters and completely
overriding #require, forcing it to return `self`, i.e, the entire
ActionController::Parameters object. This meant that we broke its
functionality, which is to return a slice of the params hash instead.
The consequence of this is that attempting to call #permit on a slice of
the params hash obtained via #require would not work:
``` ruby
params = ActionController::Parameters.new(
{ "course" => { "foo" => "bar" } }
)
params.require(:course)
params.require(:course).permit(:foo)
```
This commit fixes the permit matcher so that #require is proxied
instead, retaining the existing behavior.
This commit also adds a qualifier, #on, for asserting that your action
places a restriction on a slice of the params hash. The `permit` matcher
will properly track calls on child `params` instances. For example:
``` ruby
class UsersController < ActionController::Base
def create
User.create!(user_params)
...
end
private
def user_params
params.require(:user).permit(:name, :age)
end
end
describe UsersController do
it { should permit(:name, :age).for(:create).on(:user) }
end
```
If this fails, you'll get the following error message:
```
Expected POST #create to restrict parameters for :user to :name and :age,
but restricted parameters were :first_name and :last_name.
```
2015-02-19 13:35:45 -05:00
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add `on` qualifier to `permit`. This allows you to make an assertion that
|
|
|
|
a restriction was placed on a slice of the `params` hash and not the entire
|
|
|
|
`params` hash. Although we don't require you to use this qualifier, we do
|
|
|
|
recommend it, as it's a more precise check. ([#675])
|
|
|
|
|
2014-12-03 17:06:23 -05:00
|
|
|
* Add `strict` qualifier to `validate_numericality_of`. ([#620])
|
|
|
|
|
2015-05-22 12:10:29 -04:00
|
|
|
* Add `on` qualifier to `validate_numericality_of`. ([9748869]; h/t [#356],
|
|
|
|
[#358])
|
2015-04-01 02:00:14 -04:00
|
|
|
|
2014-09-10 15:38:20 -04:00
|
|
|
* Add `join_table` qualifier to `have_and_belong_to_many`. ([#556])
|
|
|
|
|
2015-03-30 17:43:16 -04:00
|
|
|
* `allow_values` is now an alias for `allow_value`. This makes more sense when
|
|
|
|
checking against multiple values:
|
|
|
|
|
2015-05-22 12:48:42 -04:00
|
|
|
``` ruby
|
|
|
|
it { should allow_values('this', 'and', 'that') }
|
|
|
|
```
|
2015-03-30 17:43:16 -04:00
|
|
|
|
|
|
|
([#692])
|
|
|
|
|
2015-05-22 12:10:29 -04:00
|
|
|
[9748869]: https://github.com/thoughtbot/shoulda-matchers/commit/97488690910520ed8e1f2e164b1982eff5ef1f19
|
2015-02-11 16:34:18 -05:00
|
|
|
[#402]: https://github.com/thoughtbot/shoulda-matchers/pull/402
|
|
|
|
[#587]: https://github.com/thoughtbot/shoulda-matchers/pull/587
|
|
|
|
[#662]: https://github.com/thoughtbot/shoulda-matchers/pull/662
|
|
|
|
[#554]: https://github.com/thoughtbot/shoulda-matchers/pull/554
|
2015-01-15 14:18:22 -05:00
|
|
|
[#641]: https://github.com/thoughtbot/shoulda-matchers/pull/641
|
2015-02-11 16:34:18 -05:00
|
|
|
[#521]: https://github.com/thoughtbot/shoulda-matchers/pull/521
|
|
|
|
[#607]: https://github.com/thoughtbot/shoulda-matchers/pull/607
|
Permit matcher now supports subparameters
Previously we were taking ActionController::Parameters and completely
overriding #require, forcing it to return `self`, i.e, the entire
ActionController::Parameters object. This meant that we broke its
functionality, which is to return a slice of the params hash instead.
The consequence of this is that attempting to call #permit on a slice of
the params hash obtained via #require would not work:
``` ruby
params = ActionController::Parameters.new(
{ "course" => { "foo" => "bar" } }
)
params.require(:course)
params.require(:course).permit(:foo)
```
This commit fixes the permit matcher so that #require is proxied
instead, retaining the existing behavior.
This commit also adds a qualifier, #on, for asserting that your action
places a restriction on a slice of the params hash. The `permit` matcher
will properly track calls on child `params` instances. For example:
``` ruby
class UsersController < ActionController::Base
def create
User.create!(user_params)
...
end
private
def user_params
params.require(:user).permit(:name, :age)
end
end
describe UsersController do
it { should permit(:name, :age).for(:create).on(:user) }
end
```
If this fails, you'll get the following error message:
```
Expected POST #create to restrict parameters for :user to :name and :age,
but restricted parameters were :first_name and :last_name.
```
2015-02-19 13:35:45 -05:00
|
|
|
[#648]: https://github.com/thoughtbot/shoulda-matchers/pull/648
|
|
|
|
[#675]: https://github.com/thoughtbot/shoulda-matchers/pull/675
|
2015-03-01 17:39:44 -05:00
|
|
|
[#677]: https://github.com/thoughtbot/shoulda-matchers/pull/677
|
2014-12-03 17:06:23 -05:00
|
|
|
[#620]: https://github.com/thoughtbot/shoulda-matchers/pull/620
|
2015-03-30 19:14:33 -04:00
|
|
|
[#693]: https://github.com/thoughtbot/shoulda-matchers/pull/693
|
2015-04-01 02:00:14 -04:00
|
|
|
[#356]: https://github.com/thoughtbot/shoulda-matchers/pull/356
|
|
|
|
[#358]: https://github.com/thoughtbot/shoulda-matchers/pull/358
|
2014-09-10 15:38:20 -04:00
|
|
|
[#556]: https://github.com/thoughtbot/shoulda-matchers/pull/556
|
2015-03-31 09:44:09 -04:00
|
|
|
[#457]: https://github.com/thoughtbot/shoulda-matchers/pull/457
|
|
|
|
[#694]: https://github.com/thoughtbot/shoulda-matchers/pull/694
|
2015-03-30 17:43:16 -04:00
|
|
|
[#692]: https://github.com/thoughtbot/shoulda-matchers/pull/692
|
2015-04-09 10:27:26 -04:00
|
|
|
[#699]: https://github.com/thoughtbot/shoulda-matchers/pull/699
|
2015-07-01 17:21:03 -04:00
|
|
|
[#746]: https://github.com/thoughtbot/shoulda-matchers/pull/746
|
2015-10-01 12:29:17 -04:00
|
|
|
[e0a0200]: https://github.com/thoughtbot/shoulda-matchers/commit/e0a0200fe47157c161fb206043540804bdad664e
|
2015-01-15 14:18:22 -05:00
|
|
|
|
2015-01-30 12:42:00 -05:00
|
|
|
# 2.8.0
|
2014-05-09 17:07:18 -04:00
|
|
|
|
2014-11-04 16:21:30 -05:00
|
|
|
### Deprecations
|
|
|
|
|
|
|
|
* `ensure_length_of` has been renamed to `validate_length_of`.
|
|
|
|
`ensure_length_of` is deprecated and will be removed in 3.0.0.
|
|
|
|
|
2014-11-21 13:35:38 -05:00
|
|
|
* `set_the_flash` has been renamed to `set_flash`. `set_the_flash` is
|
|
|
|
deprecated and will be removed in 3.0.0.
|
|
|
|
|
2014-11-21 13:30:02 -05:00
|
|
|
* `set_session(:foo)` is deprecated in favor of `set_session[:foo]`.
|
|
|
|
`set_session(:foo)` will be invalid syntax in 3.0.0.
|
|
|
|
|
|
|
|
* Using `should set_session[:key].to(nil)` to assert that that a value has not
|
|
|
|
been set is deprecated. Please use `should_not set_session[:key]` instead.
|
|
|
|
In 3.0.0, `should set_session[:key].to(nil)` will only pass if the value is
|
|
|
|
truly nil.
|
|
|
|
|
2014-10-09 00:45:12 -04:00
|
|
|
### Bug fixes
|
|
|
|
|
2014-10-09 02:30:27 -04:00
|
|
|
* Fix `delegate_method` so that it works again with shoulda-context. ([#591])
|
|
|
|
|
|
|
|
* Fix `validate_uniqueness_of` when used with `scoped_to` so that when one of
|
|
|
|
the scope attributes is a polymorphic `*_type` attribute and the model has
|
|
|
|
another validation on the same attribute, the matcher does not fail with an
|
|
|
|
error. ([#592])
|
|
|
|
|
2014-09-21 18:21:52 -04:00
|
|
|
* Fix `has_many` used with `through` so that when the association does not
|
|
|
|
exist, and the matcher fails, it does not raise an error when producing the
|
|
|
|
failure message. ([#588])
|
|
|
|
|
2014-09-10 16:32:46 -04:00
|
|
|
* Fix `have_and_belong_to_many` used with `join_table` so that it does not fail
|
|
|
|
when `foreign_key` and/or `association_foreign_key` was specified on the
|
|
|
|
association as a symbol instead of a string. ([#584])
|
|
|
|
|
2014-10-21 03:35:29 -04:00
|
|
|
* Fix `allow_value` when an i18n translation key is passed to `with_message` and
|
|
|
|
the `:against` option is used to specify an alternate attribute. A bug here
|
|
|
|
also happened to affect `validate_confirmation_of` when an i18n translation
|
|
|
|
key is passed to `with_message`. ([#593])
|
|
|
|
|
2014-11-05 13:07:29 -05:00
|
|
|
* Fix `class_name` qualifier for association matchers so that if the model being
|
|
|
|
referenced is namespaced, the matcher will correctly resolve the class before
|
|
|
|
checking it against the association's `class_name`. ([#537])
|
|
|
|
|
2014-10-10 01:50:03 -04:00
|
|
|
* Fix `validate_inclusion_of` used with `with_message` so that it fails if given
|
|
|
|
a message that does not match the message on the validation. ([#598])
|
|
|
|
|
2014-11-18 04:22:39 -05:00
|
|
|
* Fix `route` matcher so that when controller and action are specified in hash
|
|
|
|
notation (e.g. `posts#show`), route parameters such as `id` do not need to be
|
2014-11-20 14:48:22 -05:00
|
|
|
specified as a string but may be specified as a number as well. ([#602])
|
2014-11-18 04:22:39 -05:00
|
|
|
|
2014-11-04 16:23:53 -05:00
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add ability to test `:primary_key` option on associations. ([#597])
|
2014-11-21 13:30:02 -05:00
|
|
|
|
2014-11-20 14:27:12 -05:00
|
|
|
* Add `allow_blank` qualifier to `validate_uniqueness_of` to complement
|
2014-11-20 14:48:22 -05:00
|
|
|
the `allow_blank` option. ([#543])
|
2014-11-04 16:23:53 -05:00
|
|
|
|
2014-11-21 13:30:02 -05:00
|
|
|
* Change `set_session` so that #[] and #to qualifiers are optional, similar to
|
|
|
|
`set_flash`. That is, you can now say `should set_session` to assert that any
|
|
|
|
flash value has been set, or `should set_session.to('value')` to assert that
|
|
|
|
any value in the session is 'value'.
|
|
|
|
|
|
|
|
* Change `set_session` so that its #to qualifier supports regexps, similar to
|
|
|
|
`set_flash`.
|
|
|
|
|
2014-12-04 06:07:34 -05:00
|
|
|
* Add `with_prefix` qualifier to `delegate_method` to correspond to the `prefix`
|
2014-12-25 01:03:18 -05:00
|
|
|
option for Rails's `delegate` macro. ([#622])
|
2014-12-04 06:07:34 -05:00
|
|
|
|
2014-12-25 01:03:18 -05:00
|
|
|
* Add support for Rails 4.2, especially fixing `serialize` matcher to remove
|
|
|
|
warning about `serialized_attributes` being deprecated. ([#627])
|
2014-12-25 00:56:33 -05:00
|
|
|
|
2015-01-30 12:42:00 -05:00
|
|
|
* Update `dependent` qualifier on association matchers to support `:destroy`,
|
|
|
|
`:delete`, `:nullify`, `:restrict`, `:restrict_with_exception`, and
|
|
|
|
`:restrict_with_error`. You can also pass `true` or `false` to assert that
|
|
|
|
the association has (or has not) been declared with *any* dependent option.
|
|
|
|
([#631])
|
|
|
|
|
2014-10-21 03:35:29 -04:00
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* Tweak `allow_value` failure message so that it reads a bit nicer when listing
|
|
|
|
existing errors.
|
|
|
|
|
2014-10-09 02:30:27 -04:00
|
|
|
[#591]: https://github.com/thoughtbot/shoulda-matchers/pull/591
|
|
|
|
[#592]: https://github.com/thoughtbot/shoulda-matchers/pull/592
|
2014-09-21 18:21:52 -04:00
|
|
|
[#588]: https://github.com/thoughtbot/shoulda-matchers/pull/588
|
2014-09-10 16:32:46 -04:00
|
|
|
[#584]: https://github.com/thoughtbot/shoulda-matchers/pull/584
|
2014-10-21 03:35:29 -04:00
|
|
|
[#593]: https://github.com/thoughtbot/shoulda-matchers/pull/593
|
2014-10-07 17:05:16 -04:00
|
|
|
[#597]: https://github.com/thoughtbot/shoulda-matchers/pull/597
|
2014-11-05 13:07:29 -05:00
|
|
|
[#537]: https://github.com/thoughtbot/shoulda-matchers/pull/537
|
2014-10-10 01:50:03 -04:00
|
|
|
[#598]: https://github.com/thoughtbot/shoulda-matchers/pull/598
|
2014-11-18 04:22:39 -05:00
|
|
|
[#602]: https://github.com/thoughtbot/shoulda-matchers/pull/602
|
2014-11-20 14:48:22 -05:00
|
|
|
[#543]: https://github.com/thoughtbot/shoulda-matchers/pull/543
|
2014-12-04 06:07:34 -05:00
|
|
|
[#622]: https://github.com/thoughtbot/shoulda-matchers/pull/622
|
2014-12-25 01:03:18 -05:00
|
|
|
[#627]: https://github.com/thoughtbot/shoulda-matchers/pull/627
|
2015-01-30 12:42:00 -05:00
|
|
|
[#631]: https://github.com/thoughtbot/shoulda-matchers/pull/631
|
2014-10-09 00:45:12 -04:00
|
|
|
|
2014-09-03 02:38:41 -04:00
|
|
|
# 2.7.0
|
|
|
|
|
2014-09-03 02:31:03 -04:00
|
|
|
### Deprecations
|
|
|
|
|
|
|
|
* `ensure_inclusion_of` has been renamed to `validate_inclusion_of`.
|
|
|
|
`ensure_inclusion_of` is deprecated and will be removed in 3.0.0.
|
|
|
|
|
|
|
|
* `ensure_exclusion_of` has been renamed to `validate_exclusion_of`.
|
|
|
|
`ensure_exclusion_of` is deprecated and will be removed in 3.0.0.
|
|
|
|
|
2014-05-24 14:57:18 -04:00
|
|
|
### Bug fixes
|
|
|
|
|
2014-07-26 01:33:05 -04:00
|
|
|
* Fix `delegate_method` so that it does not raise an error if the method that
|
|
|
|
returns the delegate object is private.
|
2014-05-24 14:57:18 -04:00
|
|
|
|
2014-05-25 22:27:49 -04:00
|
|
|
* Warn when `ensure_inclusion_of` is chained with `.in_array([false, true])`
|
|
|
|
as well as with `.in_array([true, false])`.
|
|
|
|
|
2014-08-08 16:21:10 -04:00
|
|
|
* Fix `set_session` so that the `to` qualifier if given nil checks that the
|
|
|
|
session variable in question was set to nil (previously this actually did
|
|
|
|
nothing).
|
|
|
|
|
2014-08-07 18:06:29 -04:00
|
|
|
* Fix `filter_param` so that it works when `config.filter_parameters` contains
|
|
|
|
regexes.
|
|
|
|
|
2014-08-02 10:55:56 -04:00
|
|
|
* Fix `delegate_method` so that it can be required independent of Active
|
|
|
|
Support.
|
|
|
|
|
2014-08-07 10:03:28 -04:00
|
|
|
* Fix `validate_uniqueness_of`. When used against an unpersisted record whose
|
|
|
|
model contained a non-nullable column other than the one being validated, the
|
|
|
|
matcher would break. Even if the test set that column to a value beforehand,
|
|
|
|
the record had to be persisted in order for the matcher to work. Now this is
|
|
|
|
no longer the case and the record can remain unpersisted.
|
|
|
|
|
2014-04-25 09:39:24 -04:00
|
|
|
* Fix `validate_absence_of`: it required that a string be passed as the
|
|
|
|
attribute name rather than a symbol (which is the usual and documented usage).
|
|
|
|
|
2014-11-04 16:23:53 -05:00
|
|
|
### Features
|
|
|
|
|
|
|
|
* Add new matcher `define_enum_for` to test usage of the `enum` macro introduced
|
|
|
|
in Rails 4.1.
|
|
|
|
|
2014-07-21 02:10:03 -04:00
|
|
|
### Improvements
|
|
|
|
|
|
|
|
* `have_and_belongs_to_many` now checks to make sure that the join table
|
|
|
|
contains the correct columns for the left- and right-hand side of the
|
|
|
|
association.
|
|
|
|
|
2014-09-03 01:52:09 -04:00
|
|
|
* Reword failure message for `delegate_method` so that it's a little more
|
|
|
|
helpful.
|
|
|
|
|
2014-07-18 20:07:32 -04:00
|
|
|
# 2.6.2
|
|
|
|
|
2014-06-12 18:12:54 -04:00
|
|
|
### Bug fixes
|
|
|
|
|
Use same assertion class as Rails, if loaded
Given this scenario:
* Using Rails 4.1
* Gemfile has `gem 'shoulda-matchers', require: false`
* spec_helper has `require 'shoulda/matchers'` following
`require 'rspec/rails'`
* Using Spring to run tests
matchers that delegate to assertions in Rails (e.g. `render_template`
and `route`) will fail in the wrong way if used. They fail because in
order to use these assertions, we expect that the assertions will
raise a specific exception, an exception that corresponds to whichever
test framework that Rails is using. For Rails versions that used
Test::Unit, this is Test::Unit::AssertionFailedError. For current Rails
versions, which now use Minitest, this exception is Minitest::Assertion.
The problem is that instead of asking Rails which exception class it's
using, we are trying to detect this exception class ourselves (for
cases in which Rails is not being used). This leads to the wrong class
being detected: when using a Rails version that uses Minitest, we choose
Test::Unit::AssertionFailedError as the class. This happens using the
exact scenario above because even though shoulda-matchers is loaded
after rspec-rails, rspec-rails itself defines
Test::Unit::AssertionFailedError.
Also add Cucumber tests that confirms this exact scenario works.
2014-06-21 23:24:22 -04:00
|
|
|
* If you have a Rails >= 4.1 project and you are running tests using Spring,
|
|
|
|
matchers that depend on assertions within Rails' testing layer (e.g.
|
|
|
|
`render_template` and `route`) will no longer fail.
|
|
|
|
|
2014-06-12 18:12:54 -04:00
|
|
|
* Fix `permit` so that it can be used more than once in the same test.
|
|
|
|
|
2014-05-09 17:07:18 -04:00
|
|
|
* Revert change to `validate_uniqueness_of` made in 2.6.0 so that it no longer
|
|
|
|
provides default values for non-primary, non-nullable columns. This approach
|
|
|
|
was causing test failures because it makes the assumption that none of these
|
|
|
|
columns allow only specific values, which is not true. If you get an error
|
|
|
|
from `validate_uniqueness_of`, your best bet continues to be creating a record
|
|
|
|
manually and calling `validate_uniqueness_of` on that instead.
|
|
|
|
|
2014-06-27 18:39:39 -04:00
|
|
|
* The majority of warnings that the gem produced have been removed. The gem
|
|
|
|
still produces warnings under Ruby 1.9.3; we will address this in a future
|
|
|
|
release.
|
|
|
|
|
2014-04-30 17:52:47 -04:00
|
|
|
# 2.6.1
|
2014-04-15 17:16:01 -04:00
|
|
|
|
2014-05-09 17:07:18 -04:00
|
|
|
### Bug fixes
|
2014-04-26 11:10:17 -04:00
|
|
|
|
2014-04-26 11:13:57 -04:00
|
|
|
* Revert changes to `validate_numericality_of` made in the last release, which
|
|
|
|
made it so that comparison qualifiers specified on the validation are tested
|
|
|
|
using a very small decimal number offset rather than a whole number by
|
|
|
|
default, except if the matcher was qualified with `only_integer`. This means
|
|
|
|
that prior to 2.6.0, if your validation specified `only_integer` and you did
|
2014-04-30 17:52:47 -04:00
|
|
|
not, then after 2.6.0 that test would fail. This is now fixed.
|
2014-04-15 17:16:01 -04:00
|
|
|
|
2014-04-30 17:52:47 -04:00
|
|
|
* Fix regression in previous release where ActiveRecord matchers would not be
|
|
|
|
included when ActiveRecord wasn't defined (i.e. if you were using ActiveModel
|
|
|
|
only).
|
2014-04-15 09:16:32 -04:00
|
|
|
|
2014-04-16 02:24:02 -04:00
|
|
|
* Revert the behavior of `allow_value` changed in 2.6.0 (it will no longer raise
|
|
|
|
CouldNotClearAttribute). This was originally done as a part of a fix for
|
|
|
|
`validate_presence_of` when used in conjunction with `has_secure_password`.
|
|
|
|
That fix has been updated so that it does not affect `allow_value`.
|
|
|
|
|
2014-04-16 16:12:36 -04:00
|
|
|
* Fix callback matchers and correct test coverage.
|
|
|
|
|
2014-04-19 22:48:43 -04:00
|
|
|
* Fix `permit` so that it does not interfere with different usages of `params`
|
|
|
|
in your controller action. Specifically, this will not raise an error:
|
|
|
|
`params.fetch(:foo, {}).permit(:bar, :baz)` (the `permit` will have no
|
|
|
|
problems recognizing that :bar and :baz are permitted params).
|
|
|
|
|
|
|
|
* Fix `permit` on Rails 4.1 to use PATCH by default for #update instead of PUT.
|
|
|
|
Previously you had to specify this manually.
|
|
|
|
|
|
|
|
* Fix `permit` so that it track multiple calls to #permit in your controller
|
|
|
|
action. Previously only the last usage of #permit would be considered in
|
|
|
|
determining whether the matcher matched.
|
|
|
|
|
|
|
|
* Fix `permit` so that if the route for your action requires params (such as id)
|
|
|
|
then you can now specify those params:
|
|
|
|
`permit(:first_name, :last_name).for(:update, params: { id: 42 })`.
|
2014-04-16 04:58:05 -04:00
|
|
|
|
2014-04-20 19:12:25 -04:00
|
|
|
* Fix `delegate_method` so that it does not stub the target method forever,
|
|
|
|
returning it to its original implementation after the match ends.
|
|
|
|
|
2014-04-19 11:53:51 -04:00
|
|
|
* Fix `validate_uniqueness_of` to work with Rails 4.1 enum columns.
|
|
|
|
|
2014-11-04 16:23:53 -05:00
|
|
|
### Features
|
|
|
|
|
|
|
|
* Teach `with_message` qualifier on `allow_value` to accept a hash of i18n
|
|
|
|
interpolation values:
|
|
|
|
`allow_value('foo').for(:attr).with_message(:greater_than, values: { count: 20 })`.
|
|
|
|
|
2014-04-12 17:42:19 -04:00
|
|
|
# 2.6.0
|
2013-09-20 16:11:59 -04:00
|
|
|
|
2014-04-11 17:30:19 -04:00
|
|
|
* The boolean argument to `have_db_index`'s `unique` option is now optional, for
|
|
|
|
consistency with other matchers.
|
2014-03-04 07:47:16 -05:00
|
|
|
|
2014-01-10 12:25:14 -05:00
|
|
|
* Association matchers now test that the model being referred to (either
|
|
|
|
implicitly or explicitly, using `:class_name`) actually exists.
|
|
|
|
|
2014-01-22 15:40:38 -05:00
|
|
|
* Add ability to test `:autosave` option on associations.
|
|
|
|
|
2014-01-20 17:26:34 -05:00
|
|
|
* Fix `validate_uniqueness_of(...).allow_nil` so that it can be used against an
|
|
|
|
non-password attribute which is in a model that `has_secure_password`. Doing
|
|
|
|
so previously would result in a "Password digest missing on new record" error.
|
|
|
|
|
2014-01-12 20:43:36 -05:00
|
|
|
* Fix description for `validate_numericality_of` so that if the matcher fails,
|
|
|
|
the error message reported does not say the matcher accepts integer values if
|
|
|
|
you didn't specify that.
|
|
|
|
|
Handle ensure_inclusion_of for boolean columns
Currently, using `ensure_inclusion_of` against a boolean column doesn't
work. We can assert that the column allows boolean values, but what
about values that should be rejected? Well, it depends on what you give
to `ensure_inclusion_of`. Here's how it works now:
* `ensure_inclusion_of(:attr).in_array([true])` asserts that false is
rejected
* `ensure_inclusion_of(:attr).in_array([false])` asserts that true is
rejected
* `ensure_inclusion_of(:attr).in_array([true, false])` does not assert
that anything is rejected, instead informing the developer how
this sort of expectation is not fully testable (anything other than
true, false, or nil will be converted to false).
* `ensure_inclusion_of(:attr).in_array([nil])`, when the column is
nullable, does not assert that anything is rejected, either, also
printing a warning
* `ensure_inclusion_of(:attr).in_array([nil])`, when the column is
non-nullable, raises an error because this expectation is not testable
in any way, as setting a boolean column to nil this way will get
converted to false.
2014-01-21 18:46:23 -05:00
|
|
|
* Fix `ensure_inclusion_of` so that you can use it against a boolean column
|
|
|
|
(and pass boolean values to `in_array`). There are two caveats:
|
|
|
|
|
|
|
|
* You should not test that your attribute allows both true and false
|
|
|
|
(`.in_array([true, false]`); there's no way to test that it doesn't accept
|
|
|
|
anything other than that.
|
|
|
|
* You cannot test that your attribute allows nil (`.in_array([nil])`) if
|
|
|
|
the column does not allow null values.
|
|
|
|
|
2014-02-10 17:52:40 -05:00
|
|
|
* Change `validate_uniqueness_of(...)` so that it provides default values for
|
|
|
|
non-nullable attributes.
|
|
|
|
|
2014-04-25 09:39:24 -04:00
|
|
|
* Running `rake` now installs Appraisals before running the test suite.
|
2014-04-11 17:30:19 -04:00
|
|
|
(Additionally, we now manage Appraisals using the `appraisal` executable in
|
|
|
|
Appraisal 1.0.0.)
|
2014-01-20 13:39:18 -05:00
|
|
|
|
2014-02-21 17:31:48 -05:00
|
|
|
* Add `allow_nil` option to `validate_numericality_of` so that you can validate
|
|
|
|
that numeric values are validated only if a value is supplied.
|
|
|
|
|
2014-02-26 22:26:37 -05:00
|
|
|
* Fix `validate_numericality_of` so that test fails when the value with
|
|
|
|
`greater_than`, `greater_than_or_equal_to`, `less_than`, `less_than_or_equal_
|
|
|
|
to` or `equal_to` is not appropriate.
|
|
|
|
|
2013-11-22 15:46:59 -05:00
|
|
|
* Change `validate_presence_of` under Rails 4 so that if you are using it with a
|
|
|
|
user whose model `has_secure_password` and whose password is set to a value,
|
|
|
|
you will be instructed to use a user whose password is blank instead. The
|
|
|
|
reason for this change is due to the fact that Rails 4's version of
|
|
|
|
`has_secure_password` defines #password= such that `nil` will be ignored,
|
|
|
|
which interferes with how `validate_presence_of` works.
|
|
|
|
|
2014-03-18 23:13:28 -04:00
|
|
|
* Add ability to test `belongs_to` associations defined with `:inverse_of`.
|
|
|
|
|
2014-04-11 17:30:19 -04:00
|
|
|
* Add back matchers that were removed in 2.0.0: `permit`, for testing strong
|
|
|
|
parameters, and `delegate_method`, for testing delegation.
|
|
|
|
|
|
|
|
* Add new matchers for testing controller filters: `before_filter`,
|
|
|
|
`after_filter`, and `around_filter` (aliased to `before_action`,
|
|
|
|
`after_action` and `around_action` for Rails 4).
|
|
|
|
|
2014-02-18 17:54:27 -05:00
|
|
|
* Fix `rescue_from` matcher so that it does not raise an error when testing
|
|
|
|
a method handler which has been marked as protected or private.
|
|
|
|
|
2014-04-11 17:30:19 -04:00
|
|
|
* Fix compatibility issues with Rails 4.1:
|
2014-04-11 16:48:52 -04:00
|
|
|
* `set_the_flash` and `have_and_belongs_to_many` no longer raise errors
|
|
|
|
* Minitest no longer prints warnings whenever shoulda-matchers is required
|
|
|
|
|
2014-01-10 17:37:34 -05:00
|
|
|
# v 2.5.0
|
|
|
|
|
2013-10-10 15:34:51 -04:00
|
|
|
* Fix Rails/Test::Unit integration to ensure that the test case classes we are
|
|
|
|
re-opening actually exist.
|
|
|
|
|
2014-01-10 17:14:19 -05:00
|
|
|
* Fix `ensure_length_of` so that it uses the right message to validate when
|
|
|
|
`is_equal_to` is specified in conjunction with a custom message.
|
|
|
|
|
2013-10-15 18:12:17 -04:00
|
|
|
* The `route` matcher now accepts specifying a controller/action pair as a
|
|
|
|
string instead of only a hash (e.g. `route(...).to('posts#index')` instead of
|
|
|
|
`route(...).to(controller: 'posts', action: 'index')`).
|
|
|
|
|
2013-10-25 16:41:59 -04:00
|
|
|
* The `ensure_inclusion_of` matcher now works with a decimal column.
|
|
|
|
|
2014-01-10 17:14:19 -05:00
|
|
|
* Under Rails 3, if you had an association matcher chained with the
|
|
|
|
the `order` submatcher -- e.g. `should have_many(:foos).order(:bar)` -- and
|
|
|
|
your association had an `:include` on it, using the matcher would raise an
|
|
|
|
error. This has been fixed.
|
2013-10-20 20:41:30 -04:00
|
|
|
|
2014-01-10 17:14:19 -05:00
|
|
|
* Fix `validate_uniqueness_of` so it doesn't fail if the attribute under
|
|
|
|
test has a limit of fewer than 16 characters.
|
2013-11-11 18:38:07 -05:00
|
|
|
|
2013-11-27 13:18:46 -05:00
|
|
|
* You can now test that your `has_many :through` or `has_one :through`
|
|
|
|
associations are defined with a `:source` option.
|
|
|
|
|
2014-01-10 17:14:19 -05:00
|
|
|
* Add new matcher `validates_absence_of`.
|
|
|
|
|
|
|
|
* Update matchers so that they use `failure_message` and
|
|
|
|
`failure_message_when_negated` to define error messages. These are new methods
|
|
|
|
in the upcoming RSpec 3 release which replace `failure_message_for_should` and
|
|
|
|
`failure_message_for_should_not`. We've kept backward compatibility so all of
|
|
|
|
your existing tests should still work -- this is just to make sure when RSpec
|
|
|
|
3 is released you don't get a bunch of warnings.
|
2013-12-05 11:38:30 -05:00
|
|
|
|
2013-09-20 16:11:59 -04:00
|
|
|
# v 2.4.0
|
2013-10-10 15:34:51 -04:00
|
|
|
|
2013-09-13 14:23:39 -04:00
|
|
|
* Fix a bug with the `validate_numericality_of` matcher that would not allow the
|
|
|
|
`with_message` option on certain submatchers.
|
2013-03-28 15:56:05 -04:00
|
|
|
|
2013-08-28 06:08:06 -04:00
|
|
|
* Fix a regression with context-dependent validations in ActiveResource
|
|
|
|
|
2013-08-16 18:47:08 -04:00
|
|
|
* shoulda-matchers is now fully compatible with Rails 4.
|
|
|
|
|
|
|
|
* When not using RSpec, shoulda-matchers is now auto-included into
|
|
|
|
ActiveSupport::TestCase instead of Test::Unit::TestCase (in Rails 4
|
|
|
|
the former no longer inherits from the latter).
|
|
|
|
|
2013-08-16 13:05:00 -04:00
|
|
|
# v 2.3.0
|
|
|
|
|
2013-08-14 21:40:07 -04:00
|
|
|
* Fix a bug in `ensure_inclusion_of` that would cause issues with using
|
|
|
|
`in_array` with an integer value.
|
|
|
|
|
2013-08-06 03:26:02 -04:00
|
|
|
* Add support for PostgreSQL UUID columns to `validates_uniqueness_of` (#334).
|
|
|
|
|
2013-07-29 23:31:24 -04:00
|
|
|
* Fix `validates_numericality_of` so that `is_equal_to` submatcher works
|
|
|
|
correctly (#326).
|
|
|
|
|
2013-08-10 17:38:59 -04:00
|
|
|
* Fix context support for validation matchers and disallowed values (#313).
|
2013-07-01 22:16:32 -04:00
|
|
|
|
2013-08-10 17:38:59 -04:00
|
|
|
* Add a `counter_cache` submatcher for `belongs_to` associations (#311).
|
2013-06-19 19:52:46 -04:00
|
|
|
|
2013-08-10 17:38:59 -04:00
|
|
|
* Add a `rescue_from` matcher for Rails controllers which checks that the
|
|
|
|
correct ActiveSupport call has been made and that the handlers exist without
|
|
|
|
actually throwing an exception (#287).
|
2013-04-26 16:34:21 -04:00
|
|
|
|
2013-06-14 11:21:50 -04:00
|
|
|
* Changed the scope of AssociationMatcher methods from protected to private.
|
|
|
|
|
2013-06-07 10:14:27 -04:00
|
|
|
* Extracted `#order`, `#through`, and `#dependent` from AssociationMatcher as
|
2013-08-10 17:38:59 -04:00
|
|
|
their own submatchers.
|
2013-06-07 10:14:27 -04:00
|
|
|
|
2013-06-11 10:35:05 -04:00
|
|
|
# v 2.2.0
|
|
|
|
|
2013-05-03 18:31:37 -04:00
|
|
|
* Fix `have_and_belong_to_many` matcher issue for Rails 4.
|
|
|
|
|
2013-05-17 14:10:19 -04:00
|
|
|
* Fix `validate_uniqueness_of.scoped_to` issue when the scoped field is already
|
|
|
|
taken (#207).
|
|
|
|
|
2013-05-23 23:26:45 -04:00
|
|
|
* Add comparison submatchers to `validate_numericality_of` to correspond to the
|
|
|
|
comparison options you can give to `validates_numericality_of` (#244).
|
|
|
|
|
2013-05-05 11:51:57 -04:00
|
|
|
# v 2.1.0
|
|
|
|
|
2013-04-12 13:11:07 -04:00
|
|
|
* Add missing `failure_message_for_should_not` implementations to
|
|
|
|
`validate_numericality_of` and its submatchers
|
|
|
|
|
2013-08-10 17:38:59 -04:00
|
|
|
* Support validation contexts for testing validations `on: :create` and when
|
|
|
|
using custom contexts like `model.valid?(:my_context)`.
|
2013-03-03 22:34:38 -05:00
|
|
|
|
2013-03-26 08:59:05 -04:00
|
|
|
* Fix a bug in validations with autosaved models.
|
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Fix maximum value detection for the `ensure_inclusion_of` and
|
|
|
|
`ensure_exclusion_of` matchers.
|
|
|
|
|
2013-03-19 00:50:39 -04:00
|
|
|
* Add `:odd` and `:even` options to the `validate_numericality_of` matcher.
|
2013-04-26 11:48:44 -04:00
|
|
|
|
|
|
|
* Add `:touch` option to AssociationMatcher.
|
|
|
|
|
2013-03-15 16:52:55 -04:00
|
|
|
* Ruby 2.0.0 is now officially supported.
|
2013-04-26 11:48:44 -04:00
|
|
|
|
|
|
|
* Fix the issue where using `%{attribute}` or `%{model}` in I18n translations
|
|
|
|
raised exceptions.
|
|
|
|
|
|
|
|
* Support datetime columns in `validate_uniqueness_of.scoped_to`.
|
|
|
|
|
|
|
|
* Add `allow_nil` option to the `validate_uniqueness_of` matcher.
|
2012-11-02 14:48:35 -04:00
|
|
|
|
2013-03-19 18:55:19 -04:00
|
|
|
# v 2.0.0
|
|
|
|
* Remove the following matchers:
|
|
|
|
* `assign_to`
|
|
|
|
* `respond_with_content_type`
|
|
|
|
* `query_the_database`
|
|
|
|
* `validate_format_of`
|
|
|
|
* `have_sent_email`
|
|
|
|
* `permit` (strong parameters matcher)
|
|
|
|
* `delegate_method`
|
2013-04-26 11:48:44 -04:00
|
|
|
|
2013-03-19 18:55:19 -04:00
|
|
|
* For more information about 2.0 changes, see:
|
2013-04-26 11:48:44 -04:00
|
|
|
http://robots.thoughtbot.com/post/47031676783/shoulda-matchers-2-0.
|
2013-03-19 18:55:19 -04:00
|
|
|
|
2013-03-29 16:45:43 -04:00
|
|
|
# v 1.5.6
|
2013-04-26 11:48:44 -04:00
|
|
|
* Revert previous change in AllowValueMatcher that added a check for a
|
2013-03-29 16:10:01 -04:00
|
|
|
properly-set attribute.
|
|
|
|
|
2013-03-28 15:56:05 -04:00
|
|
|
# v 1.5.5
|
2013-04-26 11:48:44 -04:00
|
|
|
* AllowValueMatcher checks that the right value is used for attempts at
|
|
|
|
setting the attribute with it.
|
2013-03-26 18:16:04 -04:00
|
|
|
* Please note that previously-passing tests might now fail. It is likely that
|
|
|
|
it's not a bug, but please make sure that the code you're testing is written
|
|
|
|
properly before submitting an issue.
|
2013-04-26 11:48:44 -04:00
|
|
|
|
|
|
|
* Use DisallowValueMatcher for `disallows_value_of` method.
|
|
|
|
|
|
|
|
* Assert `class_name` value on real class name for AssociationMatcher.
|
|
|
|
|
|
|
|
* Correct the variable used for `validate_confirmation_of` matcher description.
|
2013-03-15 17:18:00 -04:00
|
|
|
|
2013-03-21 15:50:13 -04:00
|
|
|
# v 1.5.4
|
2013-04-26 11:48:44 -04:00
|
|
|
* Properly-released version of 1.5.3.
|
2013-03-21 15:50:13 -04:00
|
|
|
|
|
|
|
# v 1.5.3 - yanked due to mis-release
|
2013-04-26 11:48:44 -04:00
|
|
|
* Alleviate the need to add `rspec` gem to your app.
|
2013-03-21 15:18:50 -04:00
|
|
|
|
2013-03-19 09:37:56 -04:00
|
|
|
# v 1.5.1
|
2013-04-19 17:14:26 -04:00
|
|
|
* Bump version dependency of Bourne to allow for Mocha upgrade.
|
2013-04-26 11:48:44 -04:00
|
|
|
|
2013-04-19 17:14:26 -04:00
|
|
|
* Should fix incompatibility with MiniTest.
|
2013-03-19 09:37:56 -04:00
|
|
|
|
2013-03-15 17:18:00 -04:00
|
|
|
# v 1.5.0
|
|
|
|
* Deprecate the following matchers:
|
2013-04-26 11:48:44 -04:00
|
|
|
* `assign_to`
|
|
|
|
* `respond_with_content_type`
|
|
|
|
* `query_the_database`
|
|
|
|
* `validate_format_of`
|
|
|
|
* `have_sent_email`
|
|
|
|
* `permit` (strong parameters matcher)
|
|
|
|
* `delegate_method`
|
2013-03-15 17:18:00 -04:00
|
|
|
|
2012-12-25 17:26:33 -05:00
|
|
|
* Use RSpec's native `configure.include` syntax for including matchers into
|
2013-04-26 11:48:44 -04:00
|
|
|
RSpec (#204).
|
2012-12-25 17:26:33 -05:00
|
|
|
|
2013-04-19 17:14:26 -04:00
|
|
|
* Do not force MiniTest loading when test-unit is available (this was fixed
|
2013-04-26 11:48:44 -04:00
|
|
|
before 1.3.0 then reverted in 1.3.0).
|
2013-01-03 15:17:38 -05:00
|
|
|
|
2012-11-30 10:31:52 -05:00
|
|
|
# v1.4.2
|
2013-04-26 11:48:44 -04:00
|
|
|
* Add a new `delegate_method` matcher.
|
2012-11-30 10:31:52 -05:00
|
|
|
|
2012-10-15 11:48:11 -04:00
|
|
|
# v1.4.1
|
2013-04-26 11:48:44 -04:00
|
|
|
* Fix an issue when used with Test::Unit on the allow value matcher.
|
2012-10-15 11:48:11 -04:00
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Fix an issue with using `ensure_inclusion_of(:attr)` given an array of true or false values.
|
2012-10-15 11:48:11 -04:00
|
|
|
|
2012-10-05 13:25:13 -04:00
|
|
|
# v1.4.0
|
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Add `strict` option to validation matchers.
|
2012-10-05 13:25:13 -04:00
|
|
|
|
|
|
|
* Verify that arguments to `set_the_flash` matcher are valid.
|
|
|
|
|
|
|
|
* Fix issue in ValidateUniquenessMatcher that could cause an error on postgres.
|
|
|
|
|
|
|
|
* You can now pass an array to `ensure_exclusion_of` using `in_array`.
|
|
|
|
|
2013-01-03 15:17:38 -05:00
|
|
|
* Allow testing of `:foreign_key` option for `has_one` relationships using the association matcher.
|
2012-10-05 13:25:13 -04:00
|
|
|
|
|
|
|
* Fix bug where `ensure_length_of` would pass if the given string was too long.
|
|
|
|
|
|
|
|
* `allow_blank` will now allow values such as: ' ', '\n', and '\r'.
|
|
|
|
|
|
|
|
* Test outside values for `ensure_inclusion_of` when given an array.
|
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Fix the output of the `set_the_flash` matcher.
|
2012-10-05 13:25:13 -04:00
|
|
|
|
2012-08-30 14:19:26 -04:00
|
|
|
# v1.3.0
|
2012-06-15 13:28:56 -04:00
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* `validate_format_of` will accept `allow_blank(bool)` and `allow_nil(bool)`.
|
2012-07-04 10:14:30 -04:00
|
|
|
|
2013-04-19 17:14:26 -04:00
|
|
|
* Prefer Test::Unit to MiniTest when loading integrations so that RubyMine is
|
2012-06-15 13:28:56 -04:00
|
|
|
happy (#88).
|
|
|
|
|
2012-05-11 11:36:22 -04:00
|
|
|
* `validates_uniqueness_of` will now create a record if one does not exist.
|
|
|
|
Previously, users were required to create a record in the database before
|
|
|
|
using this matcher.
|
|
|
|
|
2012-07-20 10:38:56 -04:00
|
|
|
* Fix an edge case when where the matchers weren't loaded into Test::Unit when
|
|
|
|
mixing RSpec and Test::Unit tests and also loading both the 'rspec-rails' gem
|
|
|
|
and 'shoulda-matchers' gem from the same Gemfile group, namely [:test,
|
|
|
|
:development].
|
|
|
|
|
2012-07-20 10:59:27 -04:00
|
|
|
* `controller.should_not render_partial` now correctly matches `render partial: "partial"`.
|
|
|
|
|
2012-06-14 15:40:39 -04:00
|
|
|
# v1.2.0
|
2012-04-20 11:46:47 -04:00
|
|
|
|
|
|
|
* `ensure_inclusion_of` now has an `in_array` parameter:
|
|
|
|
`ensure_inclusion_of(:attr).in_array(['foo', 'bar'])`. It cannot be used with
|
2012-04-20 11:47:21 -04:00
|
|
|
the `.in_range` option. (vpereira)
|
2012-04-20 11:46:47 -04:00
|
|
|
|
2012-05-10 11:15:40 -04:00
|
|
|
* `ensure_in_inclusion_of` with `in_array` will accept `allow_blank(bool)` and `allow_nil(false)`
|
|
|
|
|
2012-04-20 14:50:29 -04:00
|
|
|
* Test against Rails 3.2.
|
|
|
|
|
2012-04-20 14:56:58 -04:00
|
|
|
* Fix `ensure_length_of` to use all possible I18n error messages.
|
|
|
|
|
2012-04-23 17:37:40 -04:00
|
|
|
* `have_db_index.unique(nil)` used to function exactly the same as
|
|
|
|
`have_db_index` with no unique option. It now functions the same as
|
|
|
|
`have_db_index.unique(false)`.
|
|
|
|
|
2012-06-14 15:40:39 -04:00
|
|
|
* In 1.1.0, `have_sent_email` checked all emails to ensure they matched. It now
|
|
|
|
checks that only one email matches, which restores 1.0.0 behavior.
|
|
|
|
|
2012-04-13 11:02:27 -04:00
|
|
|
# v1.1.0
|
2012-04-03 20:57:53 -04:00
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Add `only_integer` option to `validate_numericality_of`:
|
2012-04-03 20:57:53 -04:00
|
|
|
`should validate_numericality_of(:attribute).only_integer`
|
2012-04-09 20:41:20 -04:00
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Add a `query_the_database` matcher:
|
2012-04-03 20:57:53 -04:00
|
|
|
|
|
|
|
`it { should query_the_database(4.times).when_calling(:complicated_method) }`
|
|
|
|
`it { should query_the_database(4.times).or_less.when_calling(:complicated_method) }`
|
|
|
|
`it { should_not query_the_database.when_calling(:complicated_method) }`
|
|
|
|
|
|
|
|
* Database columns are now correctly checked for primality. E.G., this works
|
|
|
|
now: `it { should have_db_column(:id).with_options(:primary => true) }`
|
|
|
|
|
|
|
|
* The flash matcher can check specific flash keys using [], like so:
|
|
|
|
`it { should set_the_flash[:alert].to("Password doesn't match") }`
|
|
|
|
|
2012-04-09 20:41:20 -04:00
|
|
|
* The `have_sent_email` matcher can check `reply_to`:
|
2012-04-03 20:57:53 -04:00
|
|
|
` it { should have_sent_email.reply_to([user, other]) }`
|
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Add `validates_confirmation_of` matcher:
|
2012-04-03 20:57:53 -04:00
|
|
|
`it { should validate_confirmation_of(:password) }`
|
|
|
|
|
2013-04-26 11:48:44 -04:00
|
|
|
* Add `serialize` matcher:
|
2012-04-03 20:57:53 -04:00
|
|
|
`it { should serialize(:details).as(Hash).as_instance_of(Hash) }`
|
2012-04-09 20:43:40 -04:00
|
|
|
|
|
|
|
* shoulda-matchers checks for all possible I18n keys, instead of just
|
|
|
|
e.g. `activerecord.errors.messages.blank`
|
2012-04-09 20:46:18 -04:00
|
|
|
|
2012-04-13 10:58:56 -04:00
|
|
|
* Add `accept_nested_attributes` matcher
|
|
|
|
|
2012-04-10 23:23:24 -04:00
|
|
|
* Our very first dependency: ActiveSupport >= 3.0.0
|