active_record_block_matchers 0.1.1 → 0.1.2

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: 76aa63f8b10ab12208d486f38962b648d49c8789
4
- data.tar.gz: a2d7d99eb3bb735bbfabd2a1192b0fc54e2f2194
3
+ metadata.gz: fcffbe7450c275e8f73887b109de06322a94a8f4
4
+ data.tar.gz: 5446e27ecf51297ba5a652776b957422118c6013
5
5
  SHA512:
6
- metadata.gz: 9b8832aeb00039b04ca2a8897d5507d3bbac87352ed13bc08ec3846472297a5045097d073bdbd23728849fe022b38bde9feaba247ae2eec6b6f52371355519e2
7
- data.tar.gz: 9e94d9770a73a56401bbb8f7334328fd8eb67c241c0400093eaa8d051bdb49605b65046892ac6f4f9ad27c937bc5ce9c774149761eb704e644fc21794ebf8d36
6
+ metadata.gz: 091547dfd038261e271f38391d842261e955f5f44f0ac55631bc1ec4d330bcaa203387a97bc8cf257fdfba2a55066922875aacbbc9acc51fbec4d464fa6fa474
7
+ data.tar.gz: d39f564c0f58925ae8bec51c5a0d6073a3fea5be6fc74a1c40456806a2443a4f4315ba02428e1793164e9b8284ada9562ba9adbe9a9df13cca42d2dc781c2c01
data/README.md CHANGED
@@ -52,6 +52,19 @@ expect { User.create!(username: "BOB") }
52
52
  .with_attributes(username: "bob")
53
53
  ```
54
54
 
55
+ If you need to make assertions about things other than attribute equality, you can also chain `.which` with a block, and your block will receive the newly created record:
56
+
57
+ ```ruby
58
+ expect { User.create!(username: "BOB", password: "BlueSteel45") }
59
+ .to create_a_new(User)
60
+ .which { |user|
61
+ expect(user.encrypted_password).to be_present
62
+ expect(AuthLibrary.authenticate("bob", "BlueSteel45")).to eq user
63
+ }
64
+ ```
65
+
66
+ **Gotcha Warning:** Be careful about your block syntax when chaining `.which` in your tests. If you write the above example with a `do...end`, the example will parse like this: `expect {...}.to(create_a_new(User).which) do |user| ... end`, so your block will not execute, and it may appear that your test is passing, when it is not.
67
+
55
68
  This matcher relies on a `created_at` column existing on the given model class. The name of this column can be configured via `ActiveRecordBlockMatchers::Config.created_at_column_name = "your_column_name"`
56
69
 
57
70
  ## Development
@@ -1,47 +1,69 @@
1
1
  RSpec::Matchers.define :create_a_new do |klass|
2
2
  supports_block_expectations
3
3
 
4
+ description do
5
+ "create a #{klass}, optionally verifying attributes"
6
+ end
7
+
4
8
  chain(:with_attributes) do |attributes|
5
9
  @attributes = attributes
6
10
  end
7
11
 
12
+ chain(:which) do |&block|
13
+ @which_block = block
14
+ end
15
+
8
16
  match do |block|
9
- @attributes ||= {}
10
17
  time_before = Time.current
18
+
11
19
  block.call
20
+
12
21
  column_name = ActiveRecordBlockMatchers::Config.created_at_column_name
13
22
  @created_records = klass.where("#{column_name} > ?", time_before)
14
23
  return false unless @created_records.count == 1
15
24
 
16
- @failures = []
17
25
  record = @created_records.first
18
- @attributes.each do |field, value|
26
+
27
+ @attribute_mismatches = []
28
+
29
+ @attributes && @attributes.each do |field, value|
19
30
  unless record.public_send(field) == value
20
- @failures << [field, value, record.public_send(field)]
31
+ @attribute_mismatches << [field, value, record.public_send(field)]
21
32
  end
22
33
  end
23
- @failures.empty?
24
- end
25
34
 
26
- description do
27
- "create a #{klass}, optionally verifying attributes"
35
+ if @attribute_mismatches.none? && @which_block
36
+ begin
37
+ @which_block.call(record)
38
+ rescue RSpec::Expectations::ExpectationNotMetError => e
39
+ @which_failure = e
40
+ end
41
+ end
42
+
43
+ @attribute_mismatches.empty? && @which_failure.nil?
28
44
  end
29
45
 
30
46
  failure_message do
31
47
  if @created_records.count != 1
32
48
  "the block should have created 1 #{klass}, but created #{@created_records.count}"
33
- else
34
- @failures.map do |field, expected, actual|
35
- "Expected #{field} to be: #{expected}, but was: #{actual}"
49
+ elsif @attribute_mismatches.any?
50
+ @attribute_mismatches.map do |field, expected, actual|
51
+ "Expected #{field.inspect} to be #{expected.inspect}, but was #{actual.inspect}"
36
52
  end.join("\n")
53
+ else
54
+ @which_failure.message
37
55
  end
38
56
  end
39
57
 
40
58
  failure_message_when_negated do
41
- if @created_records.count == 1
42
- "the block should not have created a #{klass}, but created #{@created_records.count}"
59
+ if @created_records.count == 1 && @attributes && @attribute_mismatches.none?
60
+ "the block should not have created a #{klass} with attributes #{@attributes.inspect}, but did"
61
+ elsif @created_records.count == 1 && @which_block && !@which_failure
62
+ "the newly created #{klass} should have failed an expectation in the given block, but didn't"
63
+ elsif @created_records.count == 1
64
+ "the block should not have created a #{klass}, but created #{@created_records.count}: #{@created_records.inspect}"
43
65
  else
44
- "the block created a #{klass} that matched all given attributes"
66
+ "the block created a #{klass} that matched all given criteria"
45
67
  end
46
68
  end
47
69
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordBlockMatchers
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_block_matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Wallace
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-02-26 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: activerecord
@@ -167,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
167
  version: '0'
168
168
  requirements: []
169
169
  rubyforge_project:
170
- rubygems_version: 2.4.3
170
+ rubygems_version: 2.4.5
171
171
  signing_key:
172
172
  specification_version: 4
173
173
  summary: Additional RSpec custom matchers for ActiveRecord