specstar-models 0.0.8 → 0.0.9

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.
Files changed (2) hide show
  1. data/lib/specstar/models.rb +41 -7
  2. metadata +2 -2
@@ -7,6 +7,30 @@ module Specstar
7
7
  " of " + hash.map { |key, value| "#{key} #{value}" }.to_sentence if hash.present?
8
8
  end
9
9
 
10
+ def validate_presence_of_methods_in_options(model, options)
11
+ if options[:if] && options[:if].is_a?(Symbol)
12
+ return false unless model.respond_to? options[:if]
13
+ end
14
+
15
+ if options[:unless] && options[:unless].is_a?(Symbol)
16
+ return false unless model.respond_to? options[:unless]
17
+ end
18
+
19
+ true
20
+ end
21
+
22
+ def undefined_method_in_options(model, options)
23
+ if options[:if] && options[:if].is_a?(Symbol)
24
+ return options[:if] unless model.respond_to? options[:if]
25
+ end
26
+
27
+ if options[:unless] && options[:unless].is_a?(Symbol)
28
+ return options[:unless] unless model.respond_to? options[:unless]
29
+ end
30
+
31
+ nil
32
+ end
33
+
10
34
  RSpec::Matchers.define :have_attribute do |attr|
11
35
  attr = attr.to_s
12
36
 
@@ -56,15 +80,21 @@ module Specstar
56
80
  model.class.reflect_on_all_associations.map { |a| a.name }.include? association.to_sym
57
81
  end
58
82
 
59
- RSpec::Matchers.define :validate_presence_of do |attr|
83
+ RSpec::Matchers.define :validate_presence_of do |attr, options|
60
84
  match do |model|
61
85
  (has_attribute?(model, attr) || has_association?(model, attr)) &&
62
- model._validators[attr].select { |validator| validator.instance_of? ActiveModel::Validations::PresenceValidator }.size > 0
86
+ model._validators[attr].select do |validator|
87
+ validator.instance_of?(ActiveModel::Validations::PresenceValidator) && (options.nil? || validate_presence_of_methods_in_options(model, options) && (options.to_a - validator.options.to_a).empty?)
88
+ end.size > 0
63
89
  end
64
90
 
65
91
  failure_message_for_should do |model|
66
92
  if has_attribute?(model, attr) || has_association?(model, attr)
67
- "expected #{model.class} to validate presence of #{attr}."
93
+ if options.nil? || validate_presence_of_methods_in_options(model, options)
94
+ "expected #{model.class} to validate presence of #{attr}."
95
+ else
96
+ "expected #{model.class} to define #{undefined_method_in_options(model, options)}."
97
+ end
68
98
  else
69
99
  "expected #{model.class} to have an attribute or association #{attr}."
70
100
  end
@@ -73,14 +103,18 @@ module Specstar
73
103
 
74
104
  RSpec::Matchers.define :validate_uniqueness_of do |attr, options|
75
105
  match do |model|
76
- (has_attribute?(model, attr) || has_association?(model, attr)) && model._validators[attr].select { |validator|
77
- validator.instance_of?(ActiveRecord::Validations::UniquenessValidator) && (options.nil? || (options.to_a - validator.options.to_a).empty?)
78
- }.size > 0
106
+ (has_attribute?(model, attr) || has_association?(model, attr)) && model._validators[attr].select do |validator|
107
+ validator.instance_of?(ActiveRecord::Validations::UniquenessValidator) && (options.nil? || validate_presence_of_methods_in_options(model, options) && (options.to_a - validator.options.to_a).empty?)
108
+ end.size > 0
79
109
  end
80
110
 
81
111
  failure_message_for_should do |model|
82
112
  if has_attribute?(model, attr) || has_association?(model, attr)
83
- "expected #{model.class} to validate uniqueness of #{attr}."
113
+ if options.nil? || validate_presence_of_methods_in_options(model, options)
114
+ "expected #{model.class} to validate uniqueness of #{attr}."
115
+ else
116
+ "expected #{model.class} to define #{undefined_method_in_options(model, options)}."
117
+ end
84
118
  else
85
119
  "expected #{model.class} to have an attribute or association #{attr}."
86
120
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: specstar-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-04 00:00:00.000000000 Z
12
+ date: 2013-04-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec-core