mongoid 7.1.0 → 7.1.6

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 (131) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +6 -6
  5. data/README.md +1 -1
  6. data/Rakefile +14 -5
  7. data/lib/config/locales/en.yml +5 -5
  8. data/lib/mongoid/association/accessors.rb +37 -2
  9. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  10. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  11. data/lib/mongoid/association/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
  13. data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
  14. data/lib/mongoid/association/referenced/eager.rb +29 -9
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  16. data/lib/mongoid/atomic.rb +13 -3
  17. data/lib/mongoid/clients/factory.rb +2 -2
  18. data/lib/mongoid/clients/options.rb +8 -8
  19. data/lib/mongoid/clients/sessions.rb +20 -4
  20. data/lib/mongoid/clients/storage_options.rb +5 -5
  21. data/lib/mongoid/config.rb +39 -9
  22. data/lib/mongoid/criteria.rb +23 -4
  23. data/lib/mongoid/criteria/modifiable.rb +2 -1
  24. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  25. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
  26. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  27. data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
  28. data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
  29. data/lib/mongoid/criteria/queryable/selectable.rb +120 -13
  30. data/lib/mongoid/criteria/queryable/storable.rb +104 -99
  31. data/lib/mongoid/errors/eager_load.rb +2 -0
  32. data/lib/mongoid/errors/no_client_config.rb +2 -2
  33. data/lib/mongoid/errors/no_default_client.rb +1 -1
  34. data/lib/mongoid/extensions/hash.rb +4 -2
  35. data/lib/mongoid/extensions/regexp.rb +1 -1
  36. data/lib/mongoid/fields.rb +2 -1
  37. data/lib/mongoid/fields/validators/macro.rb +4 -1
  38. data/lib/mongoid/matchable/regexp.rb +2 -2
  39. data/lib/mongoid/persistable/pushable.rb +11 -2
  40. data/lib/mongoid/persistence_context.rb +6 -6
  41. data/lib/mongoid/query_cache.rb +61 -18
  42. data/lib/mongoid/serializable.rb +9 -3
  43. data/lib/mongoid/tasks/database.rb +38 -3
  44. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  45. data/lib/mongoid/version.rb +1 -1
  46. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
  47. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  48. data/spec/app/models/coding.rb +4 -0
  49. data/spec/app/models/coding/pull_request.rb +12 -0
  50. data/spec/app/models/delegating_patient.rb +16 -0
  51. data/spec/app/models/passport.rb +1 -0
  52. data/spec/app/models/person.rb +2 -0
  53. data/spec/app/models/phone.rb +1 -0
  54. data/spec/app/models/publication.rb +5 -0
  55. data/spec/app/models/publication/encyclopedia.rb +12 -0
  56. data/spec/app/models/publication/review.rb +14 -0
  57. data/spec/app/models/series.rb +1 -0
  58. data/spec/app/models/wiki_page.rb +1 -0
  59. data/spec/integration/app_spec.rb +254 -0
  60. data/spec/integration/associations/embedded_spec.rb +54 -0
  61. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  62. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  63. data/spec/integration/associations/has_many_spec.rb +76 -0
  64. data/spec/integration/associations/has_one_spec.rb +76 -0
  65. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  66. data/spec/integration/criteria/date_field_spec.rb +41 -0
  67. data/spec/integration/criteria/logical_spec.rb +13 -0
  68. data/spec/integration/document_spec.rb +22 -0
  69. data/spec/integration/shardable_spec.rb +20 -4
  70. data/spec/lite_spec_helper.rb +12 -4
  71. data/spec/mongoid/association/accessors_spec.rb +238 -63
  72. data/spec/mongoid/association/embedded/embeds_many_models.rb +19 -0
  73. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  74. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  75. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
  76. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
  77. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
  78. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +2 -1
  79. data/spec/mongoid/clients/factory_spec.rb +8 -8
  80. data/spec/mongoid/clients/options_spec.rb +11 -11
  81. data/spec/mongoid/clients/sessions_spec.rb +8 -4
  82. data/spec/mongoid/clients/transactions_spec.rb +20 -8
  83. data/spec/mongoid/clients_spec.rb +2 -2
  84. data/spec/mongoid/contextual/atomic_spec.rb +22 -11
  85. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  86. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  87. data/spec/mongoid/contextual/mongo_spec.rb +76 -53
  88. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
  89. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  90. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  91. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  92. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  93. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
  94. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
  95. data/spec/mongoid/criteria/queryable/selectable_spec.rb +52 -0
  96. data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
  97. data/spec/mongoid/criteria_spec.rb +36 -2
  98. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  99. data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
  100. data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
  101. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
  102. data/spec/mongoid/fields_spec.rb +24 -1
  103. data/spec/mongoid/indexable_spec.rb +6 -4
  104. data/spec/mongoid/matchable/default_spec.rb +1 -1
  105. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  106. data/spec/mongoid/matchable_spec.rb +2 -2
  107. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  108. data/spec/mongoid/query_cache_spec.rb +77 -9
  109. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  110. data/spec/mongoid/scopable_spec.rb +2 -1
  111. data/spec/mongoid/serializable_spec.rb +129 -18
  112. data/spec/mongoid/shardable_models.rb +1 -1
  113. data/spec/mongoid/shardable_spec.rb +2 -2
  114. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  115. data/spec/mongoid/tasks/database_spec.rb +1 -1
  116. data/spec/shared/LICENSE +20 -0
  117. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  118. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  119. data/spec/shared/lib/mrss/constraints.rb +312 -0
  120. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  121. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  122. data/spec/spec_helper.rb +2 -31
  123. data/spec/support/child_process_helper.rb +76 -0
  124. data/spec/support/cluster_config.rb +3 -3
  125. data/spec/support/constraints.rb +26 -10
  126. data/spec/support/expectations.rb +3 -1
  127. data/spec/support/helpers.rb +11 -0
  128. data/spec/support/session_registry.rb +50 -0
  129. data/spec/support/spec_config.rb +12 -4
  130. metadata +520 -473
  131. metadata.gz.sig +0 -0
@@ -171,7 +171,8 @@ describe Mongoid::Contextual::Mongo do
171
171
  end
172
172
  end
173
173
 
174
- context 'when a collation is specified', if: collation_supported? do
174
+ context 'when a collation is specified' do
175
+ min_server_version '3.4'
175
176
 
176
177
  let(:context) do
177
178
  described_class.new(criteria)
@@ -232,7 +233,8 @@ describe Mongoid::Contextual::Mongo do
232
233
  expect(deleted).to eq(1)
233
234
  end
234
235
 
235
- context 'when the criteria has a collation', if: collation_supported? do
236
+ context 'when the criteria has a collation' do
237
+ min_server_version '3.4'
236
238
 
237
239
  let(:criteria) do
238
240
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -336,7 +338,8 @@ describe Mongoid::Contextual::Mongo do
336
338
  expect(destroyed).to eq(1)
337
339
  end
338
340
 
339
- context 'when the criteria has a collation', if: collation_supported? do
341
+ context 'when the criteria has a collation' do
342
+ min_server_version '3.4'
340
343
 
341
344
  let(:criteria) do
342
345
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -458,7 +461,8 @@ describe Mongoid::Contextual::Mongo do
458
461
  end
459
462
  end
460
463
 
461
- context 'when a collation is specified', if: collation_supported? do
464
+ context 'when a collation is specified' do
465
+ min_server_version '3.4'
462
466
 
463
467
  before do
464
468
  Band.create(name: 'DEPECHE MODE')
@@ -496,7 +500,8 @@ describe Mongoid::Contextual::Mongo do
496
500
  described_class.new(criteria)
497
501
  end
498
502
 
499
- context 'when the criteria has a collation', if: collation_supported? do
503
+ context 'when the criteria has a collation' do
504
+ min_server_version '3.4'
500
505
 
501
506
  let(:criteria) do
502
507
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -853,7 +858,8 @@ describe Mongoid::Contextual::Mongo do
853
858
  end
854
859
  end
855
860
 
856
- context 'when a collation is specified on the criteria', if: collation_supported? do
861
+ context 'when a collation is specified on the criteria' do
862
+ min_server_version '3.4'
857
863
 
858
864
  let(:criteria) do
859
865
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1006,7 +1012,8 @@ describe Mongoid::Contextual::Mongo do
1006
1012
  end
1007
1013
  end
1008
1014
 
1009
- context 'when a collation is specified on the criteria', if: collation_supported? do
1015
+ context 'when a collation is specified on the criteria' do
1016
+ min_server_version '3.4'
1010
1017
 
1011
1018
  let(:criteria) do
1012
1019
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1080,7 +1087,8 @@ describe Mongoid::Contextual::Mongo do
1080
1087
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
1081
1088
  end
1082
1089
 
1083
- context 'when a collation is specified on the criteria', if: collation_supported? do
1090
+ context 'when a collation is specified on the criteria' do
1091
+ min_server_version '3.4'
1084
1092
 
1085
1093
  let(:criteria) do
1086
1094
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1152,7 +1160,8 @@ describe Mongoid::Contextual::Mongo do
1152
1160
  expect(context.send(method)).to eq(depeche_mode)
1153
1161
  end
1154
1162
 
1155
- context 'when the criteria has a collation', if: collation_supported? do
1163
+ context 'when the criteria has a collation' do
1164
+ min_server_version '3.4'
1156
1165
 
1157
1166
  let(:criteria) do
1158
1167
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1556,6 +1565,10 @@ describe Mongoid::Contextual::Mongo do
1556
1565
  }}
1557
1566
  end
1558
1567
 
1568
+ let(:ordered_results) do
1569
+ results['results'].sort_by { |doc| doc['_id'] }
1570
+ end
1571
+
1559
1572
  context "when no selection is provided" do
1560
1573
 
1561
1574
  let(:criteria) do
@@ -1587,36 +1600,40 @@ describe Mongoid::Contextual::Mongo do
1587
1600
  end
1588
1601
 
1589
1602
  it "contains the entire raw results" do
1590
- expect(results["results"]).to eq([
1603
+ expect(ordered_results).to eq([
1591
1604
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1592
1605
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1593
1606
  ])
1594
1607
  end
1595
1608
 
1596
- it "contains the execution time" do
1597
- expect(results.time).to_not be_nil
1598
- end
1609
+ context 'when statistics are available' do
1610
+ max_server_version '4.2'
1599
1611
 
1600
- it "contains the count statistics" do
1601
- expect(results["counts"]).to eq({
1602
- "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1603
- })
1604
- end
1612
+ it "contains the execution time" do
1613
+ expect(results.time).to_not be_nil
1614
+ end
1605
1615
 
1606
- it "contains the input count" do
1607
- expect(results.input).to eq(2)
1608
- end
1616
+ it "contains the count statistics" do
1617
+ expect(results["counts"]).to eq({
1618
+ "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1619
+ })
1620
+ end
1609
1621
 
1610
- it "contains the emitted count" do
1611
- expect(results.emitted).to eq(2)
1612
- end
1622
+ it "contains the input count" do
1623
+ expect(results.input).to eq(2)
1624
+ end
1613
1625
 
1614
- it "contains the reduced count" do
1615
- expect(results.reduced).to eq(0)
1616
- end
1626
+ it "contains the emitted count" do
1627
+ expect(results.emitted).to eq(2)
1628
+ end
1617
1629
 
1618
- it "contains the output count" do
1619
- expect(results.output).to eq(2)
1630
+ it "contains the reduced count" do
1631
+ expect(results.reduced).to eq(0)
1632
+ end
1633
+
1634
+ it "contains the output count" do
1635
+ expect(results.output).to eq(2)
1636
+ end
1620
1637
  end
1621
1638
  end
1622
1639
 
@@ -1645,35 +1662,39 @@ describe Mongoid::Contextual::Mongo do
1645
1662
  end
1646
1663
 
1647
1664
  it "contains the entire raw results" do
1648
- expect(results["results"]).to eq([
1665
+ expect(ordered_results).to eq([
1649
1666
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1650
1667
  ])
1651
1668
  end
1652
1669
 
1653
- it "contains the execution time" do
1654
- expect(results.time).to_not be_nil
1655
- end
1670
+ context 'when statistics are available' do
1671
+ max_server_version '4.2'
1656
1672
 
1657
- it "contains the count statistics" do
1658
- expect(results["counts"]).to eq({
1659
- "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1660
- })
1661
- end
1673
+ it "contains the execution time" do
1674
+ expect(results.time).to_not be_nil
1675
+ end
1662
1676
 
1663
- it "contains the input count" do
1664
- expect(results.input).to eq(1)
1665
- end
1677
+ it "contains the count statistics" do
1678
+ expect(results["counts"]).to eq({
1679
+ "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1680
+ })
1681
+ end
1666
1682
 
1667
- it "contains the emitted count" do
1668
- expect(results.emitted).to eq(1)
1669
- end
1683
+ it "contains the input count" do
1684
+ expect(results.input).to eq(1)
1685
+ end
1670
1686
 
1671
- it "contains the reduced count" do
1672
- expect(results.reduced).to eq(0)
1673
- end
1687
+ it "contains the emitted count" do
1688
+ expect(results.emitted).to eq(1)
1689
+ end
1674
1690
 
1675
- it "contains the output count" do
1676
- expect(results.output).to eq(1)
1691
+ it "contains the reduced count" do
1692
+ expect(results.reduced).to eq(0)
1693
+ end
1694
+
1695
+ it "contains the output count" do
1696
+ expect(results.output).to eq(1)
1697
+ end
1677
1698
  end
1678
1699
  end
1679
1700
 
@@ -1713,7 +1734,7 @@ describe Mongoid::Contextual::Mongo do
1713
1734
  end
1714
1735
 
1715
1736
  it "contains the entire raw results" do
1716
- expect(results["results"]).to eq([
1737
+ expect(ordered_results).to eq([
1717
1738
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1718
1739
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1719
1740
  ])
@@ -2166,7 +2187,8 @@ describe Mongoid::Contextual::Mongo do
2166
2187
  end
2167
2188
  end
2168
2189
 
2169
- context 'when provided array filters', if: array_filters_supported? do
2190
+ context 'when provided array filters' do
2191
+ min_server_version '3.6'
2170
2192
 
2171
2193
  before do
2172
2194
  Band.delete_all
@@ -2338,7 +2360,8 @@ describe Mongoid::Contextual::Mongo do
2338
2360
  end
2339
2361
  end
2340
2362
 
2341
- context 'when provided array filters', if: array_filters_supported? do
2363
+ context 'when provided array filters' do
2364
+ min_server_version '3.6'
2342
2365
 
2343
2366
  before do
2344
2367
  Band.delete_all
@@ -2376,7 +2399,7 @@ describe Mongoid::Contextual::Mongo do
2376
2399
 
2377
2400
  describe '#pipeline' do
2378
2401
 
2379
- context 'when the criteria has a selector', if: non_legacy_server? do
2402
+ context 'when the criteria has a selector' do
2380
2403
 
2381
2404
  before do
2382
2405
  Artist.index(name: "text")
@@ -3,7 +3,7 @@
3
3
 
4
4
  require "spec_helper"
5
5
 
6
- describe Mongoid::Criteria::Queryable::Extensions::Regexp::Raw do
6
+ describe Mongoid::Criteria::Queryable::Extensions::Regexp::Raw_ do
7
7
 
8
8
  describe ".evolve" do
9
9
 
@@ -11,7 +11,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
11
11
  context "when provided a regexp" do
12
12
 
13
13
  let(:regexp) do
14
- /^[123]/
14
+ /\A[123]/
15
15
  end
16
16
 
17
17
  let(:evolved) do
@@ -26,7 +26,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
26
26
  context "when provided a string" do
27
27
 
28
28
  let(:regexp) do
29
- "^[123]"
29
+ "\\A[123]"
30
30
  end
31
31
 
32
32
  let(:evolved) do
@@ -34,7 +34,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
34
34
  end
35
35
 
36
36
  it "returns the converted regexp" do
37
- expect(evolved).to eq(/^[123]/)
37
+ expect(evolved).to eq(/\A[123]/)
38
38
  end
39
39
  end
40
40
 
@@ -43,7 +43,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
43
43
  context "when the elements are regexps" do
44
44
 
45
45
  let(:regexp) do
46
- /^[123]/
46
+ /\A[123]/
47
47
  end
48
48
 
49
49
  let(:array) do
@@ -66,7 +66,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
66
66
  context "when the elements are strings" do
67
67
 
68
68
  let(:regexp) do
69
- "^[123]"
69
+ "\\A[123]"
70
70
  end
71
71
 
72
72
  let(:evolved) do
@@ -74,7 +74,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
74
74
  end
75
75
 
76
76
  it "returns the regexps" do
77
- expect(evolved).to eq([ /^[123]/ ])
77
+ expect(evolved).to eq([ /\A[123]/ ])
78
78
  end
79
79
  end
80
80
  end
@@ -83,7 +83,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
83
83
  describe "#regexp?" do
84
84
 
85
85
  let(:regexp) do
86
- /^[123]/
86
+ /\A[123]/
87
87
  end
88
88
 
89
89
  it "returns true" do
@@ -318,7 +318,7 @@ describe String do
318
318
  context "when provided a regex" do
319
319
 
320
320
  let(:regex) do
321
- /^[123]/
321
+ /\A[123]/.freeze
322
322
  end
323
323
 
324
324
  let(:evolved) do
@@ -354,23 +354,35 @@ describe Time do
354
354
 
355
355
  describe "#__evolve_date__" do
356
356
 
357
- let(:time) do
358
- Time.new(2010, 1, 1, 12, 0, 0)
359
- end
360
-
361
357
  let(:evolved) do
362
358
  time.__evolve_date__
363
359
  end
364
360
 
365
- it "returns midnight utc" do
366
- expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
361
+ context 'beginning of day' do
362
+ let(:time) do
363
+ Time.new(2010, 1, 1, 0, 0, 1).freeze
364
+ end
365
+
366
+ it "returns midnight utc" do
367
+ expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
368
+ end
369
+ end
370
+
371
+ context 'end of day' do
372
+ let(:time) do
373
+ Time.new(2010, 1, 1, 23, 59, 59).freeze
374
+ end
375
+
376
+ it "returns midnight utc" do
377
+ expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
378
+ end
367
379
  end
368
380
  end
369
381
 
370
382
  describe "#__evolve_time__" do
371
383
 
372
384
  let(:time) do
373
- Time.new(2010, 1, 1, 12, 0, 0)
385
+ Time.new(2010, 1, 1, 12, 0, 0).freeze
374
386
  end
375
387
 
376
388
  let(:evolved) do
@@ -325,10 +325,37 @@ describe ActiveSupport::TimeWithZone do
325
325
  end
326
326
  end
327
327
 
328
+ describe "#__evolve_date__" do
329
+
330
+ let(:evolved) do
331
+ time.__evolve_date__
332
+ end
333
+
334
+ context 'beginning of day' do
335
+ let(:time) do
336
+ time_zone.local(2010, 1, 1, 0, 0, 1).freeze
337
+ end
338
+
339
+ it "returns midnight utc" do
340
+ expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
341
+ end
342
+ end
343
+
344
+ context 'end of day' do
345
+ let(:time) do
346
+ time_zone.local(2010, 1, 1, 23, 59, 59).freeze
347
+ end
348
+
349
+ it "returns midnight utc" do
350
+ expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
351
+ end
352
+ end
353
+ end
354
+
328
355
  describe "#__evolve_time__" do
329
356
 
330
357
  let(:date) do
331
- time_zone.local(2010, 1, 1, 12, 0, 0)
358
+ time_zone.local(2010, 1, 1, 12, 0, 0).freeze
332
359
  end
333
360
 
334
361
  let(:evolved) do
@@ -5,11 +5,11 @@ require "spec_helper"
5
5
 
6
6
  describe Mongoid::Criteria::Queryable::Mergeable do
7
7
 
8
- describe "#intersect" do
8
+ let(:query) do
9
+ Mongoid::Query.new
10
+ end
9
11
 
10
- let(:query) do
11
- Mongoid::Query.new
12
- end
12
+ describe "#intersect" do
13
13
 
14
14
  before do
15
15
  query.intersect
@@ -22,10 +22,6 @@ describe Mongoid::Criteria::Queryable::Mergeable do
22
22
 
23
23
  describe "#override" do
24
24
 
25
- let(:query) do
26
- Mongoid::Query.new
27
- end
28
-
29
25
  before do
30
26
  query.override
31
27
  end
@@ -37,10 +33,6 @@ describe Mongoid::Criteria::Queryable::Mergeable do
37
33
 
38
34
  describe "#union" do
39
35
 
40
- let(:query) do
41
- Mongoid::Query.new
42
- end
43
-
44
36
  before do
45
37
  query.union
46
38
  end
@@ -49,4 +41,45 @@ describe Mongoid::Criteria::Queryable::Mergeable do
49
41
  expect(query.strategy).to eq(:__union__)
50
42
  end
51
43
  end
44
+
45
+ describe '#_mongoid_expand_keys' do
46
+ it 'expands simple keys' do
47
+ query.send(:_mongoid_expand_keys, {a: 1}).should == {a: 1}
48
+ end
49
+
50
+ let(:gt) do
51
+ Mongoid::Criteria::Queryable::Key.new("age", :__override__, "$gt")
52
+ end
53
+
54
+ let(:gtp) do
55
+ Mongoid::Criteria::Queryable::Key.new("age", :__override__, "$gt")
56
+ end
57
+
58
+ let(:lt) do
59
+ Mongoid::Criteria::Queryable::Key.new("age", :__override__, "$lt")
60
+ end
61
+
62
+ it 'expands Key instances' do
63
+ query.send(:_mongoid_expand_keys, {gt => 42}).should == {'age' => {'$gt' => 42}}
64
+ end
65
+
66
+ it 'expands multiple Key instances on the same field' do
67
+ query.send(:_mongoid_expand_keys, {gt => 42, lt => 50}).should == {
68
+ 'age' => {'$gt' => 42, '$lt' => 50}}
69
+ end
70
+
71
+ it 'expands simple and Key instances on the same field' do
72
+ query.send(:_mongoid_expand_keys, {'age' => 42, lt => 50}).should == {
73
+ 'age' => {'$eq' => 42, '$lt' => 50}}
74
+ end
75
+
76
+ it 'expands Key and simple instances on the same field' do
77
+ query.send(:_mongoid_expand_keys, {gt => 42, 'age' => 50}).should == {
78
+ 'age' => {'$gt' => 42, '$eq' => 50}}
79
+ end
80
+
81
+ it 'Ruby does not allow same symbol operator with different values' do
82
+ {gt => 42, gtp => 50}.should == {gtp => 50}
83
+ end
84
+ end
52
85
  end