smart_rspec 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 48b874a311311e784f28124875c47496d24341a4
4
- data.tar.gz: 58bcf16c460903b3c77fb796bd62e95ce37ef177
3
+ metadata.gz: 5ff5716dab4e7adc48ce3d9a68f5ac08335c9447
4
+ data.tar.gz: e00030e125016a66de204b9d106ae68e60d39ab3
5
5
  SHA512:
6
- metadata.gz: 28623faa3ad5c10172b668672598cfaf0da6725bb4532fb3e7ad40043ddeb390ccbbf5252115b3874edadd374023d96acd30ff4cf2a59fdd479dc84846630f17
7
- data.tar.gz: 65f2a44c1f27a69ac5ac9ead3b7e88d97ef1e471b5dba36c0121a6f229a6d2157383f740bb7a111bf0f8962c8ae7d46578e38b5da735114a1c1e94b18e519ccf
6
+ metadata.gz: e84dac0dff7b0985a9a7925c61444e34bd26854ad5c354809932bfe74111207534dde371f239ed279af497afed89eb41520e4393cdf26cec96848031983c41b8
7
+ data.tar.gz: 2ff5953423af3958d6fda0586f1794927024569f1f8114fcfc5587a848685d4345510a43474da70e015e0b6e8c9705c493a59f074b46c66d3acab26f55925ad8
data/README.md CHANGED
@@ -20,13 +20,14 @@ Execute:
20
20
  $ bundle
21
21
 
22
22
  Require the gem at the top of your `spec/rails_helper.rb` (or equivalent):
23
- ``` ruby
23
+
24
+ ``` ruby
24
25
  require 'smart_rspec'
25
26
  ```
26
27
 
27
28
  Then include the SmartRspec module:
28
29
 
29
- ``` ruby
30
+ ``` ruby
30
31
  RSpec.configure do |config|
31
32
  config.include SmartRspec
32
33
  end
@@ -39,17 +40,22 @@ end
39
40
  * [belongs_to, has_one, has_many](#belongs_to-has_one-has_many)
40
41
  * [fails_validation_of](#fails_validation_of)
41
42
  * [Matchers](#matchers)
42
- * [be_ascending](#be_ascending)
43
- * [be_descending](#be_descending)
44
- * [be_boolean](#be_boolean)
45
- * [be_email](#be_email)
46
- * [be_url](#be_url)
47
- * [be_image_url](#be_image_url)
48
- * [have](#have)
49
- * [have_at_least](#have_at_least)
50
- * [have_at_most](#have_at_most)
51
- * [have_error_on](#have_error_on)
52
- * [include_items](#include_items)
43
+ * ["Be" matchers](#)
44
+ * [be_ascending](#be_ascending)
45
+ * [be_a_bad_request](#be_a_bad_request)
46
+ * [be_a_list_of](#be_a_list_of)
47
+ * [be_boolean](#be_boolean)
48
+ * [be_descending](#be_descending)
49
+ * [be_email](#be_email)
50
+ * [be_image_url](#be_image_url)
51
+ * [be_url](#be_url)
52
+ * ["Have" matchers](#)
53
+ * [have](#have)
54
+ * [have_at_least](#have_at_least)
55
+ * [have_at_most](#have_at_most)
56
+ * [have_error_on](#have_error_on)
57
+ * [Other matchers](#)
58
+ * [include_items](#include_items)
53
59
 
54
60
  ### Macros
55
61
 
@@ -61,7 +67,7 @@ It builds specs for model attributes and test its type, enumerated values and de
61
67
  ``` ruby
62
68
  RSpec.describe User, type: :model do
63
69
  subject { FactoryGirl.build(:user) }
64
-
70
+
65
71
  has_attributes :email, type: :String
66
72
  has_attributes :is_admin, type: :Boolean
67
73
  has_attributes :score, type: :Integer, default: 0
@@ -75,25 +81,27 @@ It builds specs and test model associations like `belongs_to`, `has_one` and `ha
75
81
  ``` ruby
76
82
  RSpec.describe User, type: :model do
77
83
  subject { FactoryGirl.build(:user) }
78
-
84
+
79
85
  belongs_to :business
80
86
  has_one :project
81
87
  has_many :tasks
82
88
  end
83
89
  ```
84
90
 
85
- #### fails_validation_of
91
+ #### fails_validation_of
86
92
 
87
- It builds specs forcing model validations to fail, it means that you will only turn its specs into green when you specify the corresponding validation in the model.
93
+ It builds specs and forces model validations to fail, meaning that you will only turn specs into green when you specify the corresponding validation in the model. In order to get a nice semantics it's recommended to use the `fails_validation_of` macro within a "when invalid" context, like:
88
94
 
89
95
  ``` ruby
90
96
  RSpec.describe User, type: :model do
91
97
  subject { FactoryGirl.build(:user) }
92
-
93
- fails_validation_of :email, presence: true, email: true
94
- fails_validation_of :name, length: { maximum: 80 }, uniqueness: true
95
- fails_validation_of :username, length: { minimum: 10 }, exclusion: { in: %w(foo bar) }
96
- # Other validations...
98
+
99
+ context 'when invalid' do
100
+ fails_validation_of :email, presence: true, email: true
101
+ fails_validation_of :name, length: { maximum: 80 }, uniqueness: true
102
+ fails_validation_of :username, length: { minimum: 10 }, exclusion: { in: %w(foo bar) }
103
+ # Other validations...
104
+ end
97
105
  end
98
106
  ```
99
107
 
@@ -124,72 +132,97 @@ fails_validation_of :foo, format: { with: /foo/, mock: 'bar' }
124
132
 
125
133
  SmartRspec gathers a collection of custom useful matchers:
126
134
 
127
- #### be_ascending
135
+ #### "Be" matchers
136
+
137
+ ##### be_ascending
128
138
 
129
139
  ``` ruby
130
140
  it { expect([1, 2, 3, 4]).to be_ascending }
131
141
  it { expect([1, 4, 2, 3]).not_to be_ascending }
132
142
  ```
133
143
 
134
- #### be_descending
144
+ ##### be_a_bad_request
135
145
  ``` ruby
136
- it { expect([4, 3, 2, 1]).to be_descending }
137
- it { expect([1, 2, 3, 4]).not_to be_descending }
146
+ context 'unauthenticated' do
147
+ subject { get :profile }
148
+ it { is_expected.to be_a_bad_request }
149
+ end
150
+
151
+ context 'authenticated' do
152
+ before { sign_in user }
153
+ subject { get :profile }
154
+ it { is_expected.to_not be_a_bad_request }
155
+ end
138
156
  ```
139
157
 
140
- #### be_boolean
158
+ ##### be_a_list_of
159
+ ``` ruby
160
+ it { expect(Foo.fetch_api).to be_a_list_of(Foo)) }
161
+ ```
162
+
163
+ ##### be_boolean
141
164
  ``` ruby
142
165
  it { expect(true).to be_boolean }
143
166
  it { expect('true').not_to be_boolean }
144
167
  ```
145
168
 
146
- #### be_email
169
+ ##### be_descending
147
170
  ``` ruby
148
- it { expect('tiagopog@gmail.com').to be_email }
149
- it { expect('tiagopog@gmail').not_to be_email }
171
+ it { expect([4, 3, 2, 1]).to be_descending }
172
+ it { expect([1, 2, 3, 4]).not_to be_descending }
150
173
  ```
151
174
 
152
- #### be_url
175
+ ##### be_email
153
176
  ``` ruby
154
- it { expect('http://adtangerine.com').to be_url }
155
- it { expect('adtangerine.com').not_to be_url }
177
+ it { expect('tiagopog@gmail.com').to be_email }
178
+ it { expect('tiagopog@gmail').not_to be_email }
156
179
  ```
157
180
 
158
- #### be_image_url
181
+ ##### be_image_url
159
182
  ``` ruby
160
183
  it { expect('http://adtangerine.com/foobar.png').to be_image_url }
161
184
  it { expect('http://adtangerine.com/foobar.jpg').not_to be_image_url(:gif) }
162
185
  it { expect('http://adtangerine.com/foo/bar').not_to be_image_url }
163
186
  ```
164
187
 
165
- #### have(x).items
188
+ ##### be_url
189
+ ``` ruby
190
+ it { expect('http://adtangerine.com').to be_url }
191
+ it { expect('adtangerine.com').not_to be_url }
192
+ ```
193
+
194
+ #### "Have" matchers
195
+
196
+ ##### have(x).items
166
197
  ``` ruby
167
198
  it { expect([1]).to have(1).item }
168
199
  it { expect(%w(foo bar)).to have(2).items }
169
200
  it { expect(%w(foo bar)).not_to have(1).item }
170
201
  ```
171
202
 
172
- #### have_at_least
203
+ ##### have_at_least
173
204
  ``` ruby
174
205
  it { expect(%w(foo bar foobar)).to have_at_least(3).items }
175
206
  ```
176
207
 
177
- #### have_at_most
208
+ ##### have_at_most
178
209
  ``` ruby
179
210
  it { expect(%w(foo bar foobar)).to have_at_most(3).items }
180
211
  ```
181
- #### have_error_on
212
+
213
+ ##### have_error_on
182
214
  ``` ruby
183
- subject(:user) { FactoryGirl.build(:user, email: nil) }
215
+ subject { User.new(email: nil, name: Faker::Name.name) }
184
216
 
185
217
  it 'has an invalid email' do
186
- user.valid?
187
- expect(user).to have_error_on(:email)
188
- expect(user).not_to have_error_on(:email)
218
+ subject.valid?
219
+ is_expected.to have_error_on(:email)
189
220
  end
190
221
  ```
191
222
 
192
- #### include_items
223
+ #### Other matchers
224
+
225
+ ##### include_items
193
226
  ``` ruby
194
227
  it { expect(%w(foo bar foobar)).to include_items(%w(foo bar foobar)) }
195
228
  ```
@@ -198,7 +231,9 @@ it { expect(%w(foo bar foobar)).to include_items(%w(foo bar foobar)) }
198
231
 
199
232
  - Create macros for model scopes;
200
233
  - Create macros for controllers;
201
- - Add more matchers.
234
+ - Add more matchers;
235
+ - Take groups of matchers into modules;
236
+ - Turn the whole into "A" in Code Climate.
202
237
 
203
238
  ## Contributing
204
239
 
@@ -0,0 +1,46 @@
1
+ module SmartRspec
2
+ module Matchers
3
+ module BeMatchers
4
+ extend RSpec::Matchers::DSL
5
+
6
+ matcher :be_ascending do
7
+ match { |actual| actual == actual.sort }
8
+ end
9
+
10
+ matcher :be_a_bad_request do
11
+ match do |response|
12
+ response.code.to_s =~ /^4/
13
+ end
14
+ end
15
+
16
+ matcher :be_a_list_of do |klass|
17
+ match do |collection|
18
+ collection.all? { |e| e.is_a?(klass) }
19
+ end
20
+ end
21
+
22
+ matcher :be_boolean do
23
+ match { |actual| [true, false].include?(actual) }
24
+ end
25
+
26
+ matcher :be_descending do
27
+ match do |actual|
28
+ actual.each_cons(2).all? { |i, j| i >= j }
29
+ end
30
+ end
31
+
32
+ matcher :be_email do
33
+ match { |actual| actual =~ build_regex(:email) }
34
+ end
35
+
36
+ matcher :be_image_url do |*types|
37
+ match { |actual| actual =~ build_regex(:image, types) }
38
+ end
39
+
40
+ matcher :be_url do
41
+ match { |actual| actual =~ build_regex(:uri) }
42
+ end
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,16 @@
1
+ module SmartRspec
2
+ module Matchers
3
+ module OtherMatchers
4
+ extend RSpec::Matchers::DSL
5
+
6
+ matcher :have_error_on do |attr|
7
+ match { |actual| actual.errors.keys.include?(attr) }
8
+ end
9
+
10
+ matcher :include_items do |items|
11
+ match { |actual| (items - actual).empty? }
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -1,45 +1,12 @@
1
- require 'rspec/matchers'
2
- require 'rspec/collection_matchers'
3
1
  require 'smart_rspec/support/regexes'
2
+ require 'smart_rspec/matchers/be_matchers'
3
+ require 'smart_rspec/matchers/other_matchers'
4
4
 
5
5
  module SmartRspec
6
6
  module Matchers
7
- extend RSpec::Matchers::DSL
8
7
  include SmartRspec::Support::Regexes
9
-
10
- matcher :be_boolean do
11
- match { |actual| [true, false].include?(actual) }
12
- end
13
-
14
- matcher :be_email do
15
- match { |actual| actual =~ build_regex(:email) }
16
- end
17
-
18
- matcher :be_url do
19
- match { |actual| actual =~ build_regex(:uri) }
20
- end
21
-
22
- matcher :be_image_url do |*types|
23
- match { |actual| actual =~ build_regex(:image, types) }
24
- end
25
-
26
- matcher :have_error_on do |attr|
27
- match { |actual| actual.errors.keys.include?(attr) }
28
- end
29
-
30
- matcher :include_items do |items|
31
- match { |actual| (items - actual).empty? }
32
- end
33
-
34
- matcher :be_ascending do
35
- match { |actual| actual == actual.sort }
36
- end
37
-
38
- matcher :be_descending do
39
- match do |actual|
40
- actual.each_cons(2).all? { |i, j| i >= j }
41
- end
42
- end
8
+ include SmartRspec::Matchers::BeMatchers
9
+ include SmartRspec::Matchers::OtherMatchers
43
10
  end
44
11
  end
45
12
 
@@ -1,3 +1,3 @@
1
1
  module SmartRspec
2
- VERSION = '0.0.2'
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/smart_rspec.rb CHANGED
@@ -1,7 +1,8 @@
1
+ %w(macros matchers support/expectations).each { |f| require "smart_rspec/#{f}" }
2
+
1
3
  require 'active_support/concern'
2
- require 'smart_rspec/macros'
3
- require 'smart_rspec/matchers'
4
- require 'smart_rspec/support/expectations'
4
+ require 'rspec/collection_matchers'
5
+ require 'rspec/matchers'
5
6
 
6
7
  include SmartRspec::Matchers
7
8
 
@@ -111,21 +111,19 @@ describe 'SmartRspec Matchers' do
111
111
  end
112
112
 
113
113
  describe '#have_error_on' do
114
- subject(:mock) { User.new(email: nil) }
114
+ subject { User.new(email: nil, name: Faker::Name.name) }
115
115
 
116
116
  context 'when valid' do
117
117
  it do
118
- mock.valid?
119
- expect(mock).to have_error_on(:email)
118
+ subject.valid?
119
+ is_expected.to have_error_on(:email)
120
120
  end
121
121
  end
122
122
 
123
123
  context 'when invalid' do
124
124
  it do
125
- mock.email = Faker::Internet.email
126
- mock.valid?
127
-
128
- expect(mock).not_to have_error_on(:email)
125
+ subject.valid?
126
+ is_expected.not_to have_error_on(:name)
129
127
  end
130
128
  end
131
129
  end
@@ -140,5 +138,35 @@ describe 'SmartRspec Matchers' do
140
138
  it { expect(%w(foo bar foobar)).not_to include_items(%w(lorem)) }
141
139
  end
142
140
  end
143
- end
144
141
 
142
+ describe '#be_a_list_of' do
143
+ context 'when valid' do
144
+ subject { Array.new(3, User.new) }
145
+ it { is_expected.to be_a_list_of(User) }
146
+ end
147
+
148
+ context 'when invalid' do
149
+ subject { Array.new(3, User.new) << nil }
150
+ it { is_expected.to_not be_a_list_of(User) }
151
+ end
152
+ end
153
+
154
+ describe '#be_a_bad_request' do
155
+ let(:response) { double('http response') }
156
+
157
+ context 'ok' do
158
+ before { allow(response).to receive(:code).and_return(200) }
159
+ it { expect(response).to_not be_a_bad_request }
160
+ end
161
+
162
+ context 'not found' do
163
+ before { allow(response).to receive(:code).and_return(404) }
164
+ it { expect(response).to be_a_bad_request }
165
+ end
166
+
167
+ context 'unauthorized' do
168
+ before { allow(response).to receive(:code).and_return(401) }
169
+ it { expect(response).to be_a_bad_request }
170
+ end
171
+ end
172
+ end
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.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Guedes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-16 00:00:00.000000000 Z
11
+ date: 2015-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -118,6 +118,8 @@ files:
118
118
  - lib/smart_rspec.rb
119
119
  - lib/smart_rspec/macros.rb
120
120
  - lib/smart_rspec/matchers.rb
121
+ - lib/smart_rspec/matchers/be_matchers.rb
122
+ - lib/smart_rspec/matchers/other_matchers.rb
121
123
  - lib/smart_rspec/support/assertions.rb
122
124
  - lib/smart_rspec/support/expectations.rb
123
125
  - lib/smart_rspec/support/regexes.rb