smart_rspec 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,173 +1,234 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'SmartRspec Matchers' do
4
- describe '#be_ascending' do
5
- context 'when valid' do
6
- it { expect([1, 2, 3, 4]).to be_ascending }
7
- end
3
+ describe SmartRspec::Matchers do
4
+ describe BeMatchers do
5
+ describe '#be_ascending' do
6
+ context 'positive assertion' do
7
+ it { expect([1, 2, 3, 4]).to be_ascending }
8
+ end
8
9
 
9
- context 'when invalid' do
10
- it { expect([1, 4, 2, 3]).not_to be_ascending }
10
+ context 'negative assertion' do
11
+ it { expect([1, 4, 2, 3]).not_to be_ascending }
12
+ end
11
13
  end
12
- end
13
14
 
14
- describe '#be_boolean' do
15
- context 'when valid' do
16
- it { expect(true).to be_boolean }
17
- it { expect(false).to be_boolean }
18
- end
15
+ describe '#be_boolean' do
16
+ context 'positive assertion' do
17
+ it { expect(true).to be_boolean }
18
+ it { expect(false).to be_boolean }
19
+ end
19
20
 
20
- context 'when invalid' do
21
- it { expect('true').not_to be_boolean }
22
- it { expect(1).not_to be_boolean }
23
- it { expect(%w(foo bar)).not_to be_boolean }
21
+ context 'negative assertion' do
22
+ it { expect('true').not_to be_boolean }
23
+ it { expect(1).not_to be_boolean }
24
+ it { expect(%w(foo bar)).not_to be_boolean }
25
+ end
24
26
  end
25
- end
26
27
 
27
- describe '#be_descending' do
28
- context 'when valid' do
29
- it { expect([4, 3, 2, 1]).to be_descending }
30
- end
28
+ describe '#be_descending' do
29
+ context 'positive assertion' do
30
+ it { expect([4, 3, 2, 1]).to be_descending }
31
+ end
31
32
 
32
- context 'when invalid' do
33
- it { expect([1, 2, 3, 4]).not_to be_descending }
33
+ context 'negative assertion' do
34
+ it { expect([1, 2, 3, 4]).not_to be_descending }
35
+ end
34
36
  end
35
- end
36
37
 
37
- describe '#be_email' do
38
- context 'when valid' do
39
- it { expect(Faker::Internet.email).to be_email }
40
- it { expect('tiagopog@gmail.com').to be_email }
41
- it { expect('foo@bar.com.br').to be_email }
42
- end
38
+ describe '#be_email' do
39
+ context 'positive assertion' do
40
+ it { expect(Faker::Internet.email).to be_email }
41
+ it { expect('tiagopog@gmail.com').to be_email }
42
+ it { expect('foo@bar.com.br').to be_email }
43
+ end
43
44
 
44
- context 'when invalid' do
45
- it { expect('foo@bar').not_to be_email }
46
- it { expect('foo@').not_to be_email }
47
- it { expect('@bar').not_to be_email }
48
- it { expect('@bar.com').not_to be_email }
49
- it { expect('foo bar@bar.com').not_to be_email }
45
+ context 'negative assertion' do
46
+ it { expect('foo@bar').not_to be_email }
47
+ it { expect('foo@').not_to be_email }
48
+ it { expect('@bar').not_to be_email }
49
+ it { expect('@bar.com').not_to be_email }
50
+ it { expect('foo bar@bar.com').not_to be_email }
51
+ end
50
52
  end
51
- end
52
53
 
53
- describe '#be_url' do
54
- context 'when valid' do
55
- it { expect(Faker::Internet.url).to be_url }
56
- it { expect('http://adtangerine.com').to be_url }
57
- it { expect('http://www.facebook.com').to be_url }
58
- it { expect('www.twitflink.com').to be_url }
59
- it { expect('google.com.br').to be_url }
60
- end
54
+ describe '#be_url' do
55
+ context 'positive assertion' do
56
+ it { expect(Faker::Internet.url).to be_url }
57
+ it { expect('http://adtangerine.com').to be_url }
58
+ it { expect('http://www.facebook.com').to be_url }
59
+ it { expect('www.twitflink.com').to be_url }
60
+ it { expect('google.com.br').to be_url }
61
+ end
61
62
 
62
- context 'when invalid' do
63
- it { expect('foobar.bar').not_to be_url }
64
- it { expect('foobar').not_to be_url }
65
- it { expect('foo bar.com.br').not_to be_url }
63
+ context 'negative assertion' do
64
+ it { expect('foobar.bar').not_to be_url }
65
+ it { expect('foobar').not_to be_url }
66
+ it { expect('foo bar.com.br').not_to be_url }
67
+ end
66
68
  end
67
- end
68
69
 
69
- describe '#be_image_url' do
70
- context 'when valid' do
71
- it { expect(Faker::Company.logo).to be_image_url }
72
- it { expect('http://foobar.com/foo.jpg').to be_image_url }
73
- it { expect('http://foobar.com/foo.jpg').to be_image_url(:jpg) }
74
- it { expect('http://foobar.com/foo.gif').to be_image_url(:gif) }
75
- it { expect('http://foobar.com/foo.png').to be_image_url(:png) }
76
- it { expect('http://foobar.com/foo.png').to be_image_url([:jpg, :png]) }
77
- it { expect('http://foobar.com/foo/bar?image=foo.jpg').to be_image_url }
78
- end
70
+ describe '#be_image_url' do
71
+ context 'positive assertion' do
72
+ it { expect(Faker::Company.logo).to be_image_url }
73
+ it { expect('http://foobar.com/foo.jpg').to be_image_url }
74
+ it { expect('http://foobar.com/foo.jpg').to be_image_url(:jpg) }
75
+ it { expect('http://foobar.com/foo.gif').to be_image_url(:gif) }
76
+ it { expect('http://foobar.com/foo.png').to be_image_url(:png) }
77
+ it { expect('http://foobar.com/foo.png').to be_image_url([:jpg, :png]) }
78
+ it { expect('http://foobar.com/foo/bar?image=foo.jpg').to be_image_url }
79
+ end
79
80
 
80
- context 'when invalid' do
81
- it { expect('http://foobar.com').not_to be_image_url }
82
- it { expect('http://foobar.com/foo.jpg').not_to be_image_url(:gif) }
83
- it { expect('http://foobar.com/foo.gif').not_to be_image_url(:png) }
84
- it { expect('http://foobar.com/foo.png').not_to be_image_url(:jpg) }
85
- it { expect('http://foobar.com/foo.gif').not_to be_image_url([:jpg, :png]) }
81
+ context 'negative assertion' do
82
+ it { expect('http://foobar.com').not_to be_image_url }
83
+ it { expect('http://foobar.com/foo.jpg').not_to be_image_url(:gif) }
84
+ it { expect('http://foobar.com/foo.gif').not_to be_image_url(:png) }
85
+ it { expect('http://foobar.com/foo.png').not_to be_image_url(:jpg) }
86
+ it { expect('http://foobar.com/foo.gif').not_to be_image_url([:jpg, :png]) }
87
+ end
86
88
  end
87
- end
88
89
 
89
- describe '#have' do
90
- context 'when valid' do
91
- it { expect([1]).to have(1).item }
92
- it { expect(%w(foo bar)).to have(2).items }
93
- end
90
+ describe '#be_a_list_of' do
91
+ context 'positive assertion' do
92
+ subject { Array.new(3, User.new) }
93
+ it { is_expected.to be_a_list_of(User) }
94
+ end
94
95
 
95
- context 'when invalid' do
96
- it { expect([1]).not_to have(2).items }
97
- it { expect(%w(foo bar)).not_to have(1).item }
96
+ context 'negative assertion' do
97
+ subject { Array.new(3, User.new) << nil }
98
+ it { is_expected.to_not be_a_list_of(User) }
99
+ end
98
100
  end
99
101
  end
100
102
 
101
- describe '#have_at_least' do
102
- context 'when valid' do
103
- it { expect(%w(foo bar foobar)).to have_at_least(3).items }
104
- end
105
- end
103
+ describe JsonApiMatchers do
104
+ subject(:response) { Fixtures::Response.new }
105
+
106
+ describe '#have_primary_data' do
107
+ context 'positive assertion' do
108
+ it do
109
+ expect(response).to have_primary_data('users')
110
+ end
111
+ end
106
112
 
107
- describe '#have_at_most' do
108
- context 'when valid' do
109
- it { expect(%w(foo bar foobar)).to have_at_most(3).items }
113
+ context 'negative assertion' do
114
+ it do
115
+ expect(response).not_to have_primary_data('foobar')
116
+ end
117
+ end
110
118
  end
111
- end
112
119
 
113
- describe '#have_error_on' do
114
- subject { User.new(email: nil, name: Faker::Name.name) }
120
+ describe '#have_data_attributes' do
121
+ let(:fields) { %w(first_name last_name full_name birthday) }
122
+
123
+ context 'positive assertion' do
124
+ it do
125
+ expect(response).to have_data_attributes(fields)
126
+ end
127
+ end
115
128
 
116
- context 'when valid' do
117
- it do
118
- subject.valid?
119
- is_expected.to have_error_on(:email)
129
+ context 'negative assertion' do
130
+ it do
131
+ expect(response).not_to have_data_attributes(fields + %w(foobar))
132
+ end
120
133
  end
121
134
  end
122
135
 
123
- context 'when invalid' do
124
- it do
125
- subject.valid?
126
- is_expected.not_to have_error_on(:name)
136
+ describe '#have_relationships' do
137
+ let(:relationships) { %w(posts) }
138
+
139
+ context 'positive assertion' do
140
+ it do
141
+ expect(response).to have_relationships(relationships)
142
+ end
143
+ end
144
+
145
+ context 'negative assertion' do
146
+ it do
147
+ expect(response).not_to have_relationships(relationships + %w(foobar))
148
+ end
127
149
  end
128
150
  end
129
- end
130
151
 
131
- describe '#include_items' do
132
- context 'when valid' do
133
- it { expect(%w(foo bar foobar)).to include_items(%w(foo bar foobar)) }
134
- it { expect(%w(lorem ipsum)).to include_items('lorem', 'ipsum') }
135
- it { expect([1, 'foo', ['bar']]).to include_items([1, 'foo', ['bar']]) }
152
+ describe '#have_included_relationships' do
153
+ let(:relationships) { %w(posts) }
154
+
155
+ context 'positive assertion' do
156
+ it do
157
+ expect(response).to have_included_relationships
158
+ end
159
+ end
136
160
  end
137
161
 
138
- context 'when invalid' do
139
- it { expect(%w(foo bar foobar)).not_to include_items(%w(lorem)) }
162
+ describe '#have_meta_record_count' do
163
+ context 'positive assertion' do
164
+ it do
165
+ expect(response).to have_meta_record_count(2)
166
+ end
167
+ end
168
+
169
+ context 'negative assertion' do
170
+ it do
171
+ expect(response).not_to have_meta_record_count(3)
172
+ end
173
+ end
140
174
  end
141
175
  end
142
176
 
143
- describe '#be_a_list_of' do
144
- context 'when valid' do
145
- subject { Array.new(3, User.new) }
146
- it { is_expected.to be_a_list_of(User) }
177
+ describe OtherMatchers do
178
+ describe '#have_error_on' do
179
+ subject { User.new(email: nil, name: Faker::Name.name) }
180
+
181
+ context 'positive assertion' do
182
+ it do
183
+ subject.valid?
184
+ is_expected.to have_error_on(:email)
185
+ end
186
+ end
187
+
188
+ context 'negative assertion' do
189
+ it do
190
+ subject.valid?
191
+ is_expected.not_to have_error_on(:name)
192
+ end
193
+ end
147
194
  end
148
195
 
149
- context 'when invalid' do
150
- subject { Array.new(3, User.new) << nil }
151
- it { is_expected.to_not be_a_list_of(User) }
196
+ describe '#include_items' do
197
+ context 'positive assertion' do
198
+ it { expect(%w(foo bar foobar)).to include_items(%w(foo bar foobar)) }
199
+ it { expect(%w(lorem ipsum)).to include_items('lorem', 'ipsum') }
200
+ it { expect([1, 'foo', ['bar']]).to include_items([1, 'foo', ['bar']]) }
201
+ end
202
+
203
+ context 'negative assertion' do
204
+ it { expect(%w(foo bar foobar)).not_to include_items(%w(lorem)) }
205
+ end
152
206
  end
153
207
  end
154
208
 
155
- describe '#be_a_bad_request' do
156
- let(:response) { double('http response') }
209
+ describe ::RSpec::CollectionMatchers do
210
+ describe '#have' do
211
+ context 'positive assertion' do
212
+ it { expect([1]).to have(1).item }
213
+ it { expect(%w(foo bar)).to have(2).items }
214
+ end
157
215
 
158
- context 'ok' do
159
- before { allow(response).to receive(:code).and_return(200) }
160
- it { expect(response).to_not be_a_bad_request }
216
+ context 'negative assertion' do
217
+ it { expect([1]).not_to have(2).items }
218
+ it { expect(%w(foo bar)).not_to have(1).item }
219
+ end
161
220
  end
162
221
 
163
- context 'not found' do
164
- before { allow(response).to receive(:code).and_return(404) }
165
- it { expect(response).to be_a_bad_request }
222
+ describe '#have_at_least' do
223
+ context 'positive assertion' do
224
+ it { expect(%w(foo bar foobar)).to have_at_least(3).items }
225
+ end
166
226
  end
167
227
 
168
- context 'unauthorized' do
169
- before { allow(response).to receive(:code).and_return(401) }
170
- it { expect(response).to be_a_bad_request }
228
+ describe '#have_at_most' do
229
+ context 'positive assertion' do
230
+ it { expect(%w(foo bar foobar)).to have_at_most(3).items }
231
+ end
171
232
  end
172
233
  end
173
234
  end
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,7 @@ require 'bundler/setup'
2
2
  require 'rubygems'
3
3
  require 'smart_rspec'
4
4
  require 'faker'
5
- require 'factories/user'
6
-
7
- include Factories
5
+ require 'fixtures/user'
6
+ require 'fixtures/response'
8
7
 
8
+ include Fixtures
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Guedes
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-13 00:00:00.000000000 Z
11
+ date: 2021-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '4.1'
19
+ version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '4.1'
26
+ version: '6.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec-collection_matchers
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -50,56 +50,56 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.6'
53
+ version: '2.0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.6'
60
+ version: '2.0'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: faker
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.4'
67
+ version: '2.0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '1.4'
74
+ version: '2.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: rake
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '10.0'
81
+ version: '13.0'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '10.0'
88
+ version: '13.0'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: rspec
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '3.2'
95
+ version: '3.5'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '3.2'
102
+ version: '3.5'
103
103
  description: Collection of useful macros and matchers for RSpec tests of models/controllers
104
104
  in Rails-based apps.
105
105
  email:
@@ -119,13 +119,17 @@ files:
119
119
  - lib/smart_rspec/macros.rb
120
120
  - lib/smart_rspec/matchers.rb
121
121
  - lib/smart_rspec/matchers/be_matchers.rb
122
+ - lib/smart_rspec/matchers/json_api_matchers.rb
122
123
  - lib/smart_rspec/matchers/other_matchers.rb
123
- - lib/smart_rspec/support/assertions.rb
124
- - lib/smart_rspec/support/expectations.rb
124
+ - lib/smart_rspec/support/controller/response.rb
125
+ - lib/smart_rspec/support/model/assertions.rb
126
+ - lib/smart_rspec/support/model/expectations.rb
125
127
  - lib/smart_rspec/support/regexes.rb
126
128
  - lib/smart_rspec/version.rb
127
129
  - smart_rspec.gemspec
128
- - spec/factories/user.rb
130
+ - spec/fixtures/response.rb
131
+ - spec/fixtures/user.rb
132
+ - spec/fixtures/users.json
129
133
  - spec/smart_rspec/macros_spec.rb
130
134
  - spec/smart_rspec/matchers_spec.rb
131
135
  - spec/spec_helper.rb
@@ -133,7 +137,7 @@ homepage: https://github.com/tiagopog/smart_rspec
133
137
  licenses:
134
138
  - MIT
135
139
  metadata: {}
136
- post_install_message:
140
+ post_install_message:
137
141
  rdoc_options: []
138
142
  require_paths:
139
143
  - lib
@@ -148,13 +152,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
152
  - !ruby/object:Gem::Version
149
153
  version: '0'
150
154
  requirements: []
151
- rubyforge_project:
152
- rubygems_version: 2.4.6
153
- signing_key:
155
+ rubyforge_project:
156
+ rubygems_version: 2.7.7
157
+ signing_key:
154
158
  specification_version: 4
155
159
  summary: Macros and matchers to make your RSpec tests even more amazing.
156
160
  test_files:
157
- - spec/factories/user.rb
161
+ - spec/fixtures/response.rb
162
+ - spec/fixtures/user.rb
163
+ - spec/fixtures/users.json
158
164
  - spec/smart_rspec/macros_spec.rb
159
165
  - spec/smart_rspec/matchers_spec.rb
160
166
  - spec/spec_helper.rb
@@ -1,119 +0,0 @@
1
- module SmartRspec
2
- module Support
3
- module Assertions
4
- private_class_method
5
-
6
- def validates_email_of(attr, validation)
7
- it 'has an invalid format' do
8
- %w(foobar foobar@ @foobar foo@bar).each do |e|
9
- validation_expectation(attr, e)
10
- end
11
- end
12
- end
13
-
14
- def validates_exclusion_of(attr, validation)
15
- it 'has a reserved value' do
16
- validation_expectation(attr, validation[:in].sample)
17
- end
18
- end
19
-
20
- def validates_format_of(attr, validation)
21
- it 'does not match the required format' do
22
- mock, with =
23
- validation.values_at(:mock).first,
24
- validation.values_at(:with).first
25
-
26
- if mock && with && with !~ mock
27
- validation_expectation(attr, mock)
28
- else
29
- raise ArgumentError, ':with and :mock are required when using the :format validation'
30
- end
31
- end
32
- end
33
-
34
- def validates_inclusion_of(attr, validation)
35
- it 'is out of the scope of possible values' do
36
- begin
37
- value = SecureRandom.hex
38
- end while validation[:in].include?(value)
39
- validation_expectation(attr, value)
40
- end
41
- end
42
-
43
- def validates_length_of(attr, validation)
44
- validation.each do |key, value|
45
- next unless [:in, :is, :maximum, :minimum, :within].include?(key)
46
- txt, n = build_length_validation(key, value)
47
- it txt do
48
- validation_expectation(attr, 'x' * n)
49
- end
50
- end
51
- end
52
-
53
- def validates_presence_of(attr, validation)
54
- it 'is blank' do
55
- validation_expectation(attr, nil)
56
- end
57
- end
58
-
59
- def validates_uniqueness_of(attr, validation)
60
- scoped = scoped_validation?(validation)
61
- it "is already in use#{" (scope: #{validation[:scope]})" if scoped}" do
62
- mock =
63
- if scoped
64
- copy = subject.send(validation[:scope])
65
- validation[:mock].send("#{validation[:scope]}=", copy)
66
- validation[:mock]
67
- else
68
- subject.dup
69
- end
70
- subject.save unless subject.persisted?
71
- validation_expectation(attr, subject.send(attr), mock)
72
- end
73
- end
74
-
75
- def assert_has_attributes(attrs, options)
76
- type_str = build_type_str(options)
77
-
78
- attrs.each do |attr|
79
- it %Q(has an attribute named "#{attr}"#{type_str}) do
80
- expect(subject).to respond_to(attr)
81
- has_attributes_expectation(attr, options)
82
- end
83
- end
84
- end
85
-
86
- def assert_association(type, associations)
87
- associations.each do |model|
88
- it "#{type.to_s.gsub('_', ' ')} #{model}" do
89
- expect(subject).to respond_to(model)
90
- association_expectation(type, model)
91
- end
92
- end
93
- end
94
-
95
- def build_length_validation(key, value)
96
- case key
97
- when :in, :within then ['is out of the length range', value.max + 1]
98
- when :is, :minimum then ["is #{key == :is ? 'invalid' : 'too short'}", value - 1]
99
- when :maximum then ['is too long', value + 1]
100
- end
101
- end
102
-
103
- def build_type_str(options)
104
- if !options.nil? && options[:type]
105
- " (%s%s%s)" % [
106
- ('Enumerated ' if options[:enum]),
107
- options[:type],
108
- (", default: #{options[:default]}" if options[:default])
109
- ]
110
- end
111
- end
112
-
113
- def scoped_validation?(validation)
114
- validation.is_a?(Hash) && ([:scope, :mock] - validation.keys).empty?
115
- end
116
- end
117
- end
118
- end
119
-
@@ -1,42 +0,0 @@
1
- module SmartRspec
2
- module Support
3
- module Expectations
4
- def validation_expectation(attr, value = nil, mock = nil)
5
- mock ||= subject
6
- mock.send("#{attr}=", value)
7
-
8
- expect(mock).not_to be_valid
9
- expect(mock).to have_error_on(attr)
10
- end
11
-
12
- def default_expectation(attr, value)
13
- expect(subject.send(attr)).to eq(value)
14
- end
15
-
16
- def enum_expectation(attr, value)
17
- expect(value).to include(subject.send(attr).to_sym)
18
- end
19
-
20
- def type_expectation(attr, value)
21
- assert_type = value != :Boolean ? be_kind_of(Kernel.const_get(value)) : be_boolean
22
- expect(subject.send(attr)).to assert_type
23
- end
24
-
25
- def has_attributes_expectation(attr, options) options.each do |key, value|
26
- send("#{key}_expectation", attr, value)
27
- end
28
- end
29
-
30
- def association_expectation(type, model)
31
- if type == :has_many
32
- expect(subject).to respond_to("#{model.to_s.singularize}_ids")
33
- elsif type == :belongs_to
34
- %W(#{model}= #{model}_id #{model}_id=).each do |method|
35
- expect(subject).to respond_to(method)
36
- end
37
- end
38
- end
39
- end
40
- end
41
- end
42
-