mongoid 6.3.0 → 6.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +12 -0
- data/lib/config/locales/en.yml +21 -0
- data/lib/mongoid.rb +2 -2
- data/lib/mongoid/clients.rb +2 -0
- data/lib/mongoid/clients/sessions.rb +113 -0
- data/lib/mongoid/clients/storage_options.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +7 -3
- data/lib/mongoid/contextual/memory.rb +7 -2
- data/lib/mongoid/contextual/mongo.rb +11 -2
- data/lib/mongoid/criteria.rb +1 -0
- data/lib/mongoid/criteria/modifiable.rb +12 -2
- data/lib/mongoid/criteria/queryable/mergeable.rb +3 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +34 -7
- data/lib/mongoid/document.rb +4 -4
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/invalid_session_use.rb +24 -0
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions/string.rb +3 -1
- data/lib/mongoid/indexable.rb +4 -4
- data/lib/mongoid/matchable.rb +3 -0
- data/lib/mongoid/matchable/nor.rb +37 -0
- data/lib/mongoid/persistable.rb +1 -1
- data/lib/mongoid/persistable/creatable.rb +4 -2
- data/lib/mongoid/persistable/deletable.rb +4 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -5
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +2 -2
- data/lib/mongoid/persistable/upsertable.rb +2 -1
- data/lib/mongoid/persistence_context.rb +4 -0
- data/lib/mongoid/railtie.rb +17 -0
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/relations/embedded/batchable.rb +10 -4
- data/lib/mongoid/relations/embedded/many.rb +23 -0
- data/lib/mongoid/relations/many.rb +4 -0
- data/lib/mongoid/relations/referenced/many.rb +1 -1
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/tasks/database.rb +3 -2
- data/lib/mongoid/threaded.rb +74 -0
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -0
- data/spec/app/models/array_field.rb +7 -0
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/attributes/nested_spec.rb +4 -0
- data/spec/mongoid/clients/factory_spec.rb +52 -28
- data/spec/mongoid/clients/options_spec.rb +30 -15
- data/spec/mongoid/clients/sessions_spec.rb +334 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
- data/spec/mongoid/contextual/mongo_spec.rb +40 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +59 -10
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +74 -6
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +4 -1
- data/spec/mongoid/document_spec.rb +54 -0
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/extensions/string_spec.rb +35 -7
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +1 -1
- data/spec/mongoid/interceptable_spec.rb +1 -1
- data/spec/mongoid/matchable/nor_spec.rb +209 -0
- data/spec/mongoid/matchable_spec.rb +26 -1
- data/spec/mongoid/persistable/deletable_spec.rb +19 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +19 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/settable_spec.rb +35 -1
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/relations/embedded/many_spec.rb +246 -16
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +79 -0
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/spec_config.rb +42 -0
- metadata +471 -443
- metadata.gz.sig +0 -0
@@ -1471,11 +1471,15 @@ describe Mongoid::Criteria::Modifiable do
|
|
1471
1471
|
{ 'username' => 'Turnip' }
|
1472
1472
|
end
|
1473
1473
|
|
1474
|
-
it '
|
1475
|
-
expect(Person.create_with(attrs).selector).to
|
1474
|
+
it 'does not modify the selector' do
|
1475
|
+
expect(Person.create_with(attrs).selector[:username]).to be_nil
|
1476
1476
|
end
|
1477
1477
|
|
1478
|
-
|
1478
|
+
it 'create_attrs is modified' do
|
1479
|
+
expect(Person.create_with(attrs).create_attrs).to eq(attrs)
|
1480
|
+
end
|
1481
|
+
|
1482
|
+
context 'when a create is chained' do
|
1479
1483
|
|
1480
1484
|
context 'when a write method is chained' do
|
1481
1485
|
|
@@ -1499,6 +1503,25 @@ describe Mongoid::Criteria::Modifiable do
|
|
1499
1503
|
expect(new_person.age).to eq(50)
|
1500
1504
|
end
|
1501
1505
|
|
1506
|
+
context 'when a matching document is already in the collection' do
|
1507
|
+
let(:query) do
|
1508
|
+
{ 'username' => 'foo', 'age' => 12 }
|
1509
|
+
end
|
1510
|
+
|
1511
|
+
let(:person) do
|
1512
|
+
Person.create!(query)
|
1513
|
+
end
|
1514
|
+
|
1515
|
+
let(:found_person) do
|
1516
|
+
Person.create_with(attrs).find_or_create_by(query)
|
1517
|
+
end
|
1518
|
+
|
1519
|
+
it 'finds the matching document' do
|
1520
|
+
person
|
1521
|
+
expect(found_person.id).to eq(person.id)
|
1522
|
+
end
|
1523
|
+
end
|
1524
|
+
|
1502
1525
|
context 'when the attributes are shared with the write method args' do
|
1503
1526
|
|
1504
1527
|
let(:query) do
|
@@ -1509,7 +1532,7 @@ describe Mongoid::Criteria::Modifiable do
|
|
1509
1532
|
Person.create_with(attrs).find_or_create_by(query)
|
1510
1533
|
end
|
1511
1534
|
|
1512
|
-
it 'gives the
|
1535
|
+
it 'gives the find method args precedence' do
|
1513
1536
|
expect(new_person.username).to eq('Beet')
|
1514
1537
|
expect(new_person.age).to eq(50)
|
1515
1538
|
end
|
@@ -1536,8 +1559,12 @@ describe Mongoid::Criteria::Modifiable do
|
|
1536
1559
|
{ 'username' => 'Beet', 'age' => 50 }
|
1537
1560
|
end
|
1538
1561
|
|
1562
|
+
it 'does not modify the selector' do
|
1563
|
+
expect(criteria.create_with(attrs).selector).to eq(criteria_selector)
|
1564
|
+
end
|
1565
|
+
|
1539
1566
|
it 'overwrites all the original attributes' do
|
1540
|
-
expect(criteria.create_with(attrs).
|
1567
|
+
expect(criteria.create_with(attrs).create_attrs).to eq(attrs)
|
1541
1568
|
end
|
1542
1569
|
end
|
1543
1570
|
end
|
@@ -1548,8 +1575,12 @@ describe Mongoid::Criteria::Modifiable do
|
|
1548
1575
|
{ 'username' => 'Beet' }
|
1549
1576
|
end
|
1550
1577
|
|
1578
|
+
it 'does not modify the selector' do
|
1579
|
+
expect(criteria.create_with(attrs).selector).to eq(criteria_selector)
|
1580
|
+
end
|
1581
|
+
|
1551
1582
|
it 'only overwrites the shared attributes' do
|
1552
|
-
expect(criteria.create_with(attrs).
|
1583
|
+
expect(criteria.create_with(attrs).create_attrs).to eq(attrs)
|
1553
1584
|
end
|
1554
1585
|
end
|
1555
1586
|
|
@@ -1558,12 +1589,11 @@ describe Mongoid::Criteria::Modifiable do
|
|
1558
1589
|
let(:attrs) do
|
1559
1590
|
{ 'username' => 'Turnip' }
|
1560
1591
|
end
|
1561
|
-
|
1562
1592
|
let(:query) do
|
1563
1593
|
{ 'username' => 'Beet', 'age' => 50 }
|
1564
1594
|
end
|
1565
1595
|
|
1566
|
-
context 'when a
|
1596
|
+
context 'when a create method is chained' do
|
1567
1597
|
|
1568
1598
|
it 'executes the method' do
|
1569
1599
|
expect(criteria.create_with(attrs).new.username).to eq('Turnip')
|
@@ -1577,9 +1607,28 @@ describe Mongoid::Criteria::Modifiable do
|
|
1577
1607
|
criteria.create_with(attrs).find_or_create_by(query)
|
1578
1608
|
end
|
1579
1609
|
|
1580
|
-
it '
|
1610
|
+
it 'gives the find method arg precedence' do
|
1581
1611
|
expect(new_person.username).to eq('Beet')
|
1582
|
-
expect(new_person.age).to
|
1612
|
+
expect(new_person.age).to be(50)
|
1613
|
+
end
|
1614
|
+
|
1615
|
+
context 'when a matching document is already in the collection' do
|
1616
|
+
let(:query) do
|
1617
|
+
{ 'username' => 'foo', 'age' => 12 }
|
1618
|
+
end
|
1619
|
+
|
1620
|
+
let(:person) do
|
1621
|
+
Person.create!(query)
|
1622
|
+
end
|
1623
|
+
|
1624
|
+
let(:found_person) do
|
1625
|
+
criteria.create_with(attrs).find_or_create_by(query)
|
1626
|
+
end
|
1627
|
+
|
1628
|
+
it 'finds the matching document' do
|
1629
|
+
person
|
1630
|
+
expect(found_person.id).to eq(person.id)
|
1631
|
+
end
|
1583
1632
|
end
|
1584
1633
|
end
|
1585
1634
|
end
|
@@ -7,7 +7,7 @@ describe BigDecimal do
|
|
7
7
|
context "when provided a big decimal" do
|
8
8
|
|
9
9
|
let(:big_decimal) do
|
10
|
-
BigDecimal
|
10
|
+
BigDecimal("123456.789")
|
11
11
|
end
|
12
12
|
|
13
13
|
it "returns the decimal as a string" do
|
@@ -25,11 +25,11 @@ describe BigDecimal do
|
|
25
25
|
context "when provided an array of big decimals" do
|
26
26
|
|
27
27
|
let(:bd_one) do
|
28
|
-
BigDecimal
|
28
|
+
BigDecimal("123456.789")
|
29
29
|
end
|
30
30
|
|
31
31
|
let(:bd_two) do
|
32
|
-
BigDecimal
|
32
|
+
BigDecimal("123333.789")
|
33
33
|
end
|
34
34
|
|
35
35
|
let(:array) do
|
@@ -1073,6 +1073,26 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
1073
1073
|
})
|
1074
1074
|
end
|
1075
1075
|
|
1076
|
+
context "when used with the $box operator ($geoWithin query) " do
|
1077
|
+
let(:selection) do
|
1078
|
+
query.geo_spacial(
|
1079
|
+
:location.within_box => [[ 1, 10 ], [ 2, 10 ]]
|
1080
|
+
)
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
it "adds the $geoIntersects expression" do
|
1084
|
+
expect(selection.selector).to eq({
|
1085
|
+
"location" => {
|
1086
|
+
"$geoWithin" => {
|
1087
|
+
"$box" => [
|
1088
|
+
[ 1, 10 ], [ 2, 10 ]
|
1089
|
+
]
|
1090
|
+
}
|
1091
|
+
}
|
1092
|
+
})
|
1093
|
+
end
|
1094
|
+
end
|
1095
|
+
|
1076
1096
|
it_behaves_like "a cloning selection"
|
1077
1097
|
end
|
1078
1098
|
end
|
@@ -1449,7 +1469,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
1449
1469
|
|
1450
1470
|
context "when the criterion are on the same field" do
|
1451
1471
|
|
1452
|
-
context "when the
|
1472
|
+
context "when the strategy is the default (intersection)" do
|
1453
1473
|
|
1454
1474
|
let(:selection) do
|
1455
1475
|
query.in(first: [ 1, 2 ].freeze).in(first: [ 2, 3 ])
|
@@ -1466,6 +1486,35 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
1466
1486
|
end
|
1467
1487
|
end
|
1468
1488
|
|
1489
|
+
context 'when the field is aliased' do
|
1490
|
+
|
1491
|
+
before(:all) do
|
1492
|
+
class TestModel
|
1493
|
+
include Mongoid::Document
|
1494
|
+
end
|
1495
|
+
end
|
1496
|
+
|
1497
|
+
after(:all) do
|
1498
|
+
Object.send(:remove_const, :TestModel)
|
1499
|
+
end
|
1500
|
+
|
1501
|
+
let(:bson_object_id) do
|
1502
|
+
BSON::ObjectId.new
|
1503
|
+
end
|
1504
|
+
|
1505
|
+
let(:selection) do
|
1506
|
+
TestModel.in(id: [bson_object_id.to_s]).in(id: [bson_object_id.to_s])
|
1507
|
+
end
|
1508
|
+
|
1509
|
+
it "intersects the $in selectors" do
|
1510
|
+
expect(selection.selector).to eq("_id" => { "$in" => [ bson_object_id ] })
|
1511
|
+
end
|
1512
|
+
|
1513
|
+
it "returns a cloned query" do
|
1514
|
+
expect(selection).to_not equal(query)
|
1515
|
+
end
|
1516
|
+
end
|
1517
|
+
|
1469
1518
|
context "when the stretegy is intersect" do
|
1470
1519
|
|
1471
1520
|
let(:selection) do
|
@@ -1483,7 +1532,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
1483
1532
|
end
|
1484
1533
|
end
|
1485
1534
|
|
1486
|
-
context "when the
|
1535
|
+
context "when the strategy is override" do
|
1487
1536
|
|
1488
1537
|
let(:selection) do
|
1489
1538
|
query.in(first: [ 1, 2 ]).override.in(first: [ 3, 4 ])
|
@@ -1500,7 +1549,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
1500
1549
|
end
|
1501
1550
|
end
|
1502
1551
|
|
1503
|
-
context "when the
|
1552
|
+
context "when the strategy is union" do
|
1504
1553
|
|
1505
1554
|
let(:selection) do
|
1506
1555
|
query.in(first: [ 1, 2 ]).union.in(first: [ 3, 4 ])
|
@@ -3340,7 +3389,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
3340
3389
|
end
|
3341
3390
|
|
3342
3391
|
it "constructs a text search document" do
|
3343
|
-
expect(selection.selector).to eq({
|
3392
|
+
expect(selection.selector).to eq({ '$text' => { '$search' => "testing" }})
|
3344
3393
|
end
|
3345
3394
|
|
3346
3395
|
it "returns the cloned selectable" do
|
@@ -3354,16 +3403,35 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
3354
3403
|
end
|
3355
3404
|
|
3356
3405
|
it "constructs a text search document" do
|
3357
|
-
expect(selection.selector[
|
3406
|
+
expect(selection.selector['$text']['$search']).to eq("essais")
|
3358
3407
|
end
|
3359
3408
|
|
3360
3409
|
it "add the options to the text search document" do
|
3361
|
-
expect(selection.selector[
|
3410
|
+
expect(selection.selector['$text'][:$language]).to eq("fr")
|
3362
3411
|
end
|
3363
3412
|
|
3364
3413
|
it_behaves_like "a cloning selection"
|
3365
3414
|
end
|
3366
3415
|
end
|
3416
|
+
|
3417
|
+
context 'when given more than once' do
|
3418
|
+
let(:selection) do
|
3419
|
+
query.text_search("one").text_search('two')
|
3420
|
+
end
|
3421
|
+
|
3422
|
+
# MongoDB server can only handle one text expression at a time,
|
3423
|
+
# per https://docs.mongodb.com/manual/reference/operator/query/text/.
|
3424
|
+
# Nonetheless we test that the query is built correctly when
|
3425
|
+
# a user supplies more than one text condition.
|
3426
|
+
it 'merges conditions' do
|
3427
|
+
expect(Mongoid.logger).to receive(:warn)
|
3428
|
+
expect(selection.selector).to eq('$and' => [
|
3429
|
+
{'$text' => {'$search' => 'one'}}
|
3430
|
+
],
|
3431
|
+
'$text' => {'$search' => 'two'},
|
3432
|
+
)
|
3433
|
+
end
|
3434
|
+
end
|
3367
3435
|
end
|
3368
3436
|
|
3369
3437
|
describe "#where" do
|
@@ -370,11 +370,11 @@ describe Mongoid::Criteria::Queryable::Selector do
|
|
370
370
|
context "when providing an array" do
|
371
371
|
|
372
372
|
let(:big_one) do
|
373
|
-
BigDecimal
|
373
|
+
BigDecimal("1.2321")
|
374
374
|
end
|
375
375
|
|
376
376
|
let(:big_two) do
|
377
|
-
BigDecimal
|
377
|
+
BigDecimal("4.2222")
|
378
378
|
end
|
379
379
|
|
380
380
|
let(:array) do
|
@@ -388,4 +388,85 @@ describe Mongoid::Criteria::Scopable do
|
|
388
388
|
end
|
389
389
|
end
|
390
390
|
end
|
391
|
+
|
392
|
+
describe 'scope and where' do
|
393
|
+
class ScopeWhereModel
|
394
|
+
include Mongoid::Document
|
395
|
+
|
396
|
+
scope :foo, -> { where(foo: true) }
|
397
|
+
end
|
398
|
+
|
399
|
+
shared_examples_for 'restricts to both' do
|
400
|
+
it 'restricts to both' do
|
401
|
+
expect(result.selector['foo']).to eq(true)
|
402
|
+
expect(result.selector['hello']).to eq('world')
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
406
|
+
context 'scope is given first' do
|
407
|
+
let(:result) { ScopeWhereModel.foo.where(hello: 'world') }
|
408
|
+
|
409
|
+
it_behaves_like 'restricts to both'
|
410
|
+
end
|
411
|
+
|
412
|
+
context 'where is given first' do
|
413
|
+
let(:result) { ScopeWhereModel.where(hello: 'world').foo }
|
414
|
+
|
415
|
+
it_behaves_like 'restricts to both'
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
describe 'scope with argument and where' do
|
420
|
+
class ArgumentScopeWhereModel
|
421
|
+
include Mongoid::Document
|
422
|
+
|
423
|
+
scope :my_text_search, ->(search) { where('$text' => {'$search' => search}) }
|
424
|
+
end
|
425
|
+
|
426
|
+
shared_examples_for 'restricts to both' do
|
427
|
+
it 'restricts to both' do
|
428
|
+
expect(result.selector['$text']).to eq({'$search' => 'bar'})
|
429
|
+
expect(result.selector['hello']).to eq('world')
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
context 'scope is given first' do
|
434
|
+
let(:result) { ArgumentScopeWhereModel.my_text_search('bar').where(hello: 'world') }
|
435
|
+
|
436
|
+
it_behaves_like 'restricts to both'
|
437
|
+
end
|
438
|
+
|
439
|
+
context 'where is given first' do
|
440
|
+
let(:result) { ArgumentScopeWhereModel.where(hello: 'world').my_text_search('bar') }
|
441
|
+
|
442
|
+
it_behaves_like 'restricts to both'
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
describe 'built in text search scope and where' do
|
447
|
+
class TextSearchScopeWhereModel
|
448
|
+
include Mongoid::Document
|
449
|
+
|
450
|
+
# using the default text_search scope
|
451
|
+
end
|
452
|
+
|
453
|
+
shared_examples_for 'restricts to both' do
|
454
|
+
it 'restricts to both' do
|
455
|
+
expect(result.selector['$text']).to eq({'$search' => 'bar'})
|
456
|
+
expect(result.selector['hello']).to eq('world')
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
context 'scope is given first' do
|
461
|
+
let(:result) { TextSearchScopeWhereModel.text_search('bar').where(hello: 'world') }
|
462
|
+
|
463
|
+
it_behaves_like 'restricts to both'
|
464
|
+
end
|
465
|
+
|
466
|
+
context 'where is given first' do
|
467
|
+
let(:result) { TextSearchScopeWhereModel.where(hello: 'world').text_search('bar') }
|
468
|
+
|
469
|
+
it_behaves_like 'restricts to both'
|
470
|
+
end
|
471
|
+
end
|
391
472
|
end
|
@@ -975,6 +975,7 @@ describe Mongoid::Criteria do
|
|
975
975
|
end
|
976
976
|
|
977
977
|
describe "#geo_near" do
|
978
|
+
max_server_version '4.0'
|
978
979
|
|
979
980
|
before do
|
980
981
|
Bar.create_indexes
|
@@ -3321,6 +3322,8 @@ describe Mongoid::Criteria do
|
|
3321
3322
|
end
|
3322
3323
|
|
3323
3324
|
describe "#max_scan" do
|
3325
|
+
max_server_version '4.0'
|
3326
|
+
|
3324
3327
|
let!(:band) do
|
3325
3328
|
Band.create(name: "Depeche Mode")
|
3326
3329
|
end
|
@@ -3465,7 +3468,7 @@ describe Mongoid::Criteria do
|
|
3465
3468
|
context "when querying on a big decimal" do
|
3466
3469
|
|
3467
3470
|
let(:sales) do
|
3468
|
-
BigDecimal
|
3471
|
+
BigDecimal('0.1')
|
3469
3472
|
end
|
3470
3473
|
|
3471
3474
|
let!(:band) do
|
@@ -433,6 +433,60 @@ describe Mongoid::Document do
|
|
433
433
|
end
|
434
434
|
end
|
435
435
|
end
|
436
|
+
|
437
|
+
context ':compact option' do
|
438
|
+
|
439
|
+
before do
|
440
|
+
# These tests require a specific set of defined attributes
|
441
|
+
# on the model
|
442
|
+
expect(church.as_json.keys.sort).to eq(%w(_id location name))
|
443
|
+
end
|
444
|
+
|
445
|
+
context 'there is a nil valued attribute' do
|
446
|
+
let(:church) do
|
447
|
+
Church.create!(name: 'St. Basil')
|
448
|
+
end
|
449
|
+
|
450
|
+
it 'returns non-nil fields and _id only' do
|
451
|
+
actual = church.as_json(compact: true)
|
452
|
+
expect(actual).to eq('_id' => church.id, 'name' => 'St. Basil')
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
context 'all attrbutes are nil valued' do
|
457
|
+
let(:church) do
|
458
|
+
Church.create!
|
459
|
+
end
|
460
|
+
|
461
|
+
it 'returns a hash with _id only' do
|
462
|
+
actual = church.as_json(compact: true)
|
463
|
+
expect(actual).to eq('_id' => church.id)
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
context 'there are no nil valued attributes' do
|
468
|
+
let(:church) do
|
469
|
+
Church.create!(name: 'St. Basil', location: {})
|
470
|
+
end
|
471
|
+
|
472
|
+
it 'returns all fields and _id' do
|
473
|
+
actual = church.as_json(compact: true)
|
474
|
+
expect(actual).to eq('_id' => church.id, 'name' => 'St. Basil',
|
475
|
+
'location' => {})
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
context 'when option is specified as a truthy value' do
|
480
|
+
let(:church) do
|
481
|
+
Church.create!(name: 'St. Basil')
|
482
|
+
end
|
483
|
+
|
484
|
+
it 'returns non-nil fields and _id only' do
|
485
|
+
actual = church.as_json(compact: 1)
|
486
|
+
expect(actual).to eq('_id' => church.id, 'name' => 'St. Basil')
|
487
|
+
end
|
488
|
+
end
|
489
|
+
end
|
436
490
|
end
|
437
491
|
|
438
492
|
describe "#as_document" do
|