mongoid 4.0.2 → 5.0.0.beta

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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -12,10 +12,10 @@ module Rails
12
12
  #
13
13
  # @param [ Application ] app The rails application.
14
14
  def load_models(app)
15
- app.config.paths["app/models"].each do |path|
15
+ app.config.paths["app/models"].expanded.each do |path|
16
16
  preload = ::Mongoid.preload_models
17
17
  if preload.resizable?
18
- files = preload.map { |model| "#{path}/#{model}.rb" }
18
+ files = preload.map { |model| "#{path}/#{model.underscore}.rb" }
19
19
  else
20
20
  files = Dir.glob("#{path}/**/*.rb")
21
21
  end
@@ -1,5 +1,5 @@
1
1
  class Audio
2
2
  include Mongoid::Document
3
3
  field :likes, type: Integer
4
- default_scope ->{ where(:likes.gt => 100) }
4
+ default_scope ->{ self.or({:likes => nil}, {:likes.gt => 100}) }
5
5
  end
@@ -15,6 +15,7 @@ class Band
15
15
  field :sales, type: BigDecimal
16
16
  field :y, as: :years, type: Integer
17
17
  field :founded, type: Date
18
+ field :deleted, type: Boolean
18
19
 
19
20
  embeds_many :records, cascade_callbacks: true
20
21
  embeds_many :notes, as: :noteable, cascade_callbacks: true, validate: false
@@ -0,0 +1,5 @@
1
+ class Company
2
+ include Mongoid::Document
3
+
4
+ embeds_many :staffs
5
+ end
@@ -8,15 +8,22 @@ class Label
8
8
  field :after_update_called, type: Mongoid::Boolean, default: false
9
9
  field :after_validation_called, type: Mongoid::Boolean, default: false
10
10
 
11
+ field :before_save_count, type: Integer, default: 0
12
+
11
13
  embedded_in :artist
12
14
  embedded_in :band
13
15
 
16
+ before_save :before_save_stub
14
17
  after_create :after_create_stub
15
18
  after_save :after_save_stub
16
19
  after_update :after_update_stub
17
20
  after_validation :after_validation_stub
18
21
  before_validation :cleanup
19
22
 
23
+ def before_save_stub
24
+ self.before_save_count += 1
25
+ end
26
+
20
27
  def after_create_stub
21
28
  self.after_create_called = true
22
29
  end
@@ -0,0 +1,6 @@
1
+ class Pub
2
+ include Mongoid::Document
3
+ include Mongoid::Attributes::Dynamic
4
+ field :location, type: Array
5
+ index location: "2dsphere"
6
+ end
@@ -0,0 +1,7 @@
1
+ class Staff
2
+ include Mongoid::Document
3
+
4
+ embedded_in :company
5
+
6
+ field :age, type: Integer
7
+ end
@@ -0,0 +1,5 @@
1
+ class StoreAsDupTest1
2
+ include Mongoid::Document
3
+ embeds_one :store_as_dup_test2, :store_as => :t
4
+ field :name
5
+ end
@@ -0,0 +1,5 @@
1
+ class StoreAsDupTest2
2
+ include Mongoid::Document
3
+ embedded_in :store_as_dup_test1
4
+ field :name
5
+ end
@@ -1,34 +1,16 @@
1
1
  test:
2
- sessions:
2
+ clients:
3
3
  default:
4
4
  database: mongoid_test
5
5
  hosts:
6
6
  - <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
7
7
  options:
8
- read: primary
9
- mongohq_single:
10
- database: <%=ENV["MONGOHQ_SINGLE_NAME"]%>
11
- username: <%=ENV["MONGOHQ_SINGLE_USER"]%>
12
- password: <%=ENV["MONGOHQ_SINGLE_PASS"]%>
13
- hosts:
14
- - <%=ENV["MONGOHQ_SINGLE_URL"]%>
15
- options:
16
- write:
17
- w: 1
18
- read: primary
19
- mongohq_repl:
20
- database: <%=ENV["MONGOHQ_REPL_NAME"]%>
21
- username: <%=ENV["MONGOHQ_REPL_USER"]%>
22
- password: <%=ENV["MONGOHQ_REPL_PASS"]%>
23
- hosts:
24
- - <%=ENV["MONGOHQ_REPL_1_URL"]%>
25
- - <%=ENV["MONGOHQ_REPL_2_URL"]%>
26
- options:
27
- read: primary
28
- write:
29
- w: majority
30
- mongohq_repl_uri:
31
- uri: <%= ENV["MONGOHQ_REPL_URI"]%>
8
+ user: "mongoid-user"
9
+ password: "password"
10
+ auth_source: "admin"
11
+ read:
12
+ mode: primary
13
+ max_pool_size: 1
32
14
  options:
33
15
  include_root_in_json: false
34
16
  include_type_for_serialization: false
@@ -111,9 +111,7 @@ describe Mongoid::Atomic::Paths do
111
111
  end
112
112
 
113
113
  it "returns the association with id.atomic_selector" do
114
- expect(address.atomic_selector).to eq(
115
- { "_id" => person.id, "addresses._id" => address.id }
116
- )
114
+ expect(address.atomic_selector).to eq({ "_id" => person.id })
117
115
  end
118
116
  end
119
117
 
@@ -124,14 +122,8 @@ describe Mongoid::Atomic::Paths do
124
122
  person.addresses << address
125
123
  end
126
124
 
127
- it "returns the JSON notation to the document with ids" do
128
- expect(location.atomic_selector).to eq(
129
- {
130
- "_id" => person.id,
131
- "addresses._id" => address.id,
132
- "addresses.locations._id" => location.id
133
- }
134
- )
125
+ it "returns the JSON notation to the document with id" do
126
+ expect(location.atomic_selector).to eq({ "_id" => person.id })
135
127
  end
136
128
  end
137
129
  end
@@ -2936,11 +2936,11 @@ describe Mongoid::Attributes::Nested do
2936
2936
  context "when reloading the document" do
2937
2937
 
2938
2938
  it "updates the first existing document" do
2939
- expect(person.posts(true).first.title).to eq("First")
2939
+ expect(person.posts(true)[0].title).to eq("First")
2940
2940
  end
2941
2941
 
2942
2942
  it "updates the second existing document" do
2943
- expect(person.posts(true).last.title).to eq("Second")
2943
+ expect(person.posts(true)[1].title).to eq("Second")
2944
2944
  end
2945
2945
 
2946
2946
  it "does not add new documents" do
@@ -3094,11 +3094,11 @@ describe Mongoid::Attributes::Nested do
3094
3094
  context "when reloading the document" do
3095
3095
 
3096
3096
  it "does not ignore the marked document" do
3097
- expect(person.posts(true).first.title).to eq("Another Title")
3097
+ expect(person.posts(true)[0].title).to eq("Another Title")
3098
3098
  end
3099
3099
 
3100
3100
  it "does not delete the unmarked document" do
3101
- expect(person.posts(true).last.title).to eq("New Title")
3101
+ expect(person.posts(true)[1].title).to eq("New Title")
3102
3102
  end
3103
3103
 
3104
3104
  it "does not add additional documents" do
@@ -3127,7 +3127,7 @@ describe Mongoid::Attributes::Nested do
3127
3127
  end
3128
3128
 
3129
3129
  it "does not delete the unmarked document" do
3130
- expect(person.posts(true).last.title).to eq("New Title")
3130
+ expect(person.posts(true)[1].title).to eq("New Title")
3131
3131
  end
3132
3132
  end
3133
3133
  end
@@ -3198,7 +3198,7 @@ describe Mongoid::Attributes::Nested do
3198
3198
  end
3199
3199
 
3200
3200
  it "does not delete the unmarked document" do
3201
- expect(person.posts(true).last.title).to eq("New Title")
3201
+ expect(person.posts(true)[1].title).to eq("New Title")
3202
3202
  end
3203
3203
  end
3204
3204
  end
@@ -3224,15 +3224,15 @@ describe Mongoid::Attributes::Nested do
3224
3224
  end
3225
3225
 
3226
3226
  it "builds a new first document" do
3227
- expect(person.posts.first.title).to eq("First")
3227
+ expect(person.posts[0].title).to eq("First")
3228
3228
  end
3229
3229
 
3230
3230
  it "builds a new second document" do
3231
- expect(person.posts.second.title).to eq("Second")
3231
+ expect(person.posts[1].title).to eq("Second")
3232
3232
  end
3233
3233
 
3234
3234
  it "builds a new third document" do
3235
- expect(person.posts.third.title).to eq("Third")
3235
+ expect(person.posts[2].title).to eq("Third")
3236
3236
  end
3237
3237
 
3238
3238
  it "does not add extra documents" do
@@ -3776,7 +3776,7 @@ describe Mongoid::Attributes::Nested do
3776
3776
  end
3777
3777
 
3778
3778
  it "does not delete the unmarked document" do
3779
- expect(person.preferences(true).last.name).to eq("My Blog")
3779
+ expect(person.preferences(true)[1].name).to eq("My Blog")
3780
3780
  end
3781
3781
  end
3782
3782
  end
@@ -3811,11 +3811,11 @@ describe Mongoid::Attributes::Nested do
3811
3811
  context "when reloading the document" do
3812
3812
 
3813
3813
  it "does not ignore the marked document" do
3814
- expect(person.preferences(true).first.name).to eq("Another Title")
3814
+ expect(person.preferences(true)[0].name).to eq("Another Title")
3815
3815
  end
3816
3816
 
3817
3817
  it "does not delete the unmarked document" do
3818
- expect(person.preferences(true).last.name).to eq("New Title")
3818
+ expect(person.preferences(true)[1].name).to eq("New Title")
3819
3819
  end
3820
3820
 
3821
3821
  it "does not add additional documents" do
@@ -3844,7 +3844,7 @@ describe Mongoid::Attributes::Nested do
3844
3844
  end
3845
3845
 
3846
3846
  it "does not delete the unmarked document" do
3847
- expect(person.preferences(true).last.name).to eq("New Title")
3847
+ expect(person.preferences(true)[1].name).to eq("New Title")
3848
3848
  end
3849
3849
  end
3850
3850
  end
@@ -3874,11 +3874,11 @@ describe Mongoid::Attributes::Nested do
3874
3874
  context "when reloading" do
3875
3875
 
3876
3876
  it "does not ignore the marked document" do
3877
- expect(person.preferences(true).first.name).to eq("Another Title")
3877
+ expect(person.preferences(true)[0].name).to eq("Another Title")
3878
3878
  end
3879
3879
 
3880
3880
  it "does not delete the unmarked document" do
3881
- expect(person.preferences(true).last.name).to eq("New Title")
3881
+ expect(person.preferences(true)[1].name).to eq("New Title")
3882
3882
  end
3883
3883
 
3884
3884
  it "does not add additional documents" do
@@ -3907,7 +3907,7 @@ describe Mongoid::Attributes::Nested do
3907
3907
  end
3908
3908
 
3909
3909
  it "does not delete the unmarked document" do
3910
- expect(person.preferences(true).last.name).to eq("New Title")
3910
+ expect(person.preferences(true)[1].name).to eq("New Title")
3911
3911
  end
3912
3912
  end
3913
3913
  end
@@ -19,6 +19,17 @@ describe Mongoid::Attributes::Readonly do
19
19
  end
20
20
  end
21
21
 
22
+ context "when providing a field alias" do
23
+
24
+ before do
25
+ Person.attr_readonly :aliased_timestamp
26
+ end
27
+
28
+ it "adds the database field name to readonly attributes" do
29
+ expect(Person.readonly_attributes.to_a).to eq([ "at" ])
30
+ end
31
+ end
32
+
22
33
  context "when providing multiple fields" do
23
34
 
24
35
  before do
@@ -33,54 +44,71 @@ describe Mongoid::Attributes::Readonly do
33
44
  context "when creating a new document with a readonly field" do
34
45
 
35
46
  before do
36
- Person.attr_readonly :title, :terms
47
+ Person.attr_readonly :title, :terms, :aliased_timestamp
37
48
  end
38
49
 
39
50
  let(:person) do
40
- Person.create(title: "sir", terms: true)
51
+ Person.create(title: "sir", terms: true, aliased_timestamp: Time.at(42))
41
52
  end
42
53
 
43
54
  it "sets the first readonly value" do
44
55
  expect(person.title).to eq("sir")
45
56
  end
46
57
 
47
- it "sets subsequent readonly values" do
58
+ it "sets the second readonly value" do
48
59
  expect(person.terms).to be true
49
60
  end
50
61
 
62
+ it "sets the third readonly value" do
63
+ expect(person.aliased_timestamp).to eq(Time.at(42))
64
+ end
65
+
51
66
  it "persists the first readonly value" do
52
67
  expect(person.reload.title).to eq("sir")
53
68
  end
54
69
 
55
- it "persists subsequent readonly values" do
70
+ it "persists the second readonly value" do
56
71
  expect(person.reload.terms).to be true
57
72
  end
73
+
74
+ it "persists the third readonly value" do
75
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
76
+ end
58
77
  end
59
78
 
60
79
  context "when updating an existing readonly field" do
61
80
 
62
81
  before do
63
- Person.attr_readonly :title, :terms, :score
82
+ Person.attr_readonly :title, :terms, :score, :aliased_timestamp
64
83
  end
65
84
 
66
85
  let(:person) do
67
- Person.create(title: "sir", terms: true, score: 1)
86
+ Person.create(title: "sir", terms: true, score: 1, aliased_timestamp: Time.at(42))
68
87
  end
69
88
 
70
89
  context "when updating via the setter" do
71
90
 
72
91
  before do
73
92
  person.title = "mr"
93
+ person.aliased_timestamp = Time.at(43)
74
94
  person.save
75
95
  end
76
96
 
77
- it "does not update the field" do
97
+ it "does not update the first field" do
78
98
  expect(person.title).to eq("sir")
79
99
  end
80
100
 
81
- it "does not persist the changes" do
101
+ it "does not update the second field" do
102
+ expect(person.aliased_timestamp).to eq(Time.at(42))
103
+ end
104
+
105
+ it "does not persist the first field" do
82
106
  expect(person.reload.title).to eq("sir")
83
107
  end
108
+
109
+ it "does not persist the second field" do
110
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
111
+ end
84
112
  end
85
113
 
86
114
  context "when updating via inc" do
@@ -127,64 +155,98 @@ describe Mongoid::Attributes::Readonly do
127
155
 
128
156
  before do
129
157
  person[:title] = "mr"
158
+ person[:aliased_timestamp] = Time.at(43)
130
159
  person.save
131
160
  end
132
161
 
133
- it "does not update the field" do
162
+ it "does not update the first field" do
134
163
  expect(person.title).to eq("sir")
135
164
  end
136
165
 
137
- it "does not persist the changes" do
166
+ it "does not update the second field" do
167
+ expect(person.aliased_timestamp).to eq(Time.at(42))
168
+ end
169
+
170
+ it "does not persist the first field" do
138
171
  expect(person.reload.title).to eq("sir")
139
172
  end
173
+
174
+ it "does not persist the second field" do
175
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
176
+ end
140
177
  end
141
178
 
142
179
  context "when updating via write_attribute" do
143
180
 
144
181
  before do
145
182
  person.write_attribute(:title, "mr")
183
+ person.write_attribute(:aliased_timestamp, Time.at(43))
146
184
  person.save
147
185
  end
148
186
 
149
- it "does not update the field" do
187
+ it "does not update the first field" do
150
188
  expect(person.title).to eq("sir")
151
189
  end
152
190
 
153
- it "does not persist the changes" do
191
+ it "does not update the second field" do
192
+ expect(person.aliased_timestamp).to eq(Time.at(42))
193
+ end
194
+
195
+ it "does not persist the first field" do
154
196
  expect(person.reload.title).to eq("sir")
155
197
  end
198
+
199
+ it "does not persist the second field" do
200
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
201
+ end
156
202
  end
157
203
 
158
204
  context "when updating via update_attributes" do
159
205
 
160
206
  before do
161
- person.update_attributes(title: "mr")
207
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
162
208
  person.save
163
209
  end
164
210
 
165
- it "does not update the field" do
211
+ it "does not update the first field" do
166
212
  expect(person.title).to eq("sir")
167
213
  end
168
214
 
169
- it "does not persist the changes" do
215
+ it "does not update the second field" do
216
+ expect(person.aliased_timestamp).to eq(Time.at(42))
217
+ end
218
+
219
+ it "does not persist the first field" do
170
220
  expect(person.reload.title).to eq("sir")
171
221
  end
222
+
223
+ it "does not persist the second field" do
224
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
225
+ end
172
226
  end
173
227
 
174
228
  context "when updating via update_attributes!" do
175
229
 
176
230
  before do
177
- person.update_attributes!(title: "mr")
231
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
178
232
  person.save
179
233
  end
180
234
 
181
- it "does not update the field" do
235
+ it "does not update the first field" do
182
236
  expect(person.title).to eq("sir")
183
237
  end
184
238
 
185
- it "does not persist the changes" do
239
+ it "does not update the second field" do
240
+ expect(person.aliased_timestamp).to eq(Time.at(42))
241
+ end
242
+
243
+ it "does not persist the first field" do
186
244
  expect(person.reload.title).to eq("sir")
187
245
  end
246
+
247
+ it "does not persist the second field" do
248
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
249
+ end
188
250
  end
189
251
 
190
252
  context "when updating via update_attribute" do