active_record_block_matchers 0.1.1 → 0.1.2

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.
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