public void constructor_should_initialize_subject()
        {
            var subject = new MongoWriteException(_connectionId, _writeError, _writeConcernError, _innerException);

            subject.ConnectionId.Should().Be(_connectionId);
            subject.InnerException.Should().Be(_innerException);
            subject.Message.Should().Be("A write operation resulted in an error." + Environment.NewLine + "  writeError" + Environment.NewLine + "  writeConcernError");
            subject.WriteConcernError.Should().Be(_writeConcernError);
            subject.WriteError.Should().Be(_writeError);
        }
Example #2
0
 /// <summary>
 /// Handles a mongo write exception that was thrown when attempting to create an entity.
 /// </summary>
 /// <param name="exception">The exception.</param>
 /// <param name="request">The request.</param>
 protected override void HandleOnCreate(MongoWriteException exception, CreateBreakfastItemRequest request)
 {
     if (exception.WriteError.Category == ServerErrorCategory.DuplicateKey)
     {
         throw BadRequestException.Duplicate <BreakfastItem>(x => x.Name, request.Name, exception);
     }
 }
        private void HandleWriteException <T>(MongoWriteException ex)
        {
            if (ex.WriteError.Category == ServerErrorCategory.DuplicateKey)
            {
                throw new DuplicateKeyException($"Error adding item of type {nameof(T)}", typeof(T), ex);
            }

            throw new OperationFailedException("Operation was not completed.", ex);
        }
        public void constructor_should_initialize_subject()
        {
            var subject = new MongoWriteException(__connectionId, __writeError, __writeConcernError, __innerException);

            subject.ConnectionId.Should().Be(__connectionId);
            subject.InnerException.Should().Be(__innerException);
            subject.Message.Should().Be("A write operation resulted in an error." + Environment.NewLine + "  writeError" + Environment.NewLine + "  writeConcernError");
            subject.WriteConcernError.Should().Be(__writeConcernError);
            subject.WriteError.Should().Be(__writeError);
        }
Example #5
0
        public static bool IsUniqueViolation(this MongoWriteException exception)
        {
            var result = false;

            if (exception != null && exception.WriteError != null)
            {
                result = exception.WriteError.Code.Equals(MongoUniqueViolationCode);
            }
            return(result);
        }
        public void ShouldReturnFalseIfPassedNullMongoWriteException()
        {
            // Arrange
            MongoWriteException exception = null;

            // Act
            var result = exception.IsUniqueViolation();

            // Assert
            result.Should().BeFalse();
        }
Example #7
0
        public void constructor_should_initialize_subject()
        {
            var subject = new MongoWriteException(__connectionId, __writeError, __writeConcernError, __innerException);

            subject.ConnectionId.Should().Be(__connectionId);
            subject.ErrorLabels.Should().BeEquivalentTo(__writeConcernError.ErrorLabels);
            subject.InnerException.Should().Be(__innerException);
            subject.Message.Should().Be("A write operation resulted in an error. WriteError: { Category : \"Uncategorized\", Code : 1, Message : \"writeError\", Details : \"{ \"details\" : \"writeError\" }\" }. WriteConcernError: { Code : \"1\", Message : \"writeConcernError\", Details : \"{ \"details\" : \"writeConcernError\" }\", ErrorLabels : [ \"RetryableWriteError\" ] }.");
            subject.WriteConcernError.Should().Be(__writeConcernError);
            subject.WriteError.Should().Be(__writeError);
        }
        public void Setup()
        {
            IdentityResourceDataAccessMock = new Mock <IIdentityResourceDataAccess>();
            IdentityResourceService        = new IdentityResourceService(IdentityResourceDataAccessMock.Object);

            var connectionId = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2);
            var writeConcernErrorConstructor = typeof(WriteError).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
            var writeError = (WriteError)writeConcernErrorConstructor.Invoke(new object[] { ServerErrorCategory.DuplicateKey, 11000, "writeError", new BsonDocument("details", "writeError") });

            MongoWriteException = new MongoWriteException(connectionId, writeError, null, null);
        }
Example #9
0
    static MockMongoCollection()
    {
        var connectionId      = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2);
        var innerException    = new Exception("inner");
        var ctor              = typeof(WriteConcernError).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
        var writeConcernError = (WriteConcernError)ctor.Invoke(new object[] { 1, "writeConcernError", new BsonDocument("details", "writeConcernError") });

        ctor = typeof(WriteError).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
        var writeError = (WriteError)ctor.Invoke(new object[] { ServerErrorCategory.Uncategorized, 1, "writeError", new BsonDocument("details", "writeError") });

        __writeException = new MongoWriteException(connectionId, writeError, writeConcernError, innerException);
    }
Example #10
0
        public void Setup()
        {
            ApiScopeDataAccessMock = new Mock <IApiScopeDataAccess>();
            ApiScopeService        = new ApiScopeService(ApiScopeDataAccessMock.Object);
            ExpressionItsAny       = It.IsAny <Expression <Func <ApiScopeData, bool> > >();

            var connectionId = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2);
            var writeConcernErrorConstructor = typeof(WriteError).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
            var writeError = (WriteError)writeConcernErrorConstructor.Invoke(new object[] { ServerErrorCategory.DuplicateKey, 11000, "writeError", new BsonDocument("details", "writeError") });

            MongoWriteException = new MongoWriteException(connectionId, writeError, null, null);
        }
        public override void OnException(ExceptionContext context)
        {
            string message = "";

#if DEBUG
            message = context.Exception.Message;
#else
            message = "Ocurrió un error al procesar la solicitud";
#endif
            GenericResponse <object> response = new GenericResponse <object>()
            {
                IsSuccessful = false
            };

            if (context.Exception is MongoDbConnectionException)
            {
                response.Message    = message;
                response.StatusCode = (int)HttpStatusCode.Conflict;
            }
            else if (context.Exception is MongoWriteException)
            {
                MongoWriteException mdbException = context.Exception as MongoWriteException;
                response.Message = message;
                if (mdbException.WriteError.Category == ServerErrorCategory.DuplicateKey)
                {
                    string messageField   = mdbException.WriteError.Message;
                    int    indexPesosSign = messageField.IndexOf("{");
                    string campo          = messageField.Substring(indexPesosSign, (messageField.Length - indexPesosSign));
                    int    indexUnderLine = campo.IndexOf(":");
                    campo               = campo.Substring(1, indexUnderLine - 1).Trim();
                    response.Message    = $"No se puede duplicar el valor para '{campo}'";
                    response.StatusCode = (int)HttpStatusCode.Conflict;
                }
            }
            else if (context.Exception is MongoAuthenticationException)
            {
                response.Message    = "No hay acceso al servidor BD solicitado";
                response.StatusCode = (int)HttpStatusCode.Conflict;
            }
            else if (context.Exception is Exception)
            {
                response.Message    = message;
                response.StatusCode = (int)HttpStatusCode.InternalServerError;
            }

            ObjectResult objectResult = new ObjectResult(response);
            objectResult.StatusCode = response.StatusCode;
            context.Result          = objectResult;
        }
        public void ShouldReturnFalseIfPassedMongoWriteExceptionWithWriteErrorAsNull()
        {
            // Arrange
            var connectionId = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2);
            WriteError writeError = null;
            WriteConcernError writeConcernError = null;
            Exception innerException = new InvalidOperationException();
            var exception = new MongoWriteException(connectionId, writeError, writeConcernError, innerException);

            // Act
            var result = exception.IsUniqueViolation();

            // Assert
            result.Should().BeFalse();
        }
        public void ShouldReturnTrueIfPassedMongoWriteExceptionWithWriteError()
        {
            // Arrange
            var connectionId = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2);
            var innerException = new Exception("inner");
            WriteConcernError writeConcernError = null;
            var ctor = typeof(WriteError).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
            var writeError = (WriteError)ctor.Invoke(new object[] { ServerErrorCategory.Uncategorized, MongoUniqueViolationCode, "writeError", new BsonDocument("details", "writeError") });
            var exception = new MongoWriteException(connectionId, writeError, writeConcernError, innerException);

            // Act
            var result = exception.IsUniqueViolation();

            // Assert
            result.Should().BeTrue();
        }
        public void Serialization_should_work()
        {
            var subject = new MongoWriteException(_connectionId, _writeError, _writeConcernError, _innerException);

            var formatter = new BinaryFormatter();
            using (var stream = new MemoryStream())
            {
                formatter.Serialize(stream, subject);
                stream.Position = 0;
                var rehydrated = (MongoWriteException)formatter.Deserialize(stream);

                rehydrated.ConnectionId.Should().Be(subject.ConnectionId);
                rehydrated.InnerException.Message.Should().Be(subject.InnerException.Message); // Exception does not override Equals
                rehydrated.Message.Should().Be(subject.Message);
                rehydrated.WriteConcernError.Should().BeUsing(subject.WriteConcernError, EqualityComparerRegistry.Default);
                rehydrated.WriteError.Should().BeUsing(subject.WriteError, EqualityComparerRegistry.Default);
            }
        }
        public void FromBulkWriteException_should_return_expected_result()
        {
            var processedRequests = new[] { new InsertOneModel <BsonDocument>(new BsonDocument("_id", 1)) };
            var upserts           = new List <BulkWriteUpsert>();
            var bulkWriteResult   = new BulkWriteResult <BsonDocument> .Acknowledged(1, 1, 0, 0, 0, processedRequests, upserts);

            var writeErrors         = new[] { new BulkWriteError(1, ServerErrorCategory.Uncategorized, 2, "message", new BsonDocument("details", 1)) };
            var writeConcernError   = new WriteConcernError(1, "message", new BsonDocument("details", 1));
            var unprocessedRequests = new List <WriteModel <BsonDocument> >();
            var bulkWriteException  = new MongoBulkWriteException <BsonDocument>(__connectionId, bulkWriteResult, writeErrors, writeConcernError, unprocessedRequests);

            var result = MongoWriteException.FromBulkWriteException(bulkWriteException);

            result.ConnectionId.Should().Be(__connectionId);
            result.InnerException.Should().BeSameAs(bulkWriteException);
            result.Message.Should().Be("A write operation resulted in an error." + Environment.NewLine + "  message" + Environment.NewLine + "  message");
            result.WriteConcernError.Should().Be(writeConcernError);
            result.WriteError.Should().Be(writeErrors[0]);
        }
        public void Serialization_should_work()
        {
            var subject = new MongoWriteException(__connectionId, __writeError, __writeConcernError, __innerException);

            var formatter = new BinaryFormatter();

            using (var stream = new MemoryStream())
            {
                formatter.Serialize(stream, subject);
                stream.Position = 0;
                var rehydrated = (MongoWriteException)formatter.Deserialize(stream);

                rehydrated.ConnectionId.Should().Be(subject.ConnectionId);
                rehydrated.InnerException.Message.Should().Be(subject.InnerException.Message); // Exception does not override Equals
                rehydrated.Message.Should().Be(subject.Message);
                rehydrated.WriteConcernError.Should().BeUsing(subject.WriteConcernError, EqualityComparerRegistry.Default);
                rehydrated.WriteError.Should().BeUsing(subject.WriteError, EqualityComparerRegistry.Default);
            }
        }
Example #17
0
        public void FromBulkWriteException_should_return_expected_result()
        {
            var processedRequests = new[] { new InsertOneModel <BsonDocument>(new BsonDocument("_id", 1)) };
            var upserts           = new List <BulkWriteUpsert>();
            var bulkWriteResult   = new BulkWriteResult <BsonDocument> .Acknowledged(1, 1, 0, 0, 0, processedRequests, upserts);

            var writeErrors         = new[] { new BulkWriteError(1, ServerErrorCategory.Uncategorized, 2, "message", new BsonDocument("details", 1)) };
            var writeConcernError   = new WriteConcernError(1, null, "message", new BsonDocument("details", 1), new[] { "RetryableWriteError" });
            var unprocessedRequests = new List <WriteModel <BsonDocument> >();
            var bulkWriteException  = new MongoBulkWriteException <BsonDocument>(__connectionId, bulkWriteResult, writeErrors, writeConcernError, unprocessedRequests);

            var result = MongoWriteException.FromBulkWriteException(bulkWriteException);

            result.ConnectionId.Should().Be(__connectionId);
            result.ErrorLabels.Should().BeEquivalentTo(writeConcernError.ErrorLabels);
            result.InnerException.Should().BeSameAs(bulkWriteException);
            result.Message.Should().Be("A write operation resulted in an error. WriteError: { Category : \"Uncategorized\", Code : 2, Message : \"message\", Details : \"{ \"details\" : 1 }\" }. WriteConcernError: { Code : \"1\", Message : \"message\", Details : \"{ \"details\" : 1 }\", ErrorLabels : [ \"RetryableWriteError\" ] }.");
            result.WriteConcernError.Should().Be(writeConcernError);
            result.WriteError.Should().Be(writeErrors[0]);
        }
 public static bool IsDuplicateKeyException(this MongoWriteException ex)
 {
     return(ex.WriteError != null && ex.WriteError.Code == 11000);
 }
Example #19
0
 public static bool MeansDuplicateKey(this MongoWriteException e)
 => e.Message.Contains("E11000 duplicate key error");
 /// <summary>
 /// Handles a mongo write exception that was thrown when attempting to create an entity.
 /// </summary>
 /// <param name="exception">The exception.</param>
 /// <param name="request">The request.</param>
 protected virtual void HandleOnCreate(MongoWriteException exception, TCreateRequest request)
 {
 }