Skip to content

Commit dd0c9e6

Browse files
committed
RUBY-895 Check valid document in View#find and #projection
1 parent 05acac8 commit dd0c9e6

File tree

5 files changed

+38
-8
lines changed

5 files changed

+38
-8
lines changed

lib/mongo/collection/view.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ def hash
125125
#
126126
# @since 2.0.0
127127
def initialize(collection, selector = {}, options = {})
128+
validate_doc!(selector)
128129
@collection = collection
129130
@selector = selector.dup
130131
@options = options.dup

lib/mongo/collection/view/readable.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ def no_cursor_timeout
232232
#
233233
# @since 2.0.0
234234
def projection(document = nil)
235+
validate_doc!(document) if document
235236
configure(:projection, document)
236237
end
237238

@@ -357,6 +358,10 @@ def special_selector
357358
def to_return
358359
[ limit || batch_size, batch_size || limit ].min
359360
end
361+
362+
def validate_doc!(doc)
363+
raise Error::InvalidDocument.new unless doc.respond_to?(:keys)
364+
end
360365
end
361366
end
362367
end

lib/mongo/error/invalid_document.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class InvalidDocument < Error
2323
# The error message.
2424
#
2525
# @since 2.0.0
26-
MESSAGE = 'Invalid document provided'.freeze
26+
MESSAGE = 'Invalid document provided.'.freeze
2727

2828
# Instantiate the new exception.
2929
#

spec/mongo/collection/view/readable_spec.rb

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,11 @@
436436

437437
describe '#projection' do
438438

439-
context 'when projection are specified' do
439+
let(:options) do
440+
{ :projection => { 'x' => 1 } }
441+
end
440442

441-
let(:options) do
442-
{ :projection => { 'x' => 1 } }
443-
end
443+
context 'when projection are specified' do
444444

445445
let(:new_projection) do
446446
{ 'y' => 1 }
@@ -456,14 +456,25 @@
456456
end
457457
end
458458

459-
context 'when projection are not specified' do
460-
461-
let(:options) { { :projection => { 'x' => 1 } } }
459+
context 'when projection is not specified' do
462460

463461
it 'returns the projection' do
464462
expect(view.projection).to eq(options[:projection])
465463
end
466464
end
465+
466+
context 'when projection is not a document' do
467+
468+
let(:new_projection) do
469+
'y'
470+
end
471+
472+
it 'raises an error' do
473+
expect do
474+
view.projection(new_projection)
475+
end.to raise_error(Mongo::Error::InvalidDocument)
476+
end
477+
end
467478
end
468479

469480
describe '#read' do

spec/mongo/collection/view_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,19 @@
496496
it 'dups the options' do
497497
expect(view.options).not_to be(options)
498498
end
499+
500+
context 'when the selector is not a valid document' do
501+
502+
let(:selector) do
503+
'y'
504+
end
505+
506+
it 'raises an error' do
507+
expect do
508+
view
509+
end.to raise_error(Mongo::Error::InvalidDocument)
510+
end
511+
end
499512
end
500513

501514
describe '#inspect' do

0 commit comments

Comments
 (0)