mongoid 7.0.0.beta → 7.0.0

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 (86) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +21 -0
  5. data/lib/mongoid.rb +1 -1
  6. data/lib/mongoid/association/embedded/batchable.rb +39 -13
  7. data/lib/mongoid/association/many.rb +4 -0
  8. data/lib/mongoid/association/referenced/has_many.rb +2 -0
  9. data/lib/mongoid/association/referenced/has_many/enumerable.rb +38 -7
  10. data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -2
  11. data/lib/mongoid/association/referenced/syncable.rb +1 -1
  12. data/lib/mongoid/association/touchable.rb +1 -1
  13. data/lib/mongoid/atomic.rb +3 -3
  14. data/lib/mongoid/atomic/modifiers.rb +12 -8
  15. data/lib/mongoid/attributes.rb +20 -12
  16. data/lib/mongoid/attributes/dynamic.rb +2 -2
  17. data/lib/mongoid/changeable.rb +1 -1
  18. data/lib/mongoid/clients.rb +2 -0
  19. data/lib/mongoid/clients/sessions.rb +113 -0
  20. data/lib/mongoid/clients/storage_options.rb +1 -0
  21. data/lib/mongoid/composable.rb +1 -0
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  23. data/lib/mongoid/contextual/atomic.rb +6 -3
  24. data/lib/mongoid/contextual/geo_near.rb +1 -1
  25. data/lib/mongoid/contextual/map_reduce.rb +6 -2
  26. data/lib/mongoid/contextual/memory.rb +25 -2
  27. data/lib/mongoid/contextual/mongo.rb +33 -14
  28. data/lib/mongoid/copyable.rb +2 -2
  29. data/lib/mongoid/criteria.rb +1 -0
  30. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  31. data/lib/mongoid/criteria/queryable/mergeable.rb +3 -1
  32. data/lib/mongoid/errors.rb +1 -0
  33. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  34. data/lib/mongoid/extensions.rb +0 -4
  35. data/lib/mongoid/extensions/hash.rb +5 -2
  36. data/lib/mongoid/factory.rb +14 -5
  37. data/lib/mongoid/fields.rb +2 -2
  38. data/lib/mongoid/indexable.rb +4 -4
  39. data/lib/mongoid/matchable/and.rb +1 -1
  40. data/lib/mongoid/matchable/elem_match.rb +9 -3
  41. data/lib/mongoid/persistable.rb +2 -2
  42. data/lib/mongoid/persistable/creatable.rb +4 -2
  43. data/lib/mongoid/persistable/deletable.rb +4 -2
  44. data/lib/mongoid/persistable/destroyable.rb +1 -5
  45. data/lib/mongoid/persistable/updatable.rb +2 -2
  46. data/lib/mongoid/persistable/upsertable.rb +2 -1
  47. data/lib/mongoid/persistence_context.rb +5 -4
  48. data/lib/mongoid/query_cache.rb +5 -3
  49. data/lib/mongoid/reloadable.rb +1 -1
  50. data/lib/mongoid/serializable.rb +1 -1
  51. data/lib/mongoid/shardable.rb +1 -1
  52. data/lib/mongoid/tasks/database.rb +3 -2
  53. data/lib/mongoid/threaded.rb +38 -0
  54. data/lib/mongoid/traversable.rb +1 -1
  55. data/lib/mongoid/version.rb +1 -1
  56. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -0
  57. data/spec/app/models/band.rb +1 -0
  58. data/spec/app/models/shipment_address.rb +1 -0
  59. data/spec/mongoid/association/macros_spec.rb +20 -0
  60. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +15 -0
  61. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +229 -0
  62. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  63. data/spec/mongoid/atomic_spec.rb +17 -17
  64. data/spec/mongoid/attributes_spec.rb +38 -2
  65. data/spec/mongoid/clients/sessions_spec.rb +325 -0
  66. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  67. data/spec/mongoid/contextual/mongo_spec.rb +133 -0
  68. data/spec/mongoid/copyable_spec.rb +34 -0
  69. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  70. data/spec/mongoid/criteria/queryable/selectable_spec.rb +32 -3
  71. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  72. data/spec/mongoid/factory_spec.rb +11 -0
  73. data/spec/mongoid/interceptable_spec.rb +3 -1
  74. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  75. data/spec/mongoid/persistable/deletable_spec.rb +19 -0
  76. data/spec/mongoid/persistable/destroyable_spec.rb +19 -0
  77. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  78. data/spec/mongoid/persistable/updatable_spec.rb +2 -2
  79. data/spec/mongoid/persistable_spec.rb +31 -16
  80. data/spec/mongoid/persistence_context_spec.rb +14 -0
  81. data/spec/mongoid/positional_spec.rb +10 -10
  82. data/spec/mongoid/query_cache_spec.rb +2 -16
  83. data/spec/mongoid/shardable_spec.rb +32 -12
  84. data/spec/spec_helper.rb +74 -0
  85. metadata +456 -446
  86. metadata.gz.sig +0 -0
@@ -42,7 +42,7 @@ describe Mongoid::Attributes do
42
42
  context "accessing via []" do
43
43
 
44
44
  it "does not raise an error" do
45
- expect(from_db["desc"]).to eq("en" => "test")
45
+ expect(from_db["desc"]).to eq("test")
46
46
  end
47
47
  end
48
48
 
@@ -150,6 +150,17 @@ describe Mongoid::Attributes do
150
150
 
151
151
  describe "#[]" do
152
152
 
153
+ context 'when the document has a custom attribute type' do
154
+
155
+ let(:bar) do
156
+ Bar.create(lat_lng: LatLng.new(52.30, 13.25))
157
+ end
158
+
159
+ it 'returns the demongoized version of the attribute' do
160
+ expect(bar.reload[:lat_lng]).to be_a(LatLng)
161
+ end
162
+ end
163
+
153
164
  context "when the document is a new record" do
154
165
 
155
166
  let(:person) do
@@ -165,7 +176,7 @@ describe Mongoid::Attributes do
165
176
  context "when passing just the name" do
166
177
 
167
178
  it "returns the full value" do
168
- expect(person[:desc]).to eq("en" => "testing")
179
+ expect(person[:desc]).to eq("testing")
169
180
  end
170
181
  end
171
182
 
@@ -268,6 +279,20 @@ describe Mongoid::Attributes do
268
279
 
269
280
  describe "#[]=" do
270
281
 
282
+ context 'when the document has a custom attribute type' do
283
+
284
+ let(:bar) do
285
+ Bar.new.tap do |b|
286
+ b[:lat_lng] = LatLng.new(52.30, 13.25)
287
+ b.save
288
+ end
289
+ end
290
+
291
+ it 'sets the demongoized version of the attribute' do
292
+ expect(bar.reload.lat_lng).to be_a(LatLng)
293
+ end
294
+ end
295
+
271
296
  let(:person) do
272
297
  Person.new
273
298
  end
@@ -768,6 +793,17 @@ describe Mongoid::Attributes do
768
793
 
769
794
  describe "#read_attribute" do
770
795
 
796
+ context 'when the document has a custom attribute type' do
797
+
798
+ let(:bar) do
799
+ Bar.create(lat_lng: LatLng.new(52.30, 13.25))
800
+ end
801
+
802
+ it 'returns the demongoized version of the attribute' do
803
+ expect(bar.reload.read_attribute(:lat_lng)).to be_a(LatLng)
804
+ end
805
+ end
806
+
771
807
  context "when the document is a new record" do
772
808
 
773
809
  let(:person) do
@@ -0,0 +1,325 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Clients::Sessions do
4
+
5
+ before(:all) do
6
+ CONFIG[:clients][:other] = CONFIG[:clients][:default].dup
7
+ CONFIG[:clients][:other][:database] = 'other'
8
+ Mongoid::Clients.clients.values.each(&:close)
9
+ Mongoid::Config.send(:clients=, CONFIG[:clients])
10
+ Mongoid::Clients.with_name(:other).subscribe(Mongo::Monitoring::COMMAND, EventSubscriber.new)
11
+ end
12
+
13
+ after(:all) do
14
+ Mongoid::Clients.with_name(:other).close
15
+ Mongoid::Clients.clients.delete(:other)
16
+ end
17
+
18
+ let(:subscriber) do
19
+ Mongoid::Clients.with_name(:other).instance_variable_get(:@monitoring).subscribers['Command'].find do |s|
20
+ s.is_a?(EventSubscriber)
21
+ end
22
+ end
23
+
24
+ let(:insert_events) do
25
+ subscriber.started_events.select { |event| event.command_name == :insert }
26
+ end
27
+
28
+ let(:update_events) do
29
+ subscriber.started_events.select { |event| event.command_name == :update }
30
+ end
31
+
32
+ context 'when a session is used on a model class' do
33
+
34
+ context 'when sessions are supported', if: sessions_supported? do
35
+
36
+ around do |example|
37
+ Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
38
+ subscriber.clear_events!
39
+ Person.with(client: :other) do
40
+ example.run
41
+ end
42
+ Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
43
+ end
44
+
45
+ context 'when another thread is started' do
46
+
47
+ let!(:last_use_diff) do
48
+ Person.with_session do |session|
49
+ Person.create
50
+ Person.create
51
+ last_use = session.instance_variable_get(:@server_session).last_use
52
+ Thread.new { Person.create }.value
53
+ session.instance_variable_get(:@server_session).last_use - last_use
54
+ end
55
+ end
56
+
57
+ it 'does not use the session for that thread' do
58
+ expect(Person.count).to be(2)
59
+ expect(Person.with(client: :default) { Person.count }).to be(1)
60
+ lsids_sent = insert_events.collect { |event| event.command['lsid'] }
61
+ expect(lsids_sent.size).to eq(2)
62
+ expect(lsids_sent.uniq.size).to eq(1)
63
+ expect(last_use_diff).to eq(0)
64
+ end
65
+ end
66
+
67
+ context 'when the operations in the session block are all on the class' do
68
+
69
+ before do
70
+ Person.with_session do
71
+ Person.create
72
+ Person.create
73
+ end
74
+ end
75
+
76
+ it 'uses a single session id for all operations on the class' do
77
+ expect(Person.count).to be(2)
78
+ lsids_sent = insert_events.collect { |event| event.command['lsid'] }
79
+ expect(lsids_sent.size).to eq(2)
80
+ expect(lsids_sent.uniq.size).to eq(1)
81
+ end
82
+ end
83
+
84
+ context 'when the operations in the session block are also on another class' do
85
+
86
+ context 'when the other class uses the same client' do
87
+
88
+ before do
89
+ Post.with(client: :other) do
90
+ Person.with_session do
91
+ Person.create
92
+ Person.create
93
+ Post.create
94
+ end
95
+ end
96
+ end
97
+
98
+ it 'uses a single session id for all operations on the class' do
99
+ expect(Post.with(client: :other) { |klass| klass.count }).to be(1)
100
+ lsids_sent = insert_events.collect { |event| event.command['lsid'] }
101
+ expect(lsids_sent.size).to eq(3)
102
+ expect(lsids_sent.uniq.size).to eq(1)
103
+ end
104
+ end
105
+
106
+ context 'when the other class uses a different client' do
107
+
108
+ let!(:error) do
109
+ e = nil
110
+ begin
111
+ Person.with_session do
112
+ Person.create
113
+ Person.create
114
+ Post.create
115
+ end
116
+ rescue => ex
117
+ e = ex
118
+ end
119
+ e
120
+ end
121
+
122
+ it 'raises an error' do
123
+ expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
124
+ end
125
+
126
+ it 'uses a single session id for all operations on the class' do
127
+ expect(Person.count).to be(2)
128
+ lsids_sent = insert_events.collect { |event| event.command['lsid'] }
129
+ expect(lsids_sent.size).to eq(2)
130
+ expect(lsids_sent.uniq.size).to eq(1)
131
+ end
132
+ end
133
+
134
+ context 'when sessions are nested' do
135
+
136
+ let!(:error) do
137
+ e = nil
138
+ begin
139
+ Person.with_session do
140
+ Person.with_session do
141
+ Person.create
142
+ Post.create
143
+ end
144
+ end
145
+ rescue => ex
146
+ e = ex
147
+ end
148
+ e
149
+ end
150
+
151
+ it 'raises an error' do
152
+ expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
153
+ end
154
+
155
+ it 'does not execute any operations' do
156
+ expect(Person.count).to be(0)
157
+ expect(insert_events).to be_empty
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ context 'when sessions are not supported', unless: sessions_supported? do
164
+
165
+ let!(:error) do
166
+ e = nil
167
+ begin
168
+ Person.with_session {}
169
+ rescue => ex
170
+ e = ex
171
+ end
172
+ e
173
+ end
174
+
175
+ it 'raises a sessions not supported error' do
176
+ expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
177
+ expect(error.message).to include('not supported')
178
+ end
179
+ end
180
+ end
181
+
182
+ context 'when a session is used on a model instance' do
183
+
184
+ let!(:person) do
185
+ Person.with(client: :other) do |klass|
186
+ klass.create
187
+ end
188
+ end
189
+
190
+ context 'when sessions are supported', if: sessions_supported? do
191
+
192
+ around do |example|
193
+ Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
194
+ subscriber.clear_events!
195
+ person.with(client: :other) do
196
+ example.run
197
+ end
198
+ Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
199
+ end
200
+
201
+ context 'when the operations in the session block are all on the instance' do
202
+
203
+ before do
204
+ person.with_session do
205
+ person.username = 'Emily'
206
+ person.save
207
+ person.age = 80
208
+ person.save
209
+ end
210
+ end
211
+
212
+ it 'uses a single session id for all operations on the class' do
213
+ expect(person.reload.username).to eq('Emily')
214
+ expect(person.reload.age).to eq(80)
215
+ lsids_sent = update_events.collect { |event| event.command['lsid'] }
216
+ expect(lsids_sent.size).to eq(2)
217
+ expect(lsids_sent.uniq.size).to eq(1)
218
+ end
219
+ end
220
+
221
+ context 'when the operations in the session block are also on another class' do
222
+
223
+ context 'when the other class uses the same client' do
224
+
225
+ before do
226
+ Post.with(client: :other) do
227
+ person.with_session do
228
+ person.username = 'Emily'
229
+ person.save
230
+ person.posts << Post.create
231
+ end
232
+ end
233
+ end
234
+
235
+ it 'uses a single session id for all operations on the class' do
236
+ expect(person.reload.username).to eq('Emily')
237
+ expect(Post.with(client: :other) { Post.count }).to be(1)
238
+ update_lsids_sent = update_events.collect { |event| event.command['lsid'] }
239
+ expect(update_lsids_sent.size).to eq(3) # person update, counter cache, post assignment
240
+ expect(update_lsids_sent.uniq.size).to eq(1) # person update, counter cache, post assignment
241
+ insert_lsids_sent = insert_events.collect { |event| event.command['lsid'] }
242
+ expect(insert_lsids_sent.size).to eq(2)
243
+ expect(insert_lsids_sent.uniq.size).to eq(1)
244
+ expect(update_lsids_sent.uniq).to eq(insert_lsids_sent.uniq)
245
+ end
246
+ end
247
+
248
+ context 'when the other class uses a different client' do
249
+
250
+ let!(:error) do
251
+ e = nil
252
+ begin
253
+ person.with_session do
254
+ person.username = 'Emily'
255
+ person.save
256
+ person.posts << Post.create
257
+ end
258
+ rescue => ex
259
+ e = ex
260
+ end
261
+ e
262
+ end
263
+
264
+ it 'raises an error' do
265
+ expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
266
+ end
267
+
268
+ it 'uses a single session id for all operations on the class' do
269
+ expect(person.reload.username).to eq('Emily')
270
+ expect(Post.count).to be(0)
271
+ update_lsids_sent = update_events.collect { |event| event.command['lsid'] }
272
+ expect(update_lsids_sent.size).to eq(1)
273
+ end
274
+ end
275
+
276
+ context 'when sessions are nested' do
277
+
278
+ let!(:error) do
279
+ e = nil
280
+ begin
281
+ person.with_session do
282
+ person.with_session do
283
+ person.username = 'Emily'
284
+ person.save
285
+ person.posts << Post.create
286
+ end
287
+ end
288
+ rescue => ex
289
+ e = ex
290
+ end
291
+ e
292
+ end
293
+
294
+ it 'raises an error' do
295
+ expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
296
+ end
297
+
298
+ it 'does not execute any operations' do
299
+ expect(person.reload.username).not_to eq('Emily')
300
+ expect(Post.count).to be(0)
301
+ expect(update_events).to be_empty
302
+ end
303
+ end
304
+ end
305
+ end
306
+
307
+ context 'when sessions are not supported', unless: sessions_supported? do
308
+
309
+ let!(:error) do
310
+ e = nil
311
+ begin
312
+ person.with_session {}
313
+ rescue => ex
314
+ e = ex
315
+ end
316
+ e
317
+ end
318
+
319
+ it 'raises a sessions not supported error' do
320
+ expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
321
+ expect(error.message).to include('not supported')
322
+ end
323
+ end
324
+ end
325
+ end
@@ -987,6 +987,25 @@ describe Mongoid::Contextual::Memory do
987
987
  end
988
988
  end
989
989
 
990
+ describe '#inc' do
991
+
992
+ let(:criteria) do
993
+ Address.all.tap do |crit|
994
+ crit.documents = [ Address.new(number: 1),
995
+ Address.new(number: 2),
996
+ Address.new(number: 3) ]
997
+ end
998
+ end
999
+
1000
+ let(:context) do
1001
+ described_class.new(criteria)
1002
+ end
1003
+
1004
+ it 'increases each member' do
1005
+ expect(context.inc(number: 10).collect(&:number)).to eql([11, 12, 13])
1006
+ end
1007
+ end
1008
+
990
1009
  describe "#skip" do
991
1010
 
992
1011
  let(:hobrecht) do
@@ -275,6 +275,23 @@ describe Mongoid::Contextual::Mongo do
275
275
  expect(Band.count).to eq(0)
276
276
  end
277
277
  end
278
+
279
+ context 'when the write concern is unacknowledged' do
280
+
281
+ let(:criteria) do
282
+ Band.all
283
+ end
284
+
285
+ let!(:deleted) do
286
+ criteria.with(write: { w: 0 }) do |crit|
287
+ crit.send(method)
288
+ end
289
+ end
290
+
291
+ it 'returns 0' do
292
+ expect(deleted).to eq(0)
293
+ end
294
+ end
278
295
  end
279
296
  end
280
297
 
@@ -363,6 +380,27 @@ describe Mongoid::Contextual::Mongo do
363
380
  end
364
381
  end
365
382
  end
383
+
384
+ context 'when the write concern is unacknowledged' do
385
+
386
+ before do
387
+ 2.times { Band.create }
388
+ end
389
+
390
+ let(:criteria) do
391
+ Band.all
392
+ end
393
+
394
+ let!(:deleted) do
395
+ criteria.with(write: { w: 0 }) do |crit|
396
+ crit.send(method)
397
+ end
398
+ end
399
+
400
+ it 'returns 0' do
401
+ expect(deleted).to eq(0)
402
+ end
403
+ end
366
404
  end
367
405
 
368
406
  describe "#distinct" do
@@ -539,6 +577,31 @@ describe Mongoid::Contextual::Mongo do
539
577
  end
540
578
  end
541
579
  end
580
+
581
+ context 'when the criteria has a parent document' do
582
+
583
+ before do
584
+ Post.create(person: person)
585
+ Post.create(person: person)
586
+ Post.create(person: person)
587
+ end
588
+
589
+ let(:person) do
590
+ Person.new
591
+ end
592
+
593
+ let(:criteria) do
594
+ person.posts.all
595
+ end
596
+
597
+ let(:persons) do
598
+ criteria.collect(&:person)
599
+ end
600
+
601
+ it 'sets the same parent object on each related object' do
602
+ expect(persons.uniq.size).to eq(1)
603
+ end
604
+ end
542
605
  end
543
606
 
544
607
  describe "#eager_load" do
@@ -2094,6 +2157,41 @@ describe Mongoid::Contextual::Mongo do
2094
2157
  expect(context.update).to be false
2095
2158
  end
2096
2159
  end
2160
+
2161
+ context 'when provided array filters', if: array_filters_supported? do
2162
+
2163
+ before do
2164
+ Band.delete_all
2165
+ b = Band.new(name: 'Depeche Mode')
2166
+ b.labels << Label.new(name: 'Warner')
2167
+ b.labels << Label.new(name: 'Sony')
2168
+ b.labels << Label.new(name: 'Cbs')
2169
+ b.save
2170
+
2171
+ b = Band.new(name: 'FKA Twigs')
2172
+ b.labels << Label.new(name: 'Warner')
2173
+ b.labels << Label.new(name: 'Cbs')
2174
+ b.save
2175
+ end
2176
+
2177
+
2178
+ let(:criteria) do
2179
+ Band.where(name: 'Depeche Mode')
2180
+ end
2181
+
2182
+ let!(:update) do
2183
+ context.update({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2184
+ array_filters: [{ 'i.name' => 'Cbs' }])
2185
+ end
2186
+
2187
+ it 'applies the array filters' do
2188
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2189
+ end
2190
+
2191
+ it 'does not affect other documents' do
2192
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Cbs'])
2193
+ end
2194
+ end
2097
2195
  end
2098
2196
 
2099
2197
  describe "#update_all" do
@@ -2231,6 +2329,41 @@ describe Mongoid::Contextual::Mongo do
2231
2329
  expect(context.update_all).to be false
2232
2330
  end
2233
2331
  end
2332
+
2333
+ context 'when provided array filters', if: array_filters_supported? do
2334
+
2335
+ before do
2336
+ Band.delete_all
2337
+ b = Band.new(name: 'Depeche Mode')
2338
+ b.labels << Label.new(name: 'Warner')
2339
+ b.labels << Label.new(name: 'Sony')
2340
+ b.labels << Label.new(name: 'Cbs')
2341
+ b.save
2342
+
2343
+ b = Band.new(name: 'FKA Twigs')
2344
+ b.labels << Label.new(name: 'Warner')
2345
+ b.labels << Label.new(name: 'Cbs')
2346
+ b.save
2347
+ end
2348
+
2349
+
2350
+ let(:criteria) do
2351
+ Band.all
2352
+ end
2353
+
2354
+ let!(:update) do
2355
+ context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2356
+ array_filters: [{ 'i.name' => 'Cbs' }])
2357
+ end
2358
+
2359
+ it 'applies the array filters' do
2360
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2361
+ end
2362
+
2363
+ it 'updates all documents' do
2364
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Sony'])
2365
+ end
2366
+ end
2234
2367
  end
2235
2368
 
2236
2369
  describe '#pipeline' do