コード例 #1
0
        public void CreateCommand_should_return_expected_result_when_Sort_is_set(
            [Values(null, "{ x : 1 }", "{ y : 1 }")]
            string sortString)
        {
            var sort    = sortString == null ? null : BsonDocument.Parse(sortString);
            var subject = new FindOneAndReplaceOperation <BsonDocument>(_collectionNamespace, _filter, _replacement, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                Sort = sort
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription();

            var result = subject.CreateCommand(session, connectionDescription, null);

            var expectedResult = new BsonDocument
            {
                { "findAndModify", _collectionNamespace.CollectionName },
                { "query", _filter },
                { "update", _replacement },
                { "sort", sort, sort != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #2
0
        public void CreateCommand_should_return_the_expected_result_when_Collation_is_set(
            [Values(null, "en_US", "fr_CA")]
            string locale)
        {
            var collation = locale == null ? null : new Collation(locale);
            var subject   = new FindOneAndDeleteOperation <BsonDocument>(_collectionNamespace, _filter, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                Collation = collation
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription(serverVersion: Feature.Collation.FirstSupportedVersion);

            var result = subject.CreateCommand(session, connectionDescription, null);

            var expectedResult = new BsonDocument
            {
                { "findAndModify", _collectionNamespace.CollectionName },
                { "query", _filter },
                { "remove", true },
                { "collation", () => collation.ToBsonDocument(), collation != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #3
0
        public void CreateCommand_should_return_expected_result_when_Comment_is_set(
            [Values(null, "test")]
            string comment)
        {
            var subject = new AggregateOperation <BsonDocument>(_collectionNamespace, __pipeline, __resultSerializer, _messageEncoderSettings)
            {
                Comment = comment,
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription(Feature.AggregateComment.FirstSupportedVersion);
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "aggregate", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(__pipeline) },
                { "comment", () => comment, comment != null },
                { "cursor", new BsonDocument() }
            };

            result.Should().Be(expectedResult);
        }
        public void CreateCommand_should_return_expected_result_when_WriteConcern_is_set(
            [Values(null, 1, 2)]
            int?w)
        {
            var writeConcern = w.HasValue ? new WriteConcern(w.Value) : null;
            var subject      = new FindOneAndReplaceOperation <BsonDocument>(_collectionNamespace, _filter, _replacement, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                WriteConcern = writeConcern
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription();

            var result = subject.CreateCommand(session, connectionDescription, null);

            var expectedResult = new BsonDocument
            {
                { "findAndModify", _collectionNamespace.CollectionName },
                { "query", _filter },
                { "update", _replacement },
                { "writeConcern", () => writeConcern.ToBsonDocument(), writeConcern != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #5
0
        public void CreateCommand_should_return_expected_result_when_AllowPartialResults_is_set(
            [Values(null, false, true)]
            bool?allowPartialResults,
            [Values(ServerType.Standalone, ServerType.ShardRouter)]
            ServerType serverType)
        {
            var subject = new FindCommandOperation <BsonDocument>(_collectionNamespace, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                AllowPartialResults = allowPartialResults
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription(serverType: serverType);
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "find", _collectionNamespace.CollectionName },
                { "allowPartialResults", () => allowPartialResults.Value, allowPartialResults.HasValue&& serverType == ServerType.ShardRouter }
            };

            result.Should().Be(expectedResult);
        }
コード例 #6
0
        public void CreateCommand_should_return_the_expected_result_when_AllowDiskUse_is_set(
            [Values(null, false, true)]
            bool?allowDiskUse)
        {
            var subject = new AggregateOperation <BsonDocument>(_collectionNamespace, __pipeline, __resultSerializer, _messageEncoderSettings)
            {
                AllowDiskUse = allowDiskUse
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription(Feature.AggregateCursorResult.FirstSupportedVersion);
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "aggregate", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(__pipeline) },
                { "allowDiskUse", () => allowDiskUse.Value, allowDiskUse != null },
                { "cursor", new BsonDocument() }
            };

            result.Should().Be(expectedResult);
        }
コード例 #7
0
        public void CreateCommand_should_return_expected_result_when_MaxTime_is_set(
            [Values(null, 1, 2)]
            int?milliseconds)
        {
            var maxTime = milliseconds.HasValue ? TimeSpan.FromMilliseconds(milliseconds.Value) : (TimeSpan?)null;
            var subject = new DistinctOperation <int>(_collectionNamespace, _valueSerializer, _fieldName, _messageEncoderSettings)
            {
                MaxTime = maxTime
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription();
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "distinct", _collectionNamespace.CollectionName },
                { "key", _fieldName },
                { "maxTimeMS", () => maxTime.Value.TotalMilliseconds, maxTime.HasValue }
            };

            result.Should().Be(expectedResult);
        }
コード例 #8
0
        public void CreateCommand_should_return_expected_result_when_ReadConcern_is_set(
            [Values(null, ReadConcernLevel.Linearizable, ReadConcernLevel.Local)]
            ReadConcernLevel?level)
        {
            var readConcern = level.HasValue ? new ReadConcern(level.Value) : ReadConcern.Default;
            var subject     = new DistinctOperation <int>(_collectionNamespace, _valueSerializer, _fieldName, _messageEncoderSettings)
            {
                ReadConcern = readConcern
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription(Feature.ReadConcern.FirstSupportedVersion);
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "distinct", _collectionNamespace.CollectionName },
                { "key", _fieldName },
                { "readConcern", () => readConcern.ToBsonDocument(), !readConcern.IsServerDefault }
            };

            result.Should().Be(expectedResult);
        }
コード例 #9
0
        public void CreateCommand_should_return_expected_result_when_Collation_is_set(
            [Values(null, "en_US", "fr_CA")]
            string locale)
        {
            var collation = locale == null ? null : new Collation(locale);
            var subject   = new DistinctOperation <int>(_collectionNamespace, _valueSerializer, _fieldName, _messageEncoderSettings)
            {
                Collation = collation
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription(Feature.Collation.FirstSupportedVersion);
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "distinct", _collectionNamespace.CollectionName },
                { "key", _fieldName },
                { "collation", () => collation.ToBsonDocument(), collation != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #10
0
        public void CreateCommand_should_return_expected_result_when_Filter_is_set(
            [Values(null, "{ x : 1 }", "{ x : 2 }")]
            string filterString)
        {
            var filter  = filterString == null ? null : BsonDocument.Parse(filterString);
            var subject = new DistinctOperation <int>(_collectionNamespace, _valueSerializer, _fieldName, _messageEncoderSettings)
            {
                Filter = filter
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription();
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "distinct", _collectionNamespace.CollectionName },
                { "key", _fieldName },
                { "query", filter, filter != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #11
0
        public void CreateCommand_should_return_expected_result_when_MaxTime_is_set(long maxTimeTicks, int expectedMaxTimeMS)
        {
            var subject = new GeoNearOperation <BsonDocument>(_collectionNamespace, _near, _resultSerializer, _messageEncoderSettings)
            {
                MaxTime = TimeSpan.FromTicks(maxTimeTicks)
            };

            var connectionDescription = OperationTestHelper.CreateConnectionDescription(Feature.Collation.FirstSupportedVersion);
            var session = OperationTestHelper.CreateSession();

            var result = subject.CreateCommand(connectionDescription, session);

            var expectedResult = new BsonDocument
            {
                { "geoNear", _collectionNamespace.CollectionName },
                { "near", new BsonArray {
                      1, 2
                  } },
                { "maxTimeMS", expectedMaxTimeMS }
            };

            result.Should().Be(expectedResult);
            result["maxTimeMS"].BsonType.Should().Be(BsonType.Int32);
        }
コード例 #12
0
        public void CreateCommand_should_return_the_expected_result_when_Hint_is_set(
            [Values(null, "{x: 1}")]
            string hintJson)
        {
            var hint    = hintJson == null ? null : BsonDocument.Parse(hintJson);
            var subject = new AggregateToCollectionOperation(_collectionNamespace, __pipeline, _messageEncoderSettings)
            {
                Hint = hint
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription();

            var result = subject.CreateCommand(session, connectionDescription);

            var expectedResult = new BsonDocument
            {
                { "aggregate", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(__pipeline) },
                { "cursor", new BsonDocument() },
                { "hint", () => hint, hint != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #13
0
        public void CreateCommand_should_return_expected_result_when_Collation_is_set(
            [Values(null, "en_US")]
            string locale)
        {
            var collation = locale == null ? null : new Collation(locale);
            var subject   = new AggregateToCollectionOperation(_collectionNamespace, __pipeline, _messageEncoderSettings)
            {
                Collation = collation
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription();

            var result = subject.CreateCommand(session, connectionDescription);

            var expectedResult = new BsonDocument
            {
                { "aggregate", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(__pipeline) },
                { "collation", () => collation.ToBsonDocument(), collation != null },
                { "cursor", new BsonDocument() }
            };

            result.Should().Be(expectedResult);
        }
コード例 #14
0
        public void CreateCommand_should_return_expected_result_when_Collation_is_set(
            [Values(null, "en_US", "fr_CA")]
            string locale)
        {
            var collation = locale == null ? null : new Collation(locale);
            var subject   = new CreateViewOperation(_databaseNamespace, _viewName, _collectionNamespace.CollectionName, _pipeline, _messageEncoderSettings)
            {
                Collation = collation
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription(serverVersion: Feature.Views.FirstSupportedVersion);

            var result = subject.CreateCommand(session, connectionDescription);

            var expectedResult = new BsonDocument
            {
                { "create", _viewName },
                { "viewOn", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(_pipeline) },
                { "collation", () => collation.ToBsonDocument(), collation != null }
            };

            result.Should().Be(expectedResult);
        }
コード例 #15
0
        public void CreateEncryptedCreateCollectionOperationIfConfigured_should_return_expected_result_when_EncryptedFields_is_set(string[] escCollectionStrElement, string[] eccCollectionStrElement, string[] ecocCollectionStrElement)
        {
            var encryptedFields = BsonDocument.Parse($@"
            {{
                {GetFirstElementWithCommaOrEmpty(escCollectionStrElement)}
                {GetFirstElementWithCommaOrEmpty(eccCollectionStrElement)}
                {GetFirstElementWithCommaOrEmpty(ecocCollectionStrElement)}
                ""fields"" :
                [{{
                    ""path"" : ""firstName"",
                    ""keyId"" : {{ ""$binary"" : {{ ""subType"" : ""04"", ""base64"" : ""AAAAAAAAAAAAAAAAAAAAAA=="" }} }},
                    ""bsonType"" : ""string"",
                    ""queries"" : {{ ""queryType"" : ""equality"" }}
                }},
                {{
                    ""path"" : ""ssn"",
                    ""keyId"" : {{ ""$binary"" : {{ ""subType"" : ""04"", ""base64"": ""BBBBBBBBBBBBBBBBBBBBBB=="" }} }},
                    ""bsonType"" : ""string""
                }}]
            }}");

            var subject = CreateCollectionOperation.CreateEncryptedCreateCollectionOperationIfConfigured(_collectionNamespace, encryptedFields, _messageEncoderSettings, null);
            var session = OperationTestHelper.CreateSession();

            var operations = ((CompositeWriteOperation <BsonDocument>)subject)._operations <BsonDocument>();

            // esc
            AssertCreateCollectionCommand(
                operations[0],
                new CollectionNamespace(_collectionNamespace.DatabaseNamespace.DatabaseName, GetExpectedCollectionName(escCollectionStrElement)),
                encryptedFields: null,
                isMainOperation: false);
            // ecc
            AssertCreateCollectionCommand(
                operations[1],
                new CollectionNamespace(_collectionNamespace.DatabaseNamespace.DatabaseName, GetExpectedCollectionName(eccCollectionStrElement)),
                encryptedFields: null,
                isMainOperation: false);
            // eco
            AssertCreateCollectionCommand(
                operations[2],
                new CollectionNamespace(_collectionNamespace.DatabaseNamespace.DatabaseName, GetExpectedCollectionName(ecocCollectionStrElement)),
                encryptedFields: null,
                isMainOperation: false);
            // main
            AssertCreateCollectionCommand(
                operations[3],
                _collectionNamespace,
                encryptedFields,
                isMainOperation: true,
                withClusteredIndex: false);
            // __safeContent__
            AssertIndex(operations[4], _collectionNamespace, index: new BsonDocument("__safeContent__", 1));

            void AssertCreateCollectionCommand((IWriteOperation <BsonDocument> Operation, bool IsMainOperation) operationInfo, CollectionNamespace collectionNamespace, BsonDocument encryptedFields, bool isMainOperation, bool withClusteredIndex = true)
            {
                var expectedResult = new BsonDocument
                {
                    { "create", collectionNamespace.CollectionName },
                    { "encryptedFields", encryptedFields, encryptedFields != null },
                    { "clusteredIndex", new BsonDocument {
                          { "key", new BsonDocument("_id", 1) }, { "unique", true }
                      }, withClusteredIndex }
                };

                AssertCommand(operationInfo, isMainOperation, expectedResult);
            }

            void AssertIndex((IWriteOperation <BsonDocument> Operation, bool IsMainOperation) operationInfo, CollectionNamespace collectionNamespace, BsonDocument index)
            {
                var expectedResult = new BsonDocument
                {
                    { "createIndexes", collectionNamespace.CollectionName },
                    {
                        "indexes",
                        BsonArray.Create(new [] { new BsonDocument {
                                                      { "key", index }, { "name", IndexNameHelper.GetIndexName(index) }
                                                  } })
                    }
                };

                AssertCommand(operationInfo, isMainOperation: false, expectedResult);
            }

            void AssertCommand((IWriteOperation <BsonDocument> Operation, bool IsMainOperation) operationInfo, bool isMainOperation, BsonDocument expectedResult)
            {
                operationInfo.IsMainOperation.Should().Be(isMainOperation);
                var operation = operationInfo.Operation;

                var result = operation switch
                {
                    CreateCollectionOperation createCollectionOperation => createCollectionOperation.CreateCommand(session),
                    CreateIndexesOperation createIndexesOperation => createIndexesOperation.CreateCommand(session, OperationTestHelper.CreateConnectionDescription()),
                    _ => throw new Exception($"Unexpected operation {operation}."),
                };

                result.Should().Be(expectedResult);
            }

            string GetFirstElementWithCommaOrEmpty(string[] array) => array.First() != null ? $"{array.First()}," : string.Empty;

            string GetExpectedCollectionName(string[] array)
            {
                var first = array.First();
                var last  = array.Last();

                if (first != null)
                {
                    return(last);
                }
                else
                {
                    return($"enxcol_.{_collectionNamespace.CollectionName}.{last}");
                }
            }
        }
コード例 #16
0
        public void CreateEncryptedDropCollectionOperationIfConfigured_should_return_expected_result_when_EncryptedFields_is_set(string[] escCollectionStrElement, string[] eccCollectionStrElement, string[] ecocCollectionStrElement)
        {
            var encryptedFields = BsonDocument.Parse($@"
            {{
                {GetFirstElementWithCommaOrEmpty(escCollectionStrElement)}
                {GetFirstElementWithCommaOrEmpty(eccCollectionStrElement)}
                {GetFirstElementWithCommaOrEmpty(ecocCollectionStrElement)}
                ""fields"" :
                [{{
                    ""path"" : ""firstName"",
                    ""keyId"" : {{ ""$binary"" : {{ ""subType"" : ""04"", ""base64"" : ""AAAAAAAAAAAAAAAAAAAAAA=="" }} }},
                    ""bsonType"" : ""string"",
                    ""queries"" : {{ ""queryType"" : ""equality"" }}
                }},
                {{
                    ""path"" : ""ssn"",
                    ""keyId"" : {{ ""$binary"" : {{ ""subType"" : ""04"", ""base64"": ""BBBBBBBBBBBBBBBBBBBBBB=="" }} }},
                    ""bsonType"" : ""string""
                }}]
            }}");

            var subject = DropCollectionOperation.CreateEncryptedDropCollectionOperationIfConfigured(_collectionNamespace, encryptedFields, _messageEncoderSettings, null);
            var session = OperationTestHelper.CreateSession();

            var operations = ((CompositeWriteOperation <BsonDocument>)subject)._operations <BsonDocument>();

            // esc
            AssertDropCollectionCommand(
                operations[0],
                new CollectionNamespace(_collectionNamespace.DatabaseNamespace.DatabaseName, GetExpectedCollectionName(escCollectionStrElement)),
                encryptedFields: null,
                isMainOperation: false);
            // ecc
            AssertDropCollectionCommand(
                operations[1],
                new CollectionNamespace(_collectionNamespace.DatabaseNamespace.DatabaseName, GetExpectedCollectionName(eccCollectionStrElement)),
                encryptedFields: null,
                isMainOperation: false);
            // eco
            AssertDropCollectionCommand(
                operations[2],
                new CollectionNamespace(_collectionNamespace.DatabaseNamespace.DatabaseName, GetExpectedCollectionName(ecocCollectionStrElement)),
                encryptedFields: null,
                isMainOperation: false);

            // main
            AssertDropCollectionCommand(
                operations[3],
                _collectionNamespace,
                encryptedFields,
                isMainOperation: true);

            void AssertDropCollectionCommand((IWriteOperation <BsonDocument> Operation, bool IsMainOperation) operationInfo, CollectionNamespace collectionNamespace, BsonDocument encryptedFields, bool isMainOperation)
            {
                operationInfo.IsMainOperation.Should().Be(isMainOperation);
                var operation      = operationInfo.Operation.Should().BeOfType <DropCollectionOperation>().Subject;
                var result         = operation.CreateCommand(session);
                var expectedResult = new BsonDocument
                {
                    { "drop", collectionNamespace.CollectionName },
                };

                result.Should().Be(expectedResult);
            }

            string GetFirstElementWithCommaOrEmpty(string[] array) => array.First() != null ? $"{array.First()}," : string.Empty;

            string GetExpectedCollectionName(string[] array)
            {
                var first = array.First();
                var last  = array.Last();

                if (first != null)
                {
                    return(last);
                }
                else
                {
                    return($"enxcol_.{_collectionNamespace.CollectionName}.{last}");
                }
            }
        }