|
113 | 113 | stats = AllocationStats.trace { 10.times { band.decibels } } |
114 | 114 | expect(stats.new_allocations.size).to eq(0) |
115 | 115 | end |
| 116 | + |
| 117 | + it 'achieves zero allocations for Set fields' do |
| 118 | + set_band_class = Class.new do |
| 119 | + include Mongoid::Document |
| 120 | + store_in collection: 'bands' |
| 121 | + field :genres, type: Set |
| 122 | + end |
| 123 | + stub_const('SetBand', set_band_class) |
| 124 | + |
| 125 | + band = SetBand.new(genres: Set.new(%w[rock metal])) |
| 126 | + band.genres # warm up |
| 127 | + stats = AllocationStats.trace { 10.times { band.genres } } |
| 128 | + expect(stats.new_allocations.size).to eq(0) |
| 129 | + end |
116 | 130 | end |
117 | 131 |
|
118 | 132 | context 'field access after setter' do |
|
212 | 226 | end |
213 | 227 | end |
214 | 228 |
|
| 229 | + context 'timezone-dependent caching' do |
| 230 | + config_override :use_utc, false |
| 231 | + |
| 232 | + let(:time_zone_class) do |
| 233 | + Class.new do |
| 234 | + include Mongoid::Document |
| 235 | + field :occurred_at, type: Time |
| 236 | + field :scheduled_at, type: DateTime |
| 237 | + end |
| 238 | + end |
| 239 | + |
| 240 | + before do |
| 241 | + stub_const('TimeZoneCacheTest', time_zone_class) |
| 242 | + end |
| 243 | + |
| 244 | + it 'refreshes a cached Time when Time.zone changes' do |
| 245 | + document = TimeZoneCacheTest.new(occurred_at: Time.utc(2024, 1, 1, 12)) |
| 246 | + |
| 247 | + utc = Time.use_zone('UTC') { document.occurred_at } |
| 248 | + pacific = Time.use_zone('Pacific Time (US & Canada)') { document.occurred_at } |
| 249 | + utc_again = Time.use_zone('UTC') { document.occurred_at } |
| 250 | + |
| 251 | + expect(utc.time_zone.name).to eq('UTC') |
| 252 | + expect(utc.hour).to eq(12) |
| 253 | + expect(pacific.time_zone.name).to eq('Pacific Time (US & Canada)') |
| 254 | + expect(pacific.hour).to eq(4) |
| 255 | + expect(utc_again.time_zone.name).to eq('UTC') |
| 256 | + expect(utc_again.hour).to eq(12) |
| 257 | + end |
| 258 | + |
| 259 | + it 'refreshes a cached DateTime when Time.zone changes' do |
| 260 | + document = TimeZoneCacheTest.new(scheduled_at: Time.utc(2024, 1, 1, 12)) |
| 261 | + |
| 262 | + utc = Time.use_zone('UTC') { document.scheduled_at } |
| 263 | + pacific = Time.use_zone('Pacific Time (US & Canada)') { document.scheduled_at } |
| 264 | + utc_again = Time.use_zone('UTC') { document.scheduled_at } |
| 265 | + |
| 266 | + expect(utc.offset).to eq(0) |
| 267 | + expect(utc.hour).to eq(12) |
| 268 | + expect(pacific.offset).to eq(Rational(-8, 24)) |
| 269 | + expect(pacific.hour).to eq(4) |
| 270 | + expect(utc_again.offset).to eq(0) |
| 271 | + expect(utc_again.hour).to eq(12) |
| 272 | + end |
| 273 | + end |
| 274 | + |
215 | 275 | context 'database persistence' do |
216 | 276 | before { band.save! } |
217 | 277 |
|
|
328 | 388 | expect(band.tags).to eq({ 'genre' => 'jazz', 'era' => '80s' }) |
329 | 389 | end |
330 | 390 |
|
| 391 | + it 'gets fresh Set and Range values after in-place raw attribute mutation' do |
| 392 | + raw_mutation_class = Class.new do |
| 393 | + include Mongoid::Document |
| 394 | + field :genres, type: Set |
| 395 | + field :decibels, type: Range |
| 396 | + end |
| 397 | + stub_const('RawMutationCacheTest', raw_mutation_class) |
| 398 | + |
| 399 | + document = RawMutationCacheTest.new( |
| 400 | + genres: Set.new(%w[rock metal]), |
| 401 | + decibels: (50..120) |
| 402 | + ) |
| 403 | + |
| 404 | + expect(document.genres).to eq(Set.new(%w[rock metal])) |
| 405 | + expect(document.decibels).to eq(50..120) |
| 406 | + |
| 407 | + document.attributes['genres'] << 'jazz' |
| 408 | + document.attributes['decibels']['max'] = 130 |
| 409 | + |
| 410 | + expect(document.genres).to eq(Set.new(%w[rock metal jazz])) |
| 411 | + expect(document.decibels).to eq(50..130) |
| 412 | + end |
| 413 | + |
331 | 414 | it 'clears cache when attribute is removed' do |
332 | 415 | band.name # cache it |
333 | 416 | expect(band.name).to eq('Test Band') |
|
0 commit comments