%PDF- %PDF-
Direktori : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/MongoDB-v2.0.2/t/deprecated/ |
Current File : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/MongoDB-v2.0.2/t/deprecated/find_modifiers.t |
# Copyright 2017 - present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. use strict; use warnings; use Test::More 0.96; use Test::Fatal; use Test::Deep qw/!blessed/; use utf8; use MongoDB; use boolean; use lib "t/lib"; use MongoDBTest qw/skip_unless_mongod build_client get_test_db server_version server_type/; $ENV{PERL_MONGO_NO_DEP_WARNINGS} = 1; skip_unless_mongod(); my $conn = build_client(); my $testdb = get_test_db($conn); my $server_version = server_version($conn); my $server_type = server_type($conn); my $coll = $testdb->get_collection('test_collection'); # Setup a mapping from option name to '$'-prefixed modifier name my %modifier_for_option = map { $_ => "\$$_" } qw( comment hint max maxScan maxTimeMS min returnKey snapshot ); # These modifiers have names that differ from the option name $modifier_for_option{sort} = '$orderby'; $modifier_for_option{showRecordId} = '$showDiskLoc'; #--------------------------------------------------------------------------# # Design note: these tests are designed to verify that the various ways # that legacy query modifiers can be set are faithfully transmitted to # the server as expected. For expediency, these tests intercept the command # rather than try to observe results from the server. #--------------------------------------------------------------------------# # Monkey patch MongoDB::Op::_Query to intercept find commands query/command # constructions and stash them for later analysis. my @intercept; { no warnings 'redefine'; my $as_query_document = \&MongoDB::Op::_Query::_as_query_document; my $as_command = \&MongoDB::Op::_Query::_as_command; *MongoDB::Op::_Query::_as_query_document = sub { push @intercept, scalar $as_query_document->(@_); return $intercept[-1]; }; *MongoDB::Op::_Query::_as_command = sub { push @intercept, scalar $as_command->(@_); return $intercept[-1]; }; } #--------------------------------------------------------------------------# # Fixtures #--------------------------------------------------------------------------# # How many documents to search for by default my $num_docs_to_insert = 100; my $num_docs_to_search = 50; $coll->delete_many( {} ); $coll->insert_many( [ map { { x => $_ } } 1 .. $num_docs_to_insert ] ); my $index_name = $coll->indexes->create_one( [ x => 1 ] ); #--------------------------------------------------------------------------# # Test helpers #--------------------------------------------------------------------------# sub option_is { my ( $payload, $option_name, $expected ) = @_; local $Test::Builder::Level = $Test::Builder::Level + 1; # Commands are intecepted as array refs, unlike legacy queries $payload = {@$payload} if ref $payload eq 'ARRAY'; # In a legacy query, options show up as dollar modifiers my $key_to_check = $server_version < v3.2.0 ? $modifier_for_option{$option_name} : $option_name; my $got = $payload->{$key_to_check}; my $label = "'$key_to_check' correct"; if ( ref($got) eq 'Tie::IxHash' ) { cmp_got_ixhash( $got, $expected, $label ); } else { cmp_deeply( $got, $expected, $label ); } } # If we got a Tie::IxHash object, we need to upgrade the expected value # similar to how the MongoDB driver does it. sub cmp_got_ixhash { my ( $got, $expected, $label ) = @_; local $Test::Builder::Level = $Test::Builder::Level + 1; if ( ref($expected) eq 'Tie::IxHash' ) { cmp_deeply( $got, $expected, $label ); } elsif ( ref($expected) eq 'ARRAY' ) { cmp_deeply( $got, Tie::IxHash->new(@$expected), $label ); } elsif ( ref($expected) eq 'HASH' ) { warn "Comparing multi-key expected hash is unpredictable" if keys %$expected > 1; cmp_deeply( $got, Tie::IxHash->new(%$expected), $label ); } else { die "Don't know how to compare '$got' to '$expected'"; } } #--------------------------------------------------------------------------# # Tests #--------------------------------------------------------------------------# subtest "Given: a 'snapshot' value for an index" => sub { plan skip_all => "Snapshot removed in 3.7+" unless $server_version < v3.7.0; my $snapshot = true; my $snapshot2 = false; subtest "When: adding a snapshot via option" => sub { @intercept = (); my $cursor = $coll->find( { x => { '$gt' => $num_docs_to_search } }, { snapshot => $snapshot } ); is( scalar $cursor->all(), $num_docs_to_search, "Number of documents correct" ); option_is( $intercept[-1], 'snapshot', $snapshot ); }; subtest "When: adding a snapshot via modifiers" => sub { @intercept = (); my $cursor = $coll->find( { x => { '$gt' => $num_docs_to_search } }, { modifiers => { '$snapshot' => $snapshot } } ); is( scalar $cursor->all(), $num_docs_to_search, "Number of documents correct" ); option_is( $intercept[-1], 'snapshot', $snapshot ); }; subtest "When: adding a snapshot via options and modifiers" => sub { @intercept = (); my $cursor = $coll->find( { x => { '$gt' => $num_docs_to_search } }, { snapshot => $snapshot, modifiers => { '$snapshot' => $snapshot2 } } ); is( scalar $cursor->all(), $num_docs_to_search, "Number of documents correct" ); option_is( $intercept[-1], 'snapshot', $snapshot ); }; subtest "When: adding a snapshot via cursor method" => sub { @intercept = (); my $cursor = $coll->find( { x => { '$gt' => $num_docs_to_search } } ); $cursor->snapshot($snapshot); is( scalar $cursor->all(), $num_docs_to_search, "Number of documents correct" ); option_is( $intercept[-1], 'snapshot', $snapshot ); }; }; done_testing();