mongoid-rspec 1.3.2 → 1.4.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/Gemfile CHANGED
@@ -1 +1,2 @@
1
- gemspec
1
+ source :rubygems
2
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,43 +1,43 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongoid-rspec (1.3.0)
5
- mongoid (~> 2.0.0)
4
+ mongoid-rspec (1.4.1)
5
+ mongoid (~> 2.0.0.rc.7)
6
+ mongoid-rspec
6
7
  rspec (~> 2)
7
8
 
8
9
  GEM
10
+ remote: http://rubygems.org/
9
11
  specs:
10
- activemodel (3.0.1)
11
- activesupport (= 3.0.1)
12
+ activemodel (3.0.5)
13
+ activesupport (= 3.0.5)
12
14
  builder (~> 2.1.2)
13
- i18n (~> 0.4.1)
14
- activesupport (3.0.1)
15
- bson (1.1.2)
15
+ i18n (~> 0.4)
16
+ activesupport (3.0.5)
17
+ bson (1.2.4)
16
18
  builder (2.1.2)
17
19
  diff-lcs (1.1.2)
18
- i18n (0.4.2)
19
- mongo (1.1.2)
20
- bson (>= 1.1.1)
21
- mongoid (2.0.0.beta.20)
20
+ i18n (0.5.0)
21
+ mongo (1.2.4)
22
+ bson (>= 1.2.4)
23
+ mongoid (2.0.0.rc.7)
22
24
  activemodel (~> 3.0)
23
- mongo (~> 1.1)
25
+ mongo (~> 1.2)
24
26
  tzinfo (~> 0.3.22)
25
27
  will_paginate (~> 3.0.pre)
26
- rspec (2.1.0)
27
- rspec-core (~> 2.1.0)
28
- rspec-expectations (~> 2.1.0)
29
- rspec-mocks (~> 2.1.0)
30
- rspec-core (2.1.0)
31
- rspec-expectations (2.1.0)
28
+ rspec (2.5.0)
29
+ rspec-core (~> 2.5.0)
30
+ rspec-expectations (~> 2.5.0)
31
+ rspec-mocks (~> 2.5.0)
32
+ rspec-core (2.5.1)
33
+ rspec-expectations (2.5.0)
32
34
  diff-lcs (~> 1.1.2)
33
- rspec-mocks (2.1.0)
34
- tzinfo (0.3.23)
35
+ rspec-mocks (2.5.0)
36
+ tzinfo (0.3.24)
35
37
  will_paginate (3.0.pre2)
36
38
 
37
39
  PLATFORMS
38
40
  ruby
39
41
 
40
42
  DEPENDENCIES
41
- mongoid (~> 2.0.0)
42
43
  mongoid-rspec!
43
- rspec (~> 2)
data/README.markdown CHANGED
@@ -3,30 +3,43 @@ mongoid-rspec
3
3
 
4
4
  RSpec matchers for Mongoid.
5
5
 
6
-
7
6
  Association Matchers
8
7
  -
9
8
  describe User do
10
- it { should reference_many :articles }
11
- it { should reference_many :comments }
9
+ it { should reference_many(:articles).with_foreign_key(:author_id) }
10
+ it { should have_many(:articles).with_foreign_key(:author_id) }
11
+
12
+ it { should reference_one(:record) }
13
+ it { should have_one(:record) }
14
+
15
+ it { should reference_many :comments }
16
+ it { should have_many :comments }
17
+
12
18
  it { should embed_one :profile }
13
- it { should reference_many(:children).stored_as(:array) }
14
- end
15
19
 
20
+ it { should reference_and_be_referenced_in_many(:children).of_type(User) }
21
+ it { should have_and_belong_to_many(:children) }
22
+ end
23
+
16
24
  describe Profile do
17
25
  it { should be_embedded_in(:user).as_inverse_of(:profile) }
18
26
  end
19
-
27
+
20
28
  describe Article do
21
- it { should be_referenced_in(:user).as_inverse_of(:articles) }
29
+ it { should be_referenced_in(:author).of_type(User).as_inverse_of(:articles) }
30
+ it { should belong_to(:author).of_type(User).as_inverse_of(:articles) }
22
31
  it { should embed_many(:comments) }
23
32
  end
24
-
33
+
25
34
  describe Comment do
26
35
  it { should be_embedded_in(:article).as_inverse_of(:comments) }
27
36
  it { should be_referenced_in(:user).as_inverse_of(:comments) }
28
37
  end
29
38
 
39
+ describe Record do
40
+ it { should be_referenced_in(:user).as_inverse_of(:record) }
41
+ end
42
+
30
43
  Validation Matchers
31
44
  -
32
45
  describe User do
@@ -36,10 +49,12 @@ Validation Matchers
36
49
  it { should validate_associated(:profile) }
37
50
  it { should validate_inclusion_of(:role).to_allow("admin", "member") }
38
51
  it { should validate_numericality_of(:age) }
52
+ it { should validate_length_of(:us_phone).as_exactly(7) }
53
+ it { should validate_confirmation_of(:email) }
39
54
  end
40
55
 
41
56
  describe Article do
42
- it { should validate_length_of(:title) }
57
+ it { should validate_length_of(:title).within(4..100) }
43
58
  end
44
59
 
45
60
  Others
@@ -64,3 +79,9 @@ drop in existing or dedicated support file in spec/support (spec/support/mongoid
64
79
  RSpec.configure do |configuration|
65
80
  configuration.include Mongoid::Matchers
66
81
  end
82
+
83
+ Acknowledgement
84
+ -
85
+ Thanks to [Durran Jordan](https://github.com/durran) for providing the changes necessary to make
86
+ this compatible with mongoid 2.0.0.rc, and for other [contributors](https://github.com/evansagge/mongoid-rspec/contributors)
87
+ to this project.
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.email = "evansagge@gmail.com"
11
11
  gem.homepage = "http://github.com/evansagge/mongoid-rspec"
12
12
  gem.authors = ["Evan Sagge"]
13
- gem.add_dependency "mongoid", "~> 2.0.0"
13
+ gem.add_dependency "mongoid", "~> 2.0.0.rc.7"
14
14
  gem.add_dependency "rspec", "~> 2"
15
15
  end
16
16
  Jeweler::GemcutterTasks.new
@@ -32,7 +32,7 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
32
32
  spec.rcov = true
33
33
  end
34
34
 
35
- task :spec => :check_dependencies
35
+ # task :spec => :check_dependencies
36
36
 
37
37
  require 'rake/rdoctask'
38
38
  Rake::RDocTask.new do |rdoc|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.2
1
+ 1.4.1
@@ -1,17 +1,18 @@
1
- require 'mongoid/associations'
1
+ require 'mongoid/relations'
2
2
 
3
3
  module Mongoid
4
4
  module Matchers
5
5
  module Associations
6
- HAS_MANY = defined?(Mongoid::Associations::HasManyRelated) ? Mongoid::Associations::HasManyRelated : Mongoid::Associations::ReferencesMany
7
- HAS_MANY_AS_ARRAY = Mongoid::Associations::ReferencesManyAsArray
8
- HAS_ONE = defined?(Mongoid::Associations::HasOneRelated) ? Mongoid::Associations::HasOneRelated : Mongoid::Associations::ReferencesOne
9
- BELONGS_TO = defined?(Mongoid::Associations::BelongsToRelated) ? Mongoid::Associations::BelongsToRelated : Mongoid::Associations::ReferencedIn
10
- EMBEDS_MANY = Mongoid::Associations::EmbedsMany
11
- EMBEDS_ONE = Mongoid::Associations::EmbedsOne
12
- EMBEDDED_IN = Mongoid::Associations::EmbeddedIn
13
-
14
-
6
+
7
+ HAS_MANY = Mongoid::Relations::Referenced::Many
8
+ HAS_AND_BELONGS_TO_MANY = Mongoid::Relations::Referenced::ManyToMany
9
+ HAS_ONE = Mongoid::Relations::Referenced::One
10
+ BELONGS_TO = Mongoid::Relations::Referenced::In
11
+ EMBEDS_MANY = Mongoid::Relations::Embedded::Many
12
+ EMBEDS_ONE = Mongoid::Relations::Embedded::One
13
+ EMBEDDED_IN = Mongoid::Relations::Embedded::In
14
+
15
+
15
16
  class HaveAssociationMatcher
16
17
  def initialize(name, association_type)
17
18
  @association = {}
@@ -24,13 +25,13 @@ module Mongoid
24
25
  @expectation_message = "#{type_description} #{@association[:name].inspect}"
25
26
  @expectation_message << " of type #{@association[:class].inspect}" unless @association[:class].nil?
26
27
  end
27
-
28
+
28
29
  def of_type(klass)
29
30
  @association[:class] = klass
30
31
  @expectation_message << " of type #{@association[:class].inspect}"
31
32
  self
32
33
  end
33
-
34
+
34
35
  def as_inverse_of(association_inverse_name)
35
36
  raise "#{@association[:type].inspect} does not respond to :inverse_of" unless [BELONGS_TO, EMBEDDED_IN].include?(@association[:type])
36
37
  @association[:inverse_of] = association_inverse_name.to_s
@@ -39,60 +40,74 @@ module Mongoid
39
40
  end
40
41
 
41
42
  def stored_as(store_as)
42
- @association[:type] = HAS_MANY_AS_ARRAY if store_as == :array
43
+ raise NotImplementedError, "`references_many #{@association[:name]} :stored_as => :array` has been removed in Mongoid 2.0.0.rc, use `references_and_referenced_in_many #{@association[:name]}` instead"
44
+ end
45
+
46
+ def with_foreign_key(foreign_key)
47
+ @association[:foreign_key] = foreign_key.to_s
48
+ @expectation_message << " using foreign key #{@association[:foreign_key].inspect}"
43
49
  self
44
50
  end
45
-
51
+
46
52
  def matches?(actual)
47
53
  @actual = actual.is_a?(Class) ? actual : actual.class
48
- association = @actual.associations[@association[:name]]
49
-
50
-
51
- if association.nil?
54
+ metadata = @actual.relations[@association[:name]]
55
+
56
+ if metadata.nil?
52
57
  @negative_result_message = "no association named #{@association[:name]}"
53
58
  return false
54
59
  else
55
60
  @positive_result_message = "association named #{@association[:name]}"
56
61
  end
57
-
58
- if association.association != @association[:type]
59
- @negative_result_message = "#{@actual.inspect} #{type_description(association.association, false)} #{@association[:name]}"
62
+
63
+ relation = metadata.relation
64
+ if relation != @association[:type]
65
+ @negative_result_message = "#{@actual.inspect} #{type_description(relation, false)} #{@association[:name]}"
60
66
  return false
61
67
  else
62
- @positive_result_message = "#{@actual.inspect} #{type_description(association.association, false)} #{@association[:name]}"
68
+ @positive_result_message = "#{@actual.inspect} #{type_description(relation, false)} #{@association[:name]}"
63
69
  end
64
-
65
- if !@association[:class].nil? and @association[:class] != association.klass
66
- @negative_result_message = "#{@positive_result_message} of type #{association.klass.inspect}"
70
+
71
+ if !@association[:class].nil? and @association[:class] != metadata.klass
72
+ @negative_result_message = "#{@positive_result_message} of type #{metadata.klass.inspect}"
67
73
  return false
68
74
  else
69
- @positive_result_message = "#{@positive_result_message} of type #{association.klass.inspect}"
75
+ @positive_result_message = "#{@positive_result_message} of type #{metadata.klass.inspect}"
70
76
  end
71
-
77
+
72
78
  if @association[:inverse_of]
73
- if @association[:inverse_of].to_s != association.inverse_of.to_s
74
- @negative_result_message = "#{@positive_result_message} which is an inverse of #{association.inverse_of}"
79
+ if @association[:inverse_of].to_s != metadata.inverse_of.to_s
80
+ @negative_result_message = "#{@positive_result_message} which is an inverse of #{metadata.inverse_of}"
81
+ return false
82
+ else
83
+ @positive_result_message = "#{@positive_result_message} which is an inverse of #{metadata.inverse_of}"
84
+ end
85
+ end
86
+
87
+ if @association[:foreign_key]
88
+ if metadata.foreign_key != @association[:foreign_key]
89
+ @negative_result_message = "#{@positive_result_message} with foreign key #{metadata.foreign_key.inspect}"
75
90
  return false
76
91
  else
77
- @positive_result_message = "#{@positive_result_message} which is an inverse of #{association.inverse_of}"
92
+ @positive_result_message = "#{@positive_result_message} with foreign key #{metadata.foreign_key.inspect}"
78
93
  end
79
94
  end
80
-
81
- true
95
+
96
+ return true
82
97
  end
83
-
84
- def failure_message_for_should
85
- "Expected #{@actual.inspect} to #{@expectation_message}, got #{@negative_result_message}"
86
- end
87
-
88
- def failure_message_for_should_not
89
- "Expected #{@actual.inspect} to not #{@expectation_message}, got #{@positive_result_message}"
98
+
99
+ def failure_message_for_should
100
+ "Expected #{@actual.inspect} to #{@expectation_message}, got #{@negative_result_message}"
90
101
  end
91
-
102
+
103
+ def failure_message_for_should_not
104
+ "Expected #{@actual.inspect} to not #{@expectation_message}, got #{@positive_result_message}"
105
+ end
106
+
92
107
  def description
93
108
  @expectation_message
94
109
  end
95
-
110
+
96
111
  def type_description(type = nil, passive = true)
97
112
  type ||= @association[:type]
98
113
  case type.name
@@ -106,42 +121,50 @@ module Mongoid
106
121
  (passive ? 'reference' : 'references') << ' one'
107
122
  when HAS_MANY.name
108
123
  (passive ? 'reference' : 'references') << ' many'
109
- when HAS_MANY_AS_ARRAY.name
110
- (passive ? 'reference' : 'references') << ' many as array'
124
+ when HAS_AND_BELONGS_TO_MANY.name
125
+ (passive ? 'reference' : 'references') << ' and referenced in many'
111
126
  when BELONGS_TO.name
112
127
  (passive ? 'be referenced in' : 'referenced in')
113
128
  else
114
129
  raise "Unknown association type '%s'" % type
115
130
  end
116
131
  end
117
- end
118
-
132
+ end
133
+
119
134
  def embed_one(association_name)
120
135
  HaveAssociationMatcher.new(association_name, EMBEDS_ONE)
121
136
  end
122
-
137
+
123
138
  def embed_many(association_name)
124
139
  HaveAssociationMatcher.new(association_name, EMBEDS_MANY)
125
- end
126
-
140
+ end
141
+
127
142
  def be_embedded_in(association_name)
128
143
  HaveAssociationMatcher.new(association_name, EMBEDDED_IN)
129
144
  end
130
-
145
+
131
146
  def have_one_related(association_name)
132
147
  HaveAssociationMatcher.new(association_name, HAS_ONE)
133
- end
148
+ end
134
149
  alias :reference_one :have_one_related
135
-
150
+ alias :have_one :have_one_related
151
+
136
152
  def have_many_related(association_name)
137
153
  HaveAssociationMatcher.new(association_name, HAS_MANY)
138
- end
139
- alias :reference_many :have_many_related
140
-
154
+ end
155
+ alias :reference_many :have_many_related
156
+ alias :have_many :have_many_related
157
+
158
+ def have_and_belong_to_many(association_name)
159
+ HaveAssociationMatcher.new(association_name, HAS_AND_BELONGS_TO_MANY)
160
+ end
161
+ alias :reference_and_be_referenced_in_many :have_and_belong_to_many
162
+
141
163
  def belong_to_related(association_name)
142
164
  HaveAssociationMatcher.new(association_name, BELONGS_TO)
143
- end
144
- alias :be_referenced_in :belong_to_related
145
- end
165
+ end
166
+ alias :be_referenced_in :belong_to_related
167
+ alias :belong_to :belong_to_related
168
+ end
146
169
  end
147
- end
170
+ end
@@ -57,37 +57,6 @@ module Mongoid
57
57
  HaveFieldMatcher.new(*args)
58
58
  end
59
59
  alias_method :have_fields, :have_field
60
-
61
- class SaveMatcher
62
- def initialize(attributes = {})
63
- @attributes = attributes
64
- end
65
-
66
- def matches?(actual)
67
- @actual = actual.is_a?(Class) ?
68
- ( defined?(::Factory) ? ::Factory.build(actual.name.underscore, @attributes) : actual.new(@attributes)) :
69
- actual
70
- @actual.valid? and @actual.save
71
- end
72
-
73
- def failure_message_for_should
74
- "Expected #{@actual.inspect} to save properly, got #{@actual.errors.full_messages.to_sentence}"
75
- end
76
-
77
- def failure_message_for_should_not
78
- "Expected #{@actual.inspect} to not save, got saved instead"
79
- end
80
-
81
- def description
82
- "save properly"
83
- end
84
- end
85
-
86
- def save(attributes = {})
87
- SaveMatcher.new(attributes)
88
- end
89
- alias_method :save_properly, :save
90
-
91
60
  end
92
61
  end
93
62
 
@@ -26,7 +26,7 @@ module Mongoid
26
26
 
27
27
  def failure_message_for_should
28
28
  "Expected #{@klass.inspect} to #{description}, got #{@negative_result_message}"
29
- end
29
+ end
30
30
 
31
31
  def failure_message_for_should_not
32
32
  "Expected #{@klass.inspect} to not #{description}, got #{@positive_result_message}"
@@ -0,0 +1,9 @@
1
+ module Mongoid
2
+ module Matchers
3
+ module Validations
4
+ def validate_confirmation_of(field)
5
+ HaveValidationMatcher.new(field, :confirmation)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,9 +1,100 @@
1
1
  module Mongoid
2
2
  module Matchers
3
3
  module Validations
4
+ class ValidateLengthOfMatcher < HaveValidationMatcher
5
+ def initialize(name)
6
+ super(name, :length)
7
+ end
8
+
9
+ def with_maximum(value)
10
+ @maximum = value
11
+ self
12
+ end
13
+
14
+ def with_minimum(value)
15
+ @minimum = value
16
+ self
17
+ end
18
+
19
+ def within(value)
20
+ @within = value
21
+ self
22
+ end
23
+ alias :in :within
24
+
25
+ def as_exactly(value)
26
+ @is = value
27
+ self
28
+ end
29
+ alias :is :as_exactly
30
+
31
+ def matches?(actual)
32
+ return false unless @result = super(actual)
33
+
34
+ check_maximum if @maximum
35
+ check_minimum if @minimum
36
+ check_range if @within
37
+ check_exact if @is
38
+
39
+ @result
40
+ end
41
+
42
+ def description
43
+ options_desc = []
44
+ options_desc << " with maximum #{@maximum}" if @maximum
45
+ options_desc << " with minimum #{@minimum}" if @minimum
46
+ options_desc << " within range #{@within}" if @within
47
+ options_desc << " as exactly #{@is}" if @is
48
+ super << options_desc.to_sentence
49
+ end
50
+
51
+ private
52
+
53
+ def check_maximum
54
+ actual = @validator.options[:maximum]
55
+ if actual == @maximum
56
+ @positive_result_message << " with maximum of #{@maximum}"
57
+ else
58
+ @negative_result_message << " with maximum of #{actual}"
59
+ @result = false
60
+ end
61
+ end
62
+
63
+ def check_minimum
64
+ actual = @validator.options[:minimum]
65
+ if actual == @minimum
66
+ @positive_result_message << " with minimum of #{@minimum}"
67
+ else
68
+ @negative_result_message << " with minimum of #{actual}"
69
+ @result = false
70
+ end
71
+ end
72
+
73
+ def check_range
74
+ min, max = [@within.min, @within.max]
75
+ actual = @validator.options
76
+ if actual[:minimum] == min && actual[:maximum] == max
77
+ @positive_result_message << " with range #{@within.inspect}"
78
+ else
79
+ @negative_result_message << " with range #{(actual[:minimum]..actual[:maximum]).inspect}"
80
+ @result = false
81
+ end
82
+ end
83
+
84
+ def check_exact
85
+ actual = @validator.options[:is]
86
+ if actual == @is
87
+ @positive_result_message << " is exactly #{@is}"
88
+ else
89
+ @negative_result_message << " is exactly #{actual}"
90
+ @result = false
91
+ end
92
+ end
93
+ end
94
+
4
95
  def validate_length_of(field)
5
- HaveValidationMatcher.new(field, :length)
96
+ ValidateLengthOfMatcher.new(field)
6
97
  end
7
98
  end
8
99
  end
9
- end
100
+ end
@@ -1,9 +1,41 @@
1
1
  module Mongoid
2
2
  module Matchers
3
- module Validations
3
+ module Validations
4
+ class ValidateNumericalityOfMatcher < HaveValidationMatcher
5
+ def initialize(field)
6
+ super(field, :numericality)
7
+ end
8
+
9
+ def greater_than(value)
10
+ @greater_than = value
11
+ self
12
+ end
13
+
14
+ def matches?(actual)
15
+ return false unless result = super(actual)
16
+
17
+ if @greater_than
18
+ if @validator.options[:greater_than] == @greater_than
19
+ @positive_result_message = @positive_result_message << " checking if values are greater than #{@validator.options[:greater_than].inspect}"
20
+ else
21
+ @negative_result_message = @negative_result_message << " checking if values are greater than #{@validator.options[:greater_than].inspect}"
22
+ result = false
23
+ end
24
+ end
25
+
26
+ result
27
+ end
28
+
29
+ def description
30
+ options_desc = []
31
+ options_desc << " allowing values greater than #{@greater_than}" if @greater_than
32
+ super << options_desc.to_sentence
33
+ end
34
+ end
35
+
4
36
  def validate_numericality_of(field)
5
- HaveValidationMatcher.new(field, :numericality)
6
- end
37
+ ValidateNumericalityOfMatcher.new(field)
38
+ end
7
39
  end
8
40
  end
9
- end
41
+ end
data/lib/mongoid-rspec.rb CHANGED
@@ -6,6 +6,7 @@ require 'matchers/document'
6
6
  require 'matchers/associations'
7
7
  require 'matchers/validations'
8
8
  require 'matchers/validations/associated'
9
+ require 'matchers/validations/confirmation_of'
9
10
  require 'matchers/validations/format_of'
10
11
  require 'matchers/validations/inclusion_of'
11
12
  require 'matchers/validations/length_of'
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid-rspec}
8
- s.version = "1.3.2"
8
+ s.version = "1.4.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Evan Sagge"]
12
- s.date = %q{2010-11-11}
12
+ s.date = %q{2011-03-03}
13
13
  s.description = %q{RSpec matches for Mongoid models, including association and validation matchers}
14
14
  s.email = %q{evansagge@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  "lib/matchers/document.rb",
31
31
  "lib/matchers/validations.rb",
32
32
  "lib/matchers/validations/associated.rb",
33
+ "lib/matchers/validations/confirmation_of.rb",
33
34
  "lib/matchers/validations/format_of.rb",
34
35
  "lib/matchers/validations/inclusion_of.rb",
35
36
  "lib/matchers/validations/length_of.rb",
@@ -41,6 +42,7 @@ Gem::Specification.new do |s|
41
42
  "spec/models/article.rb",
42
43
  "spec/models/comment.rb",
43
44
  "spec/models/profile.rb",
45
+ "spec/models/record.rb",
44
46
  "spec/models/site.rb",
45
47
  "spec/models/user.rb",
46
48
  "spec/spec_helper.rb",
@@ -56,6 +58,7 @@ Gem::Specification.new do |s|
56
58
  "spec/models/article.rb",
57
59
  "spec/models/comment.rb",
58
60
  "spec/models/profile.rb",
61
+ "spec/models/record.rb",
59
62
  "spec/models/site.rb",
60
63
  "spec/models/user.rb",
61
64
  "spec/spec_helper.rb",
@@ -69,14 +72,17 @@ Gem::Specification.new do |s|
69
72
  s.specification_version = 3
70
73
 
71
74
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
72
- s.add_runtime_dependency(%q<mongoid>, ["~> 2.0.0"])
75
+ s.add_runtime_dependency(%q<mongoid-rspec>, [">= 0"])
76
+ s.add_runtime_dependency(%q<mongoid>, ["~> 2.0.0.rc.7"])
73
77
  s.add_runtime_dependency(%q<rspec>, ["~> 2"])
74
78
  else
75
- s.add_dependency(%q<mongoid>, ["~> 2.0.0"])
79
+ s.add_dependency(%q<mongoid-rspec>, [">= 0"])
80
+ s.add_dependency(%q<mongoid>, ["~> 2.0.0.rc.7"])
76
81
  s.add_dependency(%q<rspec>, ["~> 2"])
77
82
  end
78
83
  else
79
- s.add_dependency(%q<mongoid>, ["~> 2.0.0"])
84
+ s.add_dependency(%q<mongoid-rspec>, [">= 0"])
85
+ s.add_dependency(%q<mongoid>, ["~> 2.0.0.rc.7"])
80
86
  s.add_dependency(%q<rspec>, ["~> 2"])
81
87
  end
82
88
  end
@@ -6,7 +6,7 @@ class Article
6
6
  field :published, :type => Boolean, :default => false
7
7
 
8
8
  embeds_many :comments
9
- referenced_in :user, :inverse_of => :articles
9
+ referenced_in :author, :class_name => 'User', :inverse_of => :articles
10
10
 
11
11
  validates :title, :presence => true
12
12
 
@@ -7,5 +7,5 @@ class Profile
7
7
 
8
8
  embedded_in :user, :inverse_of => :profile
9
9
 
10
- validates_numericality_of :age
10
+ validates_numericality_of :age, :greater_than => 0
11
11
  end
@@ -0,0 +1,5 @@
1
+ class Record
2
+ include Mongoid::Document
3
+
4
+ referenced_in :user, :inverse_of => :record
5
+ end
data/spec/models/user.rb CHANGED
@@ -1,23 +1,24 @@
1
1
  class User
2
2
  include Mongoid::Document
3
-
3
+
4
4
  field :login
5
5
  field :email
6
6
  field :role
7
-
7
+
8
8
  referenced_in :site, :inverse_of => :users
9
- references_many :articles
9
+ references_many :articles, :foreign_key => :author_id
10
10
  references_many :comments
11
- references_many :children, :stored_as => :array, :class_name => "User"
12
-
11
+ references_and_referenced_in_many :children, :class_name => "User"
12
+ references_one :record
13
+
13
14
  embeds_one :profile
14
-
15
+
15
16
  validates :login, :presence => true, :uniqueness => { :scope => :site }, :format => { :with => /^[\w\-]+$/ }
16
- validates :email, :uniqueness => { :case_sensitive => false, :scope => :site, :message => "is already taken" }
17
+ validates :email, :uniqueness => { :case_sensitive => false, :scope => :site, :message => "is already taken" }, :confirmation => true
17
18
  validates :role, :presence => true, :inclusion => { :in => ["admin", "moderator", "member"]}
18
19
  validates :profile, :presence => true, :associated => true
19
-
20
+
20
21
  def admin?
21
22
  false
22
23
  end
23
- end
24
+ end
@@ -2,23 +2,37 @@ require 'spec_helper'
2
2
 
3
3
  describe "Associations" do
4
4
  describe User do
5
- it { should reference_many :articles }
6
- it { should reference_many :comments }
5
+ it { should reference_many(:articles).with_foreign_key(:author_id) }
6
+ it { should have_many(:articles).with_foreign_key(:author_id) }
7
+
8
+ it { should reference_one(:record) }
9
+ it { should have_one(:record) }
10
+
11
+ it { should reference_many :comments }
12
+ it { should have_many :comments }
13
+
7
14
  it { should embed_one :profile }
8
- it { should reference_many(:children).stored_as(:array) }
15
+
16
+ it { should reference_and_be_referenced_in_many(:children).of_type(User) }
17
+ it { should have_and_belong_to_many(:children) }
9
18
  end
10
-
19
+
11
20
  describe Profile do
12
21
  it { should be_embedded_in(:user).as_inverse_of(:profile) }
13
22
  end
14
-
23
+
15
24
  describe Article do
16
- it { should be_referenced_in(:user).as_inverse_of(:articles) }
25
+ it { should be_referenced_in(:author).of_type(User).as_inverse_of(:articles) }
26
+ it { should belong_to(:author).of_type(User).as_inverse_of(:articles) }
17
27
  it { should embed_many(:comments) }
18
28
  end
19
-
29
+
20
30
  describe Comment do
21
31
  it { should be_embedded_in(:article).as_inverse_of(:comments) }
22
32
  it { should be_referenced_in(:user).as_inverse_of(:comments) }
23
33
  end
24
- end
34
+
35
+ describe Record do
36
+ it { should be_referenced_in(:user).as_inverse_of(:record) }
37
+ end
38
+ end
@@ -13,13 +13,14 @@ describe "Validations" do
13
13
  it { should validate_format_of(:login).to_allow("valid_login").not_to_allow("invalid login") }
14
14
  it { should validate_associated(:profile) }
15
15
  it { should validate_inclusion_of(:role).to_allow("admin", "member") }
16
+ it { should validate_confirmation_of(:email) }
16
17
  end
17
18
 
18
19
  describe Profile do
19
- it { should validate_numericality_of(:age) }
20
+ it { should validate_numericality_of(:age).greater_than(0) }
20
21
  end
21
22
 
22
23
  describe Article do
23
- it { should validate_length_of(:title) }
24
+ it { should validate_length_of(:title).within(8..16) }
24
25
  end
25
- end
26
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 3
8
- - 2
9
- version: 1.3.2
7
+ - 4
8
+ - 1
9
+ version: 1.4.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Evan Sagge
@@ -14,13 +14,25 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-11 00:00:00 +08:00
17
+ date: 2011-03-03 00:00:00 +08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: mongoid
22
- prerelease: false
21
+ name: mongoid-rspec
23
22
  requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ prerelease: false
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: mongoid
35
+ requirement: &id002 !ruby/object:Gem::Requirement
24
36
  none: false
25
37
  requirements:
26
38
  - - ~>
@@ -29,13 +41,15 @@ dependencies:
29
41
  - 2
30
42
  - 0
31
43
  - 0
32
- version: 2.0.0
44
+ - rc
45
+ - 7
46
+ version: 2.0.0.rc.7
33
47
  type: :runtime
34
- version_requirements: *id001
48
+ prerelease: false
49
+ version_requirements: *id002
35
50
  - !ruby/object:Gem::Dependency
36
51
  name: rspec
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
52
+ requirement: &id003 !ruby/object:Gem::Requirement
39
53
  none: false
40
54
  requirements:
41
55
  - - ~>
@@ -44,7 +58,8 @@ dependencies:
44
58
  - 2
45
59
  version: "2"
46
60
  type: :runtime
47
- version_requirements: *id002
61
+ prerelease: false
62
+ version_requirements: *id003
48
63
  description: RSpec matches for Mongoid models, including association and validation matchers
49
64
  email: evansagge@gmail.com
50
65
  executables: []
@@ -68,6 +83,7 @@ files:
68
83
  - lib/matchers/document.rb
69
84
  - lib/matchers/validations.rb
70
85
  - lib/matchers/validations/associated.rb
86
+ - lib/matchers/validations/confirmation_of.rb
71
87
  - lib/matchers/validations/format_of.rb
72
88
  - lib/matchers/validations/inclusion_of.rb
73
89
  - lib/matchers/validations/length_of.rb
@@ -79,6 +95,7 @@ files:
79
95
  - spec/models/article.rb
80
96
  - spec/models/comment.rb
81
97
  - spec/models/profile.rb
98
+ - spec/models/record.rb
82
99
  - spec/models/site.rb
83
100
  - spec/models/user.rb
84
101
  - spec/spec_helper.rb
@@ -121,6 +138,7 @@ test_files:
121
138
  - spec/models/article.rb
122
139
  - spec/models/comment.rb
123
140
  - spec/models/profile.rb
141
+ - spec/models/record.rb
124
142
  - spec/models/site.rb
125
143
  - spec/models/user.rb
126
144
  - spec/spec_helper.rb