remockable 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.travis.yml +2 -3
- data/CHANGELOG.md +6 -0
- data/README.markdown +18 -4
- data/lib/remockable/active_model/allow_values_for.rb +14 -13
- data/lib/remockable/active_model/helpers.rb +7 -6
- data/lib/remockable/active_model/validate_acceptance_of.rb +9 -11
- data/lib/remockable/active_model/validate_confirmation_of.rb +9 -11
- data/lib/remockable/active_model/validate_exclusion_of.rb +9 -11
- data/lib/remockable/active_model/validate_format_of.rb +9 -11
- data/lib/remockable/active_model/validate_inclusion_of.rb +9 -11
- data/lib/remockable/active_model/validate_length_of.rb +32 -19
- data/lib/remockable/active_model/validate_numericality_of.rb +23 -12
- data/lib/remockable/active_model/validate_presence_of.rb +9 -11
- data/lib/remockable/active_record/accept_nested_attributes_for.rb +10 -13
- data/lib/remockable/active_record/belong_to.rb +21 -13
- data/lib/remockable/active_record/have_and_belong_to_many.rb +16 -13
- data/lib/remockable/active_record/have_column.rb +14 -11
- data/lib/remockable/active_record/have_default_scope.rb +38 -20
- data/lib/remockable/active_record/have_index.rb +12 -13
- data/lib/remockable/active_record/have_many.rb +22 -13
- data/lib/remockable/active_record/have_one.rb +21 -13
- data/lib/remockable/active_record/have_scope.rb +40 -25
- data/lib/remockable/active_record/helpers.rb +3 -0
- data/lib/remockable/active_record/validate_associated.rb +9 -11
- data/lib/remockable/active_record/validate_uniqueness_of.rb +19 -11
- data/lib/remockable/helpers.rb +58 -6
- data/lib/remockable/version.rb +1 -1
- data/remockable.gemspec +3 -3
- data/spec/active_model/allow_values_for_spec.rb +19 -13
- data/spec/active_model/validate_acceptance_of_spec.rb +0 -2
- data/spec/active_model/validate_confirmation_of_spec.rb +0 -2
- data/spec/active_model/validate_exclusion_of_spec.rb +7 -9
- data/spec/active_model/validate_format_of_spec.rb +9 -11
- data/spec/active_model/validate_inclusion_of_spec.rb +7 -9
- data/spec/active_model/validate_length_of_spec.rb +16 -18
- data/spec/active_model/validate_numericality_of_spec.rb +14 -16
- data/spec/active_model/validate_presence_of_spec.rb +0 -2
- data/spec/active_record/accept_nested_attributes_for_spec.rb +22 -18
- data/spec/active_record/belong_to_spec.rb +26 -26
- data/spec/active_record/have_and_belong_to_many_spec.rb +22 -20
- data/spec/active_record/have_column_spec.rb +32 -35
- data/spec/active_record/have_default_scope_spec.rb +54 -55
- data/spec/active_record/have_index_spec.rb +24 -27
- data/spec/active_record/have_many_spec.rb +10 -11
- data/spec/active_record/have_one_spec.rb +26 -25
- data/spec/active_record/have_scope_spec.rb +75 -75
- data/spec/active_record/validate_associated_spec.rb +11 -11
- data/spec/active_record/validate_uniqueness_of_spec.rb +11 -13
- data/spec/spec_helper.rb +2 -4
- data/spec/support/active_record_example_group.rb +3 -4
- data/spec/support/class_builder.rb +15 -11
- data/spec/support/shared/a_validation_matcher.rb +25 -25
- data/spec/support/shared/an_active_record_matcher.rb +14 -12
- metadata +60 -84
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ee2c0d5e24fd72b1280d3919d63e2aaf3563dc4f
|
4
|
+
data.tar.gz: ca1a9717a4db8971bc24b37382751cb393929b14
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9c8d53e66884d01edb3ac664b804a000fabff8d5544c613709bcb484e0412517f5dde27441002e41cb0c099ab4313b23d7bbf8647c0f6caf048884af2491b4a4
|
7
|
+
data.tar.gz: a0130e79de52649f5df8af42afe7020fec8b112c650fcad1962dc7d9313b95addee9d598e4037c50ffa7d4d9a0c1dc29fca5a43721d3c19025c0dfa64901c16b
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.3.0 (2014-07-21)
|
4
|
+
|
5
|
+
* Support and require RSpec ~> 3.0 ([Tyler Hunt][tylerhunt])
|
6
|
+
* Improve documentation ([Olivier Lacan][olivierlacan])
|
7
|
+
|
3
8
|
## 0.2.1 (2013-10-18)
|
4
9
|
|
5
10
|
* Require Rails ~> 4.0 ([Tyler Hunt][tylerhunt])
|
@@ -84,4 +89,5 @@
|
|
84
89
|
* Initial release ([Tyler Hunt][tylerhunt])
|
85
90
|
|
86
91
|
[jswanner]: https://github.com/jswanner
|
92
|
+
[olivierlacan]: https://github.com/olivierlacan
|
87
93
|
[tylerhunt]: https://github.com/tylerhunt
|
data/README.markdown
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
# Remockable
|
2
2
|
|
3
|
-
[![Build Status][travis-image]][travis]
|
3
|
+
[![Build Status][travis-image]][travis] [![Dependency Status][gemnasium-image]][gemnasium] [![Gem Version][rubygems-image]][rubygems]
|
4
4
|
|
5
5
|
[travis]: http://travis-ci.org/tylerhunt/remockable
|
6
6
|
[travis-image]: https://secure.travis-ci.org/tylerhunt/remockable.png
|
7
|
+
[gemnasium]: https://gemnasium.com/tylerhunt/remockable
|
8
|
+
[gemnasium-image]: https://gemnasium.com/tylerhunt/remockable.png
|
9
|
+
[rubygems]: http://badge.fury.io/rb/remockable
|
10
|
+
[rubygems-image]: https://badge.fury.io/rb/remockable.png
|
7
11
|
|
8
|
-
A collection of RSpec
|
12
|
+
A collection of RSpec 3 matchers to simplify your web app specs.
|
9
13
|
|
10
14
|
*Note:* Rails 3 support was dropped in version 0.2.
|
11
15
|
|
@@ -20,13 +24,13 @@ release of Rails 3 and 4.
|
|
20
24
|
In looking at the code for Remarkable to determine the feasibility of continuing
|
21
25
|
work on Remarkable itself, it seems clear that the scope of that project has
|
22
26
|
outgrown its usefulness for most users. It was with this conclusion in mind that
|
23
|
-
Remockable was born. It
|
27
|
+
Remockable was born. It’s an attempt to start with a clean slate but maintain
|
24
28
|
the original goal of Remarkable in spirit.
|
25
29
|
|
26
30
|
|
27
31
|
## Installation
|
28
32
|
|
29
|
-
Add this line to your application
|
33
|
+
Add this line to your application’s `Gemfile`:
|
30
34
|
|
31
35
|
``` ruby
|
32
36
|
gem 'remockable'
|
@@ -74,6 +78,16 @@ The following Active Record matchers are supported:
|
|
74
78
|
* `validate_associated`
|
75
79
|
* `validate_uniqueness_of`
|
76
80
|
|
81
|
+
### Options
|
82
|
+
|
83
|
+
Options may be passed to the matchers in the same way they’re passed to the
|
84
|
+
macros. For instance, when dealing with `has_many :through` associations, you
|
85
|
+
could specify the following:
|
86
|
+
|
87
|
+
``` ruby
|
88
|
+
it { should have_many :subscriptions, through: :customers }
|
89
|
+
```
|
90
|
+
|
77
91
|
|
78
92
|
## Contributing
|
79
93
|
|
@@ -1,32 +1,33 @@
|
|
1
1
|
RSpec::Matchers.define(:allow_values_for) do |*attribute_and_values|
|
2
|
-
|
3
|
-
|
2
|
+
def values
|
3
|
+
expected_as_array[1..-1]
|
4
|
+
end
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
subject.
|
6
|
+
match do |actual|
|
7
|
+
values.all? do |value|
|
8
|
+
allow(subject).to receive(attribute).and_return(value)
|
8
9
|
subject.valid?
|
9
|
-
subject.errors[
|
10
|
+
subject.errors[attribute].empty?
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
subject.
|
14
|
+
match_when_negated do |actual|
|
15
|
+
values.none? do |value|
|
16
|
+
allow(subject).to receive(attribute).and_return(value)
|
16
17
|
subject.valid?
|
17
|
-
subject.errors[
|
18
|
+
subject.errors[attribute].empty?
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
|
-
|
22
|
+
failure_message do |actual|
|
22
23
|
"Expected #{actual.class.name} to #{description}"
|
23
24
|
end
|
24
25
|
|
25
|
-
|
26
|
+
failure_message_when_negated do |actual|
|
26
27
|
"Did not expect #{actual.class.name} to #{description}"
|
27
28
|
end
|
28
29
|
|
29
30
|
description do
|
30
|
-
"allow the values #{
|
31
|
+
"allow the values #{values.collect(&:inspect).to_sentence} for #{attribute}"
|
31
32
|
end
|
32
33
|
end
|
@@ -1,28 +1,29 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
1
3
|
require 'remockable/helpers'
|
2
4
|
|
3
5
|
module Remockable
|
4
6
|
module ActiveModel
|
5
7
|
module Helpers
|
8
|
+
extend ActiveSupport::Concern
|
6
9
|
include Remockable::Helpers
|
7
10
|
|
8
11
|
CONDITIONALS = [:if, :unless]
|
9
12
|
|
10
|
-
attr_reader :type
|
11
|
-
|
12
13
|
def validator_for(attribute)
|
13
14
|
subject.class.validators_on(attribute).detect do |validator|
|
14
15
|
validator.kind == type
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
|
-
def options_match(validator,
|
19
|
-
actual = validator.options.slice(*(
|
20
|
-
actual ==
|
19
|
+
def options_match(validator, options=options)
|
20
|
+
actual = validator.options.slice(*(options.keys - CONDITIONALS))
|
21
|
+
actual == options.except(*CONDITIONALS)
|
21
22
|
end
|
22
23
|
|
23
24
|
def conditionals_match(validator)
|
24
25
|
CONDITIONALS.all? do |option|
|
25
|
-
expected_value =
|
26
|
+
expected_value = options[option]
|
26
27
|
|
27
28
|
if !expected_value.nil? && expected_value.is_a?(Symbol)
|
28
29
|
validator.options[option] == expected_value
|
@@ -1,27 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_acceptance_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_acceptance_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :acceptance
|
7
5
|
|
8
|
-
valid_options %
|
6
|
+
valid_options %i(allow_nil accept if message on unless)
|
9
7
|
|
10
8
|
match do |actual|
|
11
|
-
validator = validator_for(
|
9
|
+
validator = validator_for(attribute)
|
12
10
|
validator && options_match(validator) && conditionals_match(validator)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
13
|
+
failure_message do |actual|
|
16
14
|
"Expected #{subject.class.name} to #{description}"
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
20
18
|
"Did not expect #{subject.class.name} to #{description}"
|
21
19
|
end
|
22
20
|
|
23
21
|
description do
|
24
|
-
with = " with #{
|
25
|
-
"validate #{type} of #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"validate #{type} of #{attribute}#{with}"
|
26
24
|
end
|
27
25
|
end
|
@@ -1,27 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_confirmation_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_confirmation_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :confirmation
|
7
5
|
|
8
|
-
valid_options %
|
6
|
+
valid_options %i(if message on unless)
|
9
7
|
|
10
8
|
match do |actual|
|
11
|
-
validator = validator_for(
|
9
|
+
validator = validator_for(attribute)
|
12
10
|
validator && options_match(validator) && conditionals_match(validator)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
13
|
+
failure_message do |actual|
|
16
14
|
"Expected #{subject.class.name} to #{description}"
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
20
18
|
"Did not expect #{subject.class.name} to #{description}"
|
21
19
|
end
|
22
20
|
|
23
21
|
description do
|
24
|
-
with = " with #{
|
25
|
-
"validate #{type} of #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"validate #{type} of #{attribute}#{with}"
|
26
24
|
end
|
27
25
|
end
|
@@ -1,27 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_exclusion_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_exclusion_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :exclusion
|
7
5
|
|
8
|
-
valid_options %
|
6
|
+
valid_options %i(allow_nil allow_blank if in message on unless)
|
9
7
|
|
10
8
|
match do |actual|
|
11
|
-
validator = validator_for(
|
9
|
+
validator = validator_for(attribute)
|
12
10
|
validator && options_match(validator) && conditionals_match(validator)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
13
|
+
failure_message do |actual|
|
16
14
|
"Expected #{subject.class.name} to #{description}"
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
20
18
|
"Did not expect #{subject.class.name} to #{description}"
|
21
19
|
end
|
22
20
|
|
23
21
|
description do
|
24
|
-
with = " with #{
|
25
|
-
"validate #{type} of #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"validate #{type} of #{attribute}#{with}"
|
26
24
|
end
|
27
25
|
end
|
@@ -1,27 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_format_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_format_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :format
|
7
5
|
|
8
|
-
valid_options %
|
6
|
+
valid_options %i(allow_blank allow_nil if message on unless with without)
|
9
7
|
|
10
8
|
match do |actual|
|
11
|
-
validator = validator_for(
|
9
|
+
validator = validator_for(attribute)
|
12
10
|
validator && options_match(validator) && conditionals_match(validator)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
13
|
+
failure_message do |actual|
|
16
14
|
"Expected #{subject.class.name} to #{description}"
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
20
18
|
"Did not expect #{subject.class.name} to #{description}"
|
21
19
|
end
|
22
20
|
|
23
21
|
description do
|
24
|
-
with = " with #{
|
25
|
-
"validate #{type} of #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"validate #{type} of #{attribute}#{with}"
|
26
24
|
end
|
27
25
|
end
|
@@ -1,27 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_inclusion_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_inclusion_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :inclusion
|
7
5
|
|
8
|
-
valid_options %
|
6
|
+
valid_options %i(allow_nil allow_blank if in message on unless)
|
9
7
|
|
10
8
|
match do |actual|
|
11
|
-
validator = validator_for(
|
9
|
+
validator = validator_for(attribute)
|
12
10
|
validator && options_match(validator) && conditionals_match(validator)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
13
|
+
failure_message do |actual|
|
16
14
|
"Expected #{subject.class.name} to #{description}"
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
20
18
|
"Did not expect #{subject.class.name} to #{description}"
|
21
19
|
end
|
22
20
|
|
23
21
|
description do
|
24
|
-
with = " with #{
|
25
|
-
"validate #{type} of #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"validate #{type} of #{attribute}#{with}"
|
26
24
|
end
|
27
25
|
end
|
@@ -1,41 +1,54 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_length_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_length_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :length
|
7
5
|
|
8
|
-
unsupported_options %
|
9
|
-
|
10
|
-
|
6
|
+
unsupported_options %i(tokenizer)
|
7
|
+
|
8
|
+
valid_options %i(
|
9
|
+
allow_blank
|
10
|
+
allow_nil
|
11
|
+
if
|
12
|
+
in
|
13
|
+
is
|
14
|
+
maximum
|
15
|
+
message
|
16
|
+
minimum
|
17
|
+
on
|
18
|
+
too_long
|
19
|
+
too_short
|
20
|
+
unless
|
21
|
+
within
|
22
|
+
wrong_length
|
23
|
+
)
|
11
24
|
|
12
25
|
match do |actual|
|
13
|
-
if validator = validator_for(
|
14
|
-
options_match = options_match(validator,
|
26
|
+
if validator = validator_for(attribute)
|
27
|
+
options_match = options_match(validator, normalized_options)
|
15
28
|
conditionals_match = conditionals_match(validator)
|
16
29
|
options_match && conditionals_match
|
17
30
|
end
|
18
31
|
end
|
19
32
|
|
20
|
-
def
|
21
|
-
|
22
|
-
if within =
|
23
|
-
|
24
|
-
|
33
|
+
def normalized_options
|
34
|
+
options.dup.tap do |options|
|
35
|
+
if within = options.delete(:within) || options.delete(:in)
|
36
|
+
options[:minimum] = within.first
|
37
|
+
options[:maximum] = within.last
|
25
38
|
end
|
26
39
|
end
|
27
40
|
end
|
28
41
|
|
29
|
-
|
42
|
+
failure_message do |actual|
|
30
43
|
"Expected #{subject.class.name} to #{description}"
|
31
44
|
end
|
32
45
|
|
33
|
-
|
46
|
+
failure_message_when_negated do |actual|
|
34
47
|
"Did not expect #{subject.class.name} to #{description}"
|
35
48
|
end
|
36
49
|
|
37
50
|
description do
|
38
|
-
with = " with #{
|
39
|
-
"validate #{type} of #{
|
51
|
+
with = " with #{options.inspect}" if options.any?
|
52
|
+
"validate #{type} of #{attribute}#{with}"
|
40
53
|
end
|
41
54
|
end
|
@@ -1,28 +1,39 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_numericality_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_numericality_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :numericality
|
7
5
|
|
8
|
-
valid_options %
|
9
|
-
|
6
|
+
valid_options %i(
|
7
|
+
allow_nil
|
8
|
+
equal_to
|
9
|
+
even
|
10
|
+
greater_than
|
11
|
+
greater_than_or_equal_to
|
12
|
+
if
|
13
|
+
less_than
|
14
|
+
less_than_or_equal_to
|
15
|
+
message
|
16
|
+
odd
|
17
|
+
on
|
18
|
+
only_integer
|
19
|
+
unless
|
20
|
+
)
|
10
21
|
|
11
22
|
match do |actual|
|
12
|
-
validator = validator_for(
|
23
|
+
validator = validator_for(attribute)
|
13
24
|
validator && options_match(validator) && conditionals_match(validator)
|
14
25
|
end
|
15
26
|
|
16
|
-
|
27
|
+
failure_message do |actual|
|
17
28
|
"Expected #{subject.class.name} to #{description}"
|
18
29
|
end
|
19
30
|
|
20
|
-
|
31
|
+
failure_message_when_negated do |actual|
|
21
32
|
"Did not expect #{subject.class.name} to #{description}"
|
22
33
|
end
|
23
34
|
|
24
35
|
description do
|
25
|
-
with = " with #{
|
26
|
-
"validate #{type} of #{
|
36
|
+
with = " with #{options.inspect}" if options.any?
|
37
|
+
"validate #{type} of #{attribute}#{with}"
|
27
38
|
end
|
28
39
|
end
|
@@ -1,27 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:validate_presence_of) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:validate_presence_of) do
|
2
|
+
include Remockable::ActiveModel::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
@expected = attribute.extract_options!
|
6
|
-
@attribute = attribute.shift
|
4
|
+
type :presence
|
7
5
|
|
8
|
-
valid_options %
|
6
|
+
valid_options %i(if message on unless)
|
9
7
|
|
10
8
|
match do |actual|
|
11
|
-
validator = validator_for(
|
9
|
+
validator = validator_for(attribute)
|
12
10
|
validator && options_match(validator) && conditionals_match(validator)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
13
|
+
failure_message do |actual|
|
16
14
|
"Expected #{subject.class.name} to #{description}"
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
20
18
|
"Did not expect #{subject.class.name} to #{description}"
|
21
19
|
end
|
22
20
|
|
23
21
|
description do
|
24
|
-
with = " with #{
|
25
|
-
"validate #{type} of #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"validate #{type} of #{attribute}#{with}"
|
26
24
|
end
|
27
25
|
end
|
@@ -1,28 +1,25 @@
|
|
1
|
-
RSpec::Matchers.define(:accept_nested_attributes_for) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:accept_nested_attributes_for) do
|
2
|
+
include Remockable::ActiveRecord::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
unsupported_options %w(reject_if)
|
8
|
-
valid_options %w(allow_destroy limit update_only)
|
4
|
+
unsupported_options %i(reject_if)
|
5
|
+
valid_options %i(allow_destroy limit update_only)
|
9
6
|
|
10
7
|
match do |actual|
|
11
|
-
if
|
12
|
-
|
8
|
+
if actual_options = subject.class.nested_attributes_options[attribute]
|
9
|
+
actual_options.slice(*options.keys) == options
|
13
10
|
end
|
14
11
|
end
|
15
12
|
|
16
|
-
|
13
|
+
failure_message do |actual|
|
17
14
|
"Expected #{subject.class.name} to #{description}"
|
18
15
|
end
|
19
16
|
|
20
|
-
|
17
|
+
failure_message_when_negated do |actual|
|
21
18
|
"Did not expect #{subject.class.name} to #{description}"
|
22
19
|
end
|
23
20
|
|
24
21
|
description do
|
25
|
-
with = " with #{
|
26
|
-
"accept nested attributes for #{
|
22
|
+
with = " with #{options.inspect}" if options.any?
|
23
|
+
"accept nested attributes for #{attribute}#{with}"
|
27
24
|
end
|
28
25
|
end
|
@@ -1,30 +1,38 @@
|
|
1
|
-
RSpec::Matchers.define(:belong_to) do
|
2
|
-
|
1
|
+
RSpec::Matchers.define(:belong_to) do
|
2
|
+
include Remockable::ActiveRecord::Helpers
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
valid_options %i(
|
5
|
+
autosave
|
6
|
+
class_name
|
7
|
+
counter_cache
|
8
|
+
dependent
|
9
|
+
foreign_key
|
10
|
+
foreign_type
|
11
|
+
inverse_of
|
12
|
+
polymorphic
|
13
|
+
primary_key
|
14
|
+
touch
|
15
|
+
validate
|
16
|
+
)
|
9
17
|
|
10
18
|
match do |actual|
|
11
|
-
if association = subject.class.reflect_on_association(
|
19
|
+
if association = subject.class.reflect_on_association(attribute)
|
12
20
|
macro_matches = association.macro == :belongs_to
|
13
|
-
options_match = association.options.slice(*
|
21
|
+
options_match = association.options.slice(*options.keys) == options
|
14
22
|
macro_matches && options_match
|
15
23
|
end
|
16
24
|
end
|
17
25
|
|
18
|
-
|
26
|
+
failure_message do |actual|
|
19
27
|
"Expected #{subject.class.name} to #{description}"
|
20
28
|
end
|
21
29
|
|
22
|
-
|
30
|
+
failure_message_when_negated do |actual|
|
23
31
|
"Did not expect #{subject.class.name} to #{description}"
|
24
32
|
end
|
25
33
|
|
26
34
|
description do
|
27
|
-
with = " with #{
|
28
|
-
"belong to #{
|
35
|
+
with = " with #{options.inspect}" if options.any?
|
36
|
+
"belong to #{attribute}#{with}"
|
29
37
|
end
|
30
38
|
end
|