flipstone-matchers 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/flipstone-matchers.gemspec +22 -0
- data/lib/flipstone-matchers.rb +6 -0
- data/lib/flipstone-matchers/all.rb +16 -0
- data/lib/flipstone-matchers/all_be_within.rb +19 -0
- data/lib/flipstone-matchers/be_in_order_by.rb +24 -0
- data/lib/flipstone-matchers/be_protected_attribute_of.rb +41 -0
- data/lib/flipstone-matchers/be_same_set_as.rb +13 -0
- data/lib/flipstone-matchers/match_an_email.rb +75 -0
- data/lib/flipstone-matchers/version.rb +5 -0
- metadata +68 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "flipstone-matchers/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "flipstone-matchers"
|
7
|
+
s.version = Flipstone::Matchers::VERSION
|
8
|
+
s.authors = ["David Vollbracht, Scott Conley"]
|
9
|
+
s.email = ["development@flipstone.com"]
|
10
|
+
s.homepage = "http://github.com/flipstone/flipstone-matchers"
|
11
|
+
s.summary = %q{Some useful RSpec matchers we've used on multiple projects}
|
12
|
+
s.description = %q{Some useful RSpec matchers we've used on multiple projects}
|
13
|
+
|
14
|
+
s.add_dependency 'rspec', ">= 2.6.0"
|
15
|
+
|
16
|
+
s.rubyforge_project = "flipstone-matchers"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
RSpec::Matchers.define :all do |matcher|
|
2
|
+
match do |array|
|
3
|
+
array.all? do |item|
|
4
|
+
matcher.matches? item
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
failure_message_for_should do |array|
|
9
|
+
array.each_with_index.map do |item, idx|
|
10
|
+
unless matcher.matches? item
|
11
|
+
"item #{idx} (#{item}): #{matcher.failure_message_for_should}"
|
12
|
+
end
|
13
|
+
end.compact.join("\n")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
RSpec::Matchers.define :all_be_within do |allowable_delta|
|
2
|
+
chain :of do |expected_array|
|
3
|
+
@expected_array = expected_array
|
4
|
+
end
|
5
|
+
|
6
|
+
def within?(left, right, delta)
|
7
|
+
(left - right).abs < delta
|
8
|
+
end
|
9
|
+
|
10
|
+
match do |actual_array|
|
11
|
+
@expected_array.count == actual_array.count &&
|
12
|
+
actual_array.zip(@expected_array).all? { |left, right| within?(left, right, allowable_delta)}
|
13
|
+
end
|
14
|
+
|
15
|
+
failure_message_for_should do |actual_array|
|
16
|
+
"Expected all of #{actual_array} to be within #{allowable_delta} of #{@expected_array}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
RSpec::Matchers.define :be_in_order_by do |expression, options = {}|
|
2
|
+
match do |actual|
|
3
|
+
@values_to_be_sorted_by = actual.map do |o|
|
4
|
+
o.instance_eval expression
|
5
|
+
end
|
6
|
+
|
7
|
+
@sorted = @values_to_be_sorted_by.sort
|
8
|
+
|
9
|
+
if options[:descending]
|
10
|
+
@sorted = @sorted.reverse
|
11
|
+
end
|
12
|
+
|
13
|
+
@sorted == @values_to_be_sorted_by
|
14
|
+
end
|
15
|
+
|
16
|
+
failure_message_for_should do |actual|
|
17
|
+
<<-end_message
|
18
|
+
Expected items to be in order by #{expression}
|
19
|
+
Expected: #{@sorted}
|
20
|
+
Actual: #{@values_to_be_sorted_by}
|
21
|
+
end_message
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
RSpec::Matchers.define :be_protected_attribute_of do |model_class, value|
|
2
|
+
match do |attribute|
|
3
|
+
new_instance = model_class.new attribute => value
|
4
|
+
@mass_assignable = (new_instance.send(attribute) == value)
|
5
|
+
|
6
|
+
saved_instance = model_class.new
|
7
|
+
saved_instance.update_protected_attributes(
|
8
|
+
Factory.attributes_for(model_class.name.underscore,
|
9
|
+
attribute => value)
|
10
|
+
)
|
11
|
+
|
12
|
+
@updateable = (saved_instance.send(attribute) == value)
|
13
|
+
|
14
|
+
clear_instance = model_class.new
|
15
|
+
clear_instance.send("#{attribute}=", value)
|
16
|
+
clear_instance.update_protected_attributes({})
|
17
|
+
|
18
|
+
@cleared_without_request = (clear_instance.send(attribute) != value)
|
19
|
+
|
20
|
+
!@mass_assignable && @updateable && !@cleared_without_request
|
21
|
+
end
|
22
|
+
|
23
|
+
failure_message_for_should do |attribute|
|
24
|
+
errors = ["Expected #{attribute} to be a protected attribute"]
|
25
|
+
|
26
|
+
if @mass_assignable
|
27
|
+
errors << " But it was mass assignable via hash"
|
28
|
+
end
|
29
|
+
|
30
|
+
if !@updateable
|
31
|
+
errors << " But it was not updateable via update_protected_attributes"
|
32
|
+
end
|
33
|
+
|
34
|
+
if @cleared_without_request
|
35
|
+
errors << " But it was cleared out by update_protected_attributes({})"
|
36
|
+
end
|
37
|
+
|
38
|
+
errors.join("\n")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
RSpec::Matchers.define :be_same_set_as do |expected|
|
2
|
+
match do |actual|
|
3
|
+
Set.new(actual) == Set.new(expected)
|
4
|
+
end
|
5
|
+
|
6
|
+
failure_message_for_should do |actual|
|
7
|
+
<<-message
|
8
|
+
expected #{actual.inspect} have same set of elements as #{expected.inspect}.
|
9
|
+
actual values: #{actual.to_a.inspect}
|
10
|
+
expected values: #{expected.to_a.inspect}
|
11
|
+
message
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
RSpec::Matchers.define :match_an_email do
|
2
|
+
chain :subject do
|
3
|
+
@email_field = :subject
|
4
|
+
end
|
5
|
+
|
6
|
+
chain :body do
|
7
|
+
@email_field = :body
|
8
|
+
end
|
9
|
+
|
10
|
+
chain :just_one do
|
11
|
+
@count = 1
|
12
|
+
end
|
13
|
+
|
14
|
+
chain :to do |user|
|
15
|
+
@to_email = user.email
|
16
|
+
end
|
17
|
+
|
18
|
+
match do |actual|
|
19
|
+
actual = [actual] unless actual.is_a?(Array)
|
20
|
+
matchers = actual.map do |actual|
|
21
|
+
case actual
|
22
|
+
when String then /#{actual}/
|
23
|
+
else actual
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
@all_fields = ActionMailer::Base.deliveries.select do |email|
|
28
|
+
@to_email.nil? || email.to.include?(@to_email)
|
29
|
+
end.map(&@email_field)
|
30
|
+
|
31
|
+
@matches = @all_fields.select do |value|
|
32
|
+
matchers.all? { |matcher| matcher === value.to_s }
|
33
|
+
end
|
34
|
+
|
35
|
+
@count_matches = true
|
36
|
+
|
37
|
+
if @count
|
38
|
+
matched = @matches.size == @count
|
39
|
+
else
|
40
|
+
matched = @matches.any?
|
41
|
+
end
|
42
|
+
|
43
|
+
@email_field && matched
|
44
|
+
end
|
45
|
+
|
46
|
+
failure_message_for_should do |actual|
|
47
|
+
if @email_field.blank?
|
48
|
+
"No email field specified. Did you mean should match_an_email.subject ?"
|
49
|
+
elsif @count
|
50
|
+
message = []
|
51
|
+
message << "Expected #{@count} #{@to_email} emails with #{@email_field} matching #{actual}"
|
52
|
+
message << "Matching fields were: ["
|
53
|
+
message << " " + @matches.join(",\n ")
|
54
|
+
message << "]"
|
55
|
+
message.join("\n")
|
56
|
+
else
|
57
|
+
message = []
|
58
|
+
message << "Found no email with #{@email_field} matching #{actual}"
|
59
|
+
message << "Actual message fields were: ["
|
60
|
+
message << " " + @all_fields.join(",\n ")
|
61
|
+
message << "]"
|
62
|
+
message.join("\n")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
failure_message_for_should_not do |actual|
|
67
|
+
message = []
|
68
|
+
message << "Found #{@to_email} email with #{@email_field} matching #{actual}"
|
69
|
+
message << "The matching items where: ["
|
70
|
+
message << " " + @matches.join(",\n ")
|
71
|
+
message << "]"
|
72
|
+
message.join("\n")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flipstone-matchers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Vollbracht, Scott Conley
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-30 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &2154337120 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.6.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2154337120
|
25
|
+
description: Some useful RSpec matchers we've used on multiple projects
|
26
|
+
email:
|
27
|
+
- development@flipstone.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- flipstone-matchers.gemspec
|
36
|
+
- lib/flipstone-matchers.rb
|
37
|
+
- lib/flipstone-matchers/all.rb
|
38
|
+
- lib/flipstone-matchers/all_be_within.rb
|
39
|
+
- lib/flipstone-matchers/be_in_order_by.rb
|
40
|
+
- lib/flipstone-matchers/be_protected_attribute_of.rb
|
41
|
+
- lib/flipstone-matchers/be_same_set_as.rb
|
42
|
+
- lib/flipstone-matchers/match_an_email.rb
|
43
|
+
- lib/flipstone-matchers/version.rb
|
44
|
+
homepage: http://github.com/flipstone/flipstone-matchers
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project: flipstone-matchers
|
64
|
+
rubygems_version: 1.8.5
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Some useful RSpec matchers we've used on multiple projects
|
68
|
+
test_files: []
|