private void ErrorMessageIsAddedToCollection()
        {
            var error = new Error("id");
            var errorMessage = new ErrorMessage("aKey", "aMessage");

            error.AddErrorMessage(errorMessage);

            Assert.Contains(errorMessage, error.Messages);
        }
        private void ErrorMessageIsAddedToCollection()
        {
            var error        = new Error("id");
            var errorMessage = new ErrorMessage("aKey", "aMessage");

            error.AddErrorMessage(errorMessage);

            Assert.Contains(errorMessage, error.Messages);
        }
        private void ErrorMessageNullDoesNotAddToCollection()
        {
            var error = new Error("id");
            Assert.Equal(0, error.Messages.Count());

            ErrorMessage nullErrorMessage = null;
            error.AddErrorMessage(nullErrorMessage);

            Assert.Equal(0, error.Messages.Count());
        }
        private void ErrorMessageNullDoesNotAddToCollection()
        {
            var error = new Error("id");

            Assert.Equal(0, error.Messages.Count());

            ErrorMessage nullErrorMessage = null;

            error.AddErrorMessage(nullErrorMessage);

            Assert.Equal(0, error.Messages.Count());
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                var error = new Error();

                foreach (var item in context.ModelState)
                {
                    foreach (var err in item.Value.Errors)
                    {
                        error.AddErrorMessage(new ErrorMessage(item.Key, err.ErrorMessage));
                    }
                }

                context.Result = new BadRequestObjectResult(error);
            }
        }
        public async Task HandleAsync(HttpContext context)
        {
            try
            {
                var exceptionHandlerFeature = context.Features.Get <IExceptionHandlerFeature>();
                if (exceptionHandlerFeature == null)
                {
                    return;
                }

                var exception     = exceptionHandlerFeature.Error;
                var exceptionType = exception.GetType();

                if (_mappings.ContainsKey(exceptionType))
                {
                    context.Response.StatusCode = _mappings.GetStatusCode(exceptionType);
                }

                Error error = null;

                if (exception is BaseException)
                {
                    var baseException = exception as BaseException;
                    error = baseException.Error;
                }
                else
                {
                    error = new Error(Guid.NewGuid().ToString());
                    error.AddErrorMessage(new ErrorMessage("", $"Exception of type {exception.GetType()} occurred. Check logs for more info."));
                }

                context.Response.ContentType = "application/json";

                var responseBody = JsonConvert.SerializeObject(error);
                await context.Response.WriteAsync(responseBody);

                LogException(context.Response.StatusCode, exception);
            }
            catch (Exception ex)
            {
                _logger.LogError("Exception occurred in the exception handler.", ex);
            }
        }