mongoid-rspec 1.4.5 → 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,8 +1,5 @@
1
+ language: ruby
1
2
  rvm:
2
- - 1.8.7 # (current default)
3
3
  - 1.9.2
4
- - rbx
5
- - rbx-2.0
6
- - ree
7
- - jruby
4
+ - 1.9.3
8
5
  - ruby-head
data/README.md CHANGED
@@ -78,6 +78,11 @@ Validation Matchers
78
78
  it { should validate_numericality_of(:classification).to_allow(:even => true, :only_integer => true, :nil => false) }
79
79
  end
80
80
 
81
+ describe Person do
82
+ # in order to be able to use the custom_validate matcher, the custom validator class (in this case SsnValidator)
83
+ # should redefine the kind method to return :custom, i.e. "def self.kind() :custom end"
84
+ it { should custom_validate(:ssn).with_validator(SsnValidator) }
85
+ end
81
86
  Others
82
87
  -
83
88
  describe User do
@@ -0,0 +1,101 @@
1
+ # this code is totally extracted from shoulda-matchers gem.
2
+ module Mongoid
3
+ module Matchers
4
+ class AllowMassAssignmentOfMatcher # :nodoc:
5
+ attr_reader :failure_message, :negative_failure_message
6
+
7
+ def initialize(attribute)
8
+ @attribute = attribute.to_s
9
+ @options = {}
10
+ end
11
+
12
+ def as(role)
13
+ if active_model_less_than_3_1?
14
+ raise "You can specify role only in Rails 3.1 or greater"
15
+ end
16
+ @options[:role] = role
17
+ self
18
+ end
19
+
20
+ def matches?(klass)
21
+ @klass = klass
22
+ if attr_mass_assignable?
23
+ if whitelisting?
24
+ @negative_failure_message = "#{@attribute} was made accessible"
25
+ else
26
+ if protected_attributes.empty?
27
+ @negative_failure_message = "no attributes were protected"
28
+ else
29
+ @negative_failure_message = "#{class_name} is protecting " <<
30
+ "#{protected_attributes.to_a.to_sentence}, " <<
31
+ "but not #{@attribute}."
32
+ end
33
+ end
34
+ true
35
+ else
36
+ if whitelisting?
37
+ @failure_message = "Expected #{@attribute} to be accessible"
38
+ else
39
+ @failure_message = "Did not expect #{@attribute} to be protected"
40
+ end
41
+ false
42
+ end
43
+ end
44
+
45
+ def description
46
+ "allow mass assignment of #{@attribute}"
47
+ end
48
+
49
+ private
50
+
51
+ def role
52
+ @options[:role] || :default
53
+ end
54
+
55
+ def protected_attributes
56
+ @protected_attributes ||= (@klass.class.protected_attributes || [])
57
+ end
58
+
59
+ def accessible_attributes
60
+ @accessible_attributes ||= (@klass.class.accessible_attributes || [])
61
+ end
62
+
63
+ def whitelisting?
64
+ authorizer.kind_of?(::ActiveModel::MassAssignmentSecurity::WhiteList)
65
+ end
66
+
67
+ def attr_mass_assignable?
68
+ !authorizer.deny?(@attribute)
69
+ end
70
+
71
+ def authorizer
72
+ if active_model_less_than_3_1?
73
+ @klass.class.active_authorizer
74
+ else
75
+ @klass.class.active_authorizer[role]
76
+ end
77
+ end
78
+
79
+ def class_name
80
+ @klass.class.name
81
+ end
82
+
83
+ def active_model_less_than_3_1?
84
+ ::ActiveModel::VERSION::STRING.to_f < 3.1
85
+ end
86
+ end
87
+
88
+ # Ensures that the attribute can be set on mass update.
89
+ #
90
+ # it { should_not allow_mass_assignment_of(:password) }
91
+ # it { should allow_mass_assignment_of(:first_name) }
92
+ #
93
+ # In Rails 3.1 you can check role as well:
94
+ #
95
+ # it { should allow_mass_assignment_of(:first_name).as(:admin) }
96
+ #
97
+ def allow_mass_assignment_of(value)
98
+ AllowMassAssignmentOfMatcher.new(value)
99
+ end
100
+ end
101
+ end
@@ -1,6 +1,6 @@
1
1
  RSpec::Matchers.define :be_stored_in do |collection_name|
2
2
  match do |doc|
3
- doc.collection_name == collection_name.to_s
3
+ doc.class.collection_name == collection_name
4
4
  end
5
5
 
6
6
  description do
@@ -0,0 +1,64 @@
1
+ module Mongoid
2
+ module Matchers
3
+ module Validations
4
+ class ValidateWithCustomValidatorMatcher < HaveValidationMatcher
5
+ def initialize(field)
6
+ super(field, :custom)
7
+ end
8
+
9
+ def with_validator(custom_validator)
10
+ @custom_validator = custom_validator
11
+ self
12
+ end
13
+
14
+ def with_message(message)
15
+ @expected_message = message
16
+ self
17
+ end
18
+
19
+ def matches?(actual)
20
+ return false unless (@result = super(actual))
21
+ check_custom_validator if @custom_validator
22
+ check_expected_message if @expected_message
23
+
24
+ @result
25
+ end
26
+
27
+ def description
28
+ options_desc = []
29
+ options_desc << " with custom validator #{@custom_validator.name}" if @validator
30
+ options_desc << " with message '#{@expected_message}'" if @expected_message
31
+ "validate field #{@field.inspect}" << options_desc.to_sentence
32
+ end
33
+
34
+ private
35
+
36
+ def check_custom_validator
37
+ if @validator.kind_of? @custom_validator
38
+ @positive_result_message << " with custom validator of type #{@custom_validator.name}"
39
+ else
40
+ @negative_result_message << " with custom validator not of type #{@custom_validator.name}"
41
+ @result = false
42
+ end
43
+ end
44
+
45
+ def check_expected_message
46
+ actual_message = @validator.options[:message]
47
+ if actual_message.nil?
48
+ @negative_result_message << " with no custom message"
49
+ @result = false
50
+ elsif actual_message == @expected_message
51
+ @positive_result_message << " with custom message '#{@expected_message}'"
52
+ else
53
+ @negative_result_message << " got message '#{actual_message}'"
54
+ @result = false
55
+ end
56
+ end
57
+ end
58
+
59
+ def custom_validate(field)
60
+ ValidateWithCustomValidatorMatcher.new(field)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -43,7 +43,7 @@ module Mongoid
43
43
  options_desc << " scoped to #{@scope.inspect}" if @scope
44
44
  options_desc << " allowing blank values" if @allow_blank
45
45
  options_desc << " allowing case insensitive values" if @case_insensitive
46
- options_desc << " with message '#{@expected_message}'" if @case_insensitive
46
+ options_desc << " with message '#{@expected_message}'" if @expected_message
47
47
  super << options_desc.to_sentence
48
48
  end
49
49
 
data/lib/mongoid-rspec.rb CHANGED
@@ -2,10 +2,12 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
 
3
3
  require 'mongoid'
4
4
  require 'rspec'
5
+ require "active_model"
5
6
  require 'matchers/document'
6
7
  require 'matchers/associations'
7
8
  require 'matchers/collections'
8
9
  require 'matchers/indexes'
10
+ require 'matchers/allow_mass_assignment'
9
11
  require 'matchers/validations'
10
12
  require 'matchers/validations/associated'
11
13
  require 'matchers/validations/confirmation_of'
@@ -17,6 +19,7 @@ require 'matchers/validations/numericality_of'
17
19
  require 'matchers/validations/presence_of'
18
20
  require 'matchers/validations/uniqueness_of'
19
21
  require 'matchers/validations/acceptance_of'
22
+ require 'matchers/validations/custom_validation_of'
20
23
 
21
24
  module Mongoid
22
25
  module Matchers
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Rspec
3
- VERSION = "1.4.5"
3
+ VERSION = "1.4.6"
4
4
  end
5
5
  end
@@ -20,6 +20,6 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  s.add_dependency 'rake'
23
- s.add_dependency 'mongoid', '>= 2.4.6'
23
+ s.add_dependency 'mongoid', '>= 3.0.0.rc'
24
24
  s.add_dependency 'rspec', '>= 2.9'
25
25
  end
@@ -18,6 +18,6 @@ class Article
18
18
 
19
19
  validates_length_of :title, :minimum => 8, :maximum => 16
20
20
 
21
- index :title, :unique => true, :background => true
22
- index :published
21
+ index({ title: 1 }, { unique: true, background: true })
22
+ index({ published: 1 })
23
23
  end
data/spec/models/log.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  class Log
2
2
  include Mongoid::Document
3
- store_in :logs
3
+ store_in collection: "logs"
4
4
  end
@@ -0,0 +1,13 @@
1
+ require 'ssn_validator.rb'
2
+
3
+ class Person
4
+
5
+ include Mongoid::Document
6
+
7
+ field :name
8
+ field :ssn
9
+
10
+ validates :ssn, ssn: true
11
+
12
+
13
+ end
@@ -10,10 +10,5 @@ class Profile
10
10
  validates_numericality_of :age, :greater_than => 0
11
11
  validates_acceptance_of :terms_of_service
12
12
 
13
- index(
14
- [
15
- [ :first_name, Mongo::ASCENDING ],
16
- [ :last_name, Mongo::ASCENDING ]
17
- ]
18
- )
13
+ index({first_name: 1, last_name: 1 })
19
14
  end
data/spec/models/user.rb CHANGED
@@ -22,6 +22,9 @@ class User
22
22
  validates :age, :presence => true, :numericality => true, :inclusion => { :in => 23..42 }, :on => [:create, :update]
23
23
  validates :password, :presence => true, :on => :create
24
24
 
25
+ attr_accessible :login, :email, :age, :password
26
+ attr_accessible :role, :as => :admin
27
+
25
28
  def admin?
26
29
  false
27
30
  end
data/spec/spec_helper.rb CHANGED
@@ -2,20 +2,20 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
3
3
  MODELS = File.join(File.dirname(__FILE__), "models")
4
4
  $LOAD_PATH.unshift(MODELS)
5
+ VALIDATORS = File.join(File.dirname(__FILE__), "validators")
6
+ $LOAD_PATH.unshift(VALIDATORS)
5
7
 
6
8
  require "rubygems"
7
9
  require "bundler"
8
10
  Bundler.setup
9
11
 
12
+ require 'mongoid'
10
13
  require 'rspec'
11
14
  require 'rspec/core'
12
15
  require 'rspec/expectations'
13
- require 'mongoid'
14
16
 
15
17
  Mongoid.configure do |config|
16
- name = "mongoid-rspec-test"
17
- host = "localhost"
18
- config.master = Mongo::Connection.new.db(name)
18
+ config.connect_to("mongoid-rspec-test")
19
19
  end
20
20
 
21
21
  Dir[ File.join(MODELS, "*.rb") ].sort.each { |file| require File.basename(file) }
@@ -27,6 +27,6 @@ RSpec.configure do |config|
27
27
  config.include Mongoid::Matchers
28
28
  config.mock_with :rspec
29
29
  config.after :all do
30
- Mongoid.master.collections.each(&:drop)
30
+ Mongoid::Config.purge!
31
31
  end
32
32
  end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe "AllowMassAssignment" do
4
+ describe User do
5
+ it { should allow_mass_assignment_of(:login) }
6
+ it { should allow_mass_assignment_of(:email) }
7
+ it { should allow_mass_assignment_of(:age) }
8
+ it { should allow_mass_assignment_of(:password) }
9
+ it { should allow_mass_assignment_of(:password) }
10
+ it { should allow_mass_assignment_of(:role).as(:admin) }
11
+
12
+ it { should_not allow_mass_assignment_of(:role) }
13
+ end
14
+ end
@@ -2,11 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe "Indexes" do
4
4
  describe Article do
5
- it { should have_index_for(:published) }
6
- it { should have_index_for(:title).with_options(:unique => true, :background => true) }
5
+ it { should have_index_for(published: 1) }
6
+ it { should have_index_for(title: 1).with_options(unique: true, background: true) }
7
7
  end
8
8
 
9
9
  describe Profile do
10
- it { should have_index_for([ [ :first_name, Mongo::ASCENDING ], [ :last_name, Mongo::ASCENDING ] ]) }
10
+ it { should have_index_for(first_name: 1, last_name: 1) }
11
11
  end
12
12
  end
@@ -35,4 +35,9 @@ describe "Validations" do
35
35
  it { should validate_numericality_of(:rating).to_allow(:greater_than => 0).less_than_or_equal_to(5) }
36
36
  it { should validate_numericality_of(:classification).to_allow(:even => true, :only_integer => true, :nil => false) }
37
37
  end
38
+
39
+ describe Person do
40
+ it { should custom_validate(:ssn).with_validator(SsnValidator) }
41
+ it { should_not custom_validate(:name) }
42
+ end
38
43
  end
@@ -0,0 +1,14 @@
1
+ class SsnValidator < ActiveModel::EachValidator
2
+
3
+ def validate_each(record, attribute, value)
4
+ record.errors[attribute] << "#{value} is not a valid Social Security Number" unless valid_ssn?(record, attribute, value)
5
+ end
6
+
7
+ def self.kind() :custom end
8
+
9
+ def valid_ssn?(record, attribute, value)
10
+ # irrelevant here how validation is done
11
+ true
12
+ end
13
+
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.5
4
+ version: 1.4.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-23 00:00:00.000000000 Z
12
+ date: 2012-06-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70235030173460 !ruby/object:Gem::Requirement
16
+ requirement: &70121800719080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70235030173460
24
+ version_requirements: *70121800719080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mongoid
27
- requirement: &70235030172800 !ruby/object:Gem::Requirement
27
+ requirement: &70121800717200 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
- version: 2.4.6
32
+ version: 3.0.0.rc
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70235030172800
35
+ version_requirements: *70121800717200
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70235030172220 !ruby/object:Gem::Requirement
38
+ requirement: &70121800716000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '2.9'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70235030172220
46
+ version_requirements: *70121800716000
47
47
  description: RSpec matches for Mongoid models, including association and validation
48
48
  matchers
49
49
  email: evansagge@gmail.com
@@ -60,6 +60,7 @@ files:
60
60
  - LICENSE
61
61
  - README.md
62
62
  - Rakefile
63
+ - lib/matchers/allow_mass_assignment.rb
63
64
  - lib/matchers/associations.rb
64
65
  - lib/matchers/collections.rb
65
66
  - lib/matchers/document.rb
@@ -68,6 +69,7 @@ files:
68
69
  - lib/matchers/validations/acceptance_of.rb
69
70
  - lib/matchers/validations/associated.rb
70
71
  - lib/matchers/validations/confirmation_of.rb
72
+ - lib/matchers/validations/custom_validation_of.rb
71
73
  - lib/matchers/validations/exclusion_of.rb
72
74
  - lib/matchers/validations/format_of.rb
73
75
  - lib/matchers/validations/inclusion_of.rb
@@ -83,16 +85,19 @@ files:
83
85
  - spec/models/log.rb
84
86
  - spec/models/movie_article.rb
85
87
  - spec/models/permalink.rb
88
+ - spec/models/person.rb
86
89
  - spec/models/profile.rb
87
90
  - spec/models/record.rb
88
91
  - spec/models/site.rb
89
92
  - spec/models/user.rb
90
93
  - spec/spec_helper.rb
94
+ - spec/unit/allow_mass_assignment_spec.rb
91
95
  - spec/unit/associations_spec.rb
92
96
  - spec/unit/collections_spec.rb
93
97
  - spec/unit/document_spec.rb
94
98
  - spec/unit/indexes_spec.rb
95
99
  - spec/unit/validations_spec.rb
100
+ - spec/validators/ssn_validator.rb
96
101
  homepage: http://github.com/evansagge/mongoid-rspec
97
102
  licenses: []
98
103
  post_install_message:
@@ -123,13 +128,16 @@ test_files:
123
128
  - spec/models/log.rb
124
129
  - spec/models/movie_article.rb
125
130
  - spec/models/permalink.rb
131
+ - spec/models/person.rb
126
132
  - spec/models/profile.rb
127
133
  - spec/models/record.rb
128
134
  - spec/models/site.rb
129
135
  - spec/models/user.rb
130
136
  - spec/spec_helper.rb
137
+ - spec/unit/allow_mass_assignment_spec.rb
131
138
  - spec/unit/associations_spec.rb
132
139
  - spec/unit/collections_spec.rb
133
140
  - spec/unit/document_spec.rb
134
141
  - spec/unit/indexes_spec.rb
135
142
  - spec/unit/validations_spec.rb
143
+ - spec/validators/ssn_validator.rb