コード例 #1
0
        public void ReturnSnakeCaseForTwoModelStateErrorsWhenSnakeCaseIsSet()
        {
            //--Arrange
            var attribute     = new RidgidValidateModelAttribute();
            var actionContext = new HttpActionContext();

            actionContext.ModelState["Field"] = new ModelState
            {
                Errors =
                {
                    ModelStateCustomErrorMessage.Create(1, "ErrorMessage1"),
                    ModelStateCustomErrorMessage.Create(2, "ErrorMessage2")
                }
            };
            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            attribute.OnActionExecuting(actionContext);
            var response = actionContext.Response;

            //--Assert
            var contentAsString = ContentAsString(actionContext, response);

            contentAsString.ShouldBe(
                "{\"errors\":[{\"error_id\":1,\"debug_error_message\":\"ErrorMessage1\"},{\"error_id\":2,\"debug_error_message\":\"ErrorMessage2\"}]}");
        }
コード例 #2
0
        public void IsSnakeCaseReturnsTrueWithAppConfigSnakeCaseSettingTrue()
        {
            //--Arrange
            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act/Assert
            FormatResponseMessage.IsSnakeCase().ShouldBeTrue();
        }
コード例 #3
0
        internal HttpResponseMessage Execute()
        {
            var response = FormatResponseMessage.CreateMessage(null, HttpStatusCode.Created);

            response.RequestMessage   = new HttpRequestMessage();
            response.Headers.Location = new Uri("https://link");
            return(response);
        }
コード例 #4
0
        public override void Handle(ExceptionHandlerContext context)
        {
            var apiController = context.ExceptionContext.ControllerContext.Controller as ApiController;

            context.Result = FormatResponseMessage.CreateErrorResponse(apiController, 1,
                                                                       "An internal sever error occurred. This is not your fault.",
                                                                       HttpStatusCode.InternalServerError);
        }
コード例 #5
0
        public void GetCasing()
        {
            //--Arrange
            const string camelCaseStr      = "HelloMyNameIsBob";
            const string expectedSnakeCase = "hello_my_name_is_bob";

            //--Act
            var result = FormatResponseMessage.ConvertCamelCaseIntoSnakeCase(camelCaseStr);

            //--Assert
            result.ShouldBe(expectedSnakeCase);
        }
コード例 #6
0
        public void IsSnakeCaseReturnsFalseWithAppConfigSnakeCaseSettingFalse()
        {
            //--Arrange
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            config.AppSettings.Settings["snakecase"].Value = "false";
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");

            //--Act/Assert
            FormatResponseMessage.IsSnakeCase().ShouldBeFalse();
        }
コード例 #7
0
        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
        {
            var errorMessages = new List <ErrorMessage>
            {
                new ErrorMessage
                {
                    DebugErrorMessage = UNAUTHORIZED_MESSAGE,
                    ErrorId           = this.ErrorId
                }
            };

            actionContext.Response = FormatResponseMessage.CreateMessage(errorMessages, HttpStatusCode.Unauthorized);
        }
コード例 #8
0
        public void ValidateCorrectlyWhenMaxAndMinEqual()
        {
            //--Arrange
            var model = new ModelWithStringLengthMinAndMaxEqualField
            {
                MultipleWordedField = "12"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(false);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeTrue();
            result.Count.ShouldBe(0);
        }
コード例 #9
0
        public void UseSnakeCaseForFieldNameWhenSet()
        {
            //--Arrange
            var model             = new ModelWithRequiredFieldWithoutCustomErrorMessage();
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'multiple_worded_field' field is required.";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #10
0
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid)
            {
                return;
            }
            var errorMessages = (from key in actionContext.ModelState.Keys
                                 from error in actionContext.ModelState[key].Errors
                                 select ModelStateCustomErrorMessage.Parse(error.ErrorMessage))
                                .GroupBy(x => new { x.ErrorId, x.DebugErrorMessage })
                                .Select(x => x.First())
                                .ToList();
            var errorsResponseObject = new ErrorsResponse
            {
                Errors = errorMessages
            };

            actionContext.Response =
                FormatResponseMessage.CreateMessage(errorsResponseObject, HttpStatusCode.BadRequest);
        }
コード例 #11
0
        public void InvalidateCorrectlyWithCustomErrorMessage()
        {
            //--Arrange
            var model = new ModelWithStringLengthFieldWithCustomErrorMessage
            {
                Field = "invalid"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(false);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, "CustomMessage"));
        }
コード例 #12
0
        public void ReturnCamelCaseForOneModelStateErrorByDefault()
        {
            //--Arrange
            var attribute     = new RidgidValidateModelAttribute();
            var actionContext = new HttpActionContext();

            actionContext.ModelState["Field"] = new ModelState
            {
                Errors = { ModelStateCustomErrorMessage.Create(1, "ErrorMessage") }
            };
            FormatResponseMessage.SetSnakeCaseSetting(false);

            //--Act
            attribute.OnActionExecuting(actionContext);
            var response = actionContext.Response;

            //--Assert
            var contentAsString = ContentAsString(actionContext, response);

            contentAsString.ShouldBe("{\"errors\":[{\"errorId\":1,\"debugErrorMessage\":\"ErrorMessage\"}]}");
        }
コード例 #13
0
        public void InvalidateCorrectlyWhenMaxAndMinEqualWhenSnakeCase()
        {
            //--Arrange
            var model = new ModelWithStringLengthMinAndMaxEqualField
            {
                MultipleWordedField = "1234"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            result[0].ErrorMessage.ShouldBe(ModelStateCustomErrorMessage.Create(1,
                                                                                "The 'multiple_worded_field' field must be '2' characters long."));
        }
        // Checks that an actionresult is equal to the expected result, and that the status code and optional location
        // header are what is expected
        public static void BetterBe <TModelType>(this IHttpActionResult actionResult,
                                                 HttpStatusCode expectedStatusCode, TModelType expectedResult, string expectedLocationHeader = null) where TModelType : class
        {
            var        contentAsString = Content(actionResult, expectedStatusCode, false);
            TModelType returnedModel;

            try
            {
                returnedModel = JsonConvert.DeserializeObject <TModelType>(contentAsString,
                                                                           FormatResponseMessage.JsonSerializerSetting());
            }
            catch (JsonSerializationException)
            {
                throw new JsonSerializationException($"{contentAsString} could not be deserialized into the expected object.");
            }
            returnedModel.ShouldNotBeNull();

            AssertThatTwoObjectsAreTheSame(returnedModel, expectedResult);

            CheckLocationHeader(actionResult, expectedLocationHeader);
        }
コード例 #15
0
        public void UseSnakeCaseForFieldNameWhenSet()
        {
            //--Arrange
            var model = new ModelWithStringLengthField
            {
                MultipleWordedField = "1"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'multiple_worded_field' field must be between '2' and '3' characters long.";

            result[0].ErrorMessage.ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #16
0
        public void InvalidateCorrectlyWithoutCustomErrorMessage()
        {
            //--Arrange
            var model = new ModelWithDateTimeFieldWithoutCustomErrorMessage
            {
                CreatedDate = "invalidDate"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(false);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'CreatedDate' must be in ISO-8601 format, (i.e. yyyy-mm-ddThh:mm:ss.ffffff).";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #17
0
        public void InvalidateCorrectlyWithoutCustomErrorMessage()
        {
            //--Arrange
            var model = new ModelWithMinLengthFieldWithoutCustomErrorMessage
            {
                MultipleWordedField = "1"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(false);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'MultipleWordedField' field must be less than '2' characters long.";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #18
0
        public void ConvertFieldNameToSnakeCaseIfSetInAppConfig()
        {
            //--Arrange
            var model = new ModelWithEmailAddressFieldWithoutCustomErrorMessage()
            {
                MultipleWordedField = "invalidemail"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'multiple_worded_field' field is an invalid email address.";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #19
0
        public void SetFieldnameToSnakeCaseWhenSetInAppConfig()
        {
            //--Arrange
            var model = new ModelWithMaxLengthFieldWithoutCustomErrorMessage
            {
                MultipleWordedField = "123"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'multiple_worded_field' field cannot be greater than '2' characters long.";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
        public void InvalidateCorrectlyWithoutCustomErrorMessage()
        {
            //--Arrange
            var model = new ModelWithRegularExpressionFieldWithoutCustomErrorMessage
            {
                MultipleWordedField = "invalidregex"
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(false);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            const string defaultErrorMsg = "The 'MultipleWordedField' field must match the regular expression: 'a|b'.";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #21
0
        public void UseSnakeCaseInDefaultErrorMessageWhenSet()
        {
            //--Arrange
            var model = new ModelWithPositiveIntFieldWithoutCustomErrorMessage
            {
                CustomId = -1
            };
            var validationContext = new ValidationContext(model, null, null);
            var result            = new List <ValidationResult>();

            FormatResponseMessage.SetSnakeCaseSetting(true);

            //--Act
            var valid = Validator.TryValidateObject(model, validationContext, result, true);

            //--Assert
            valid.ShouldBeFalse();
            result.Count.ShouldBe(1);
            string defaultErrorMsg = $"The 'custom_id' field must be an integer value between '0' and '{int.MaxValue}'.";

            result[0].ErrorMessage
            .ShouldBe(ModelStateCustomErrorMessage.Create(1, defaultErrorMsg));
        }
コード例 #22
0
 private string CreateErrorMessage(string fieldName)
 {
     return(MininumLength == MaximumLength
         ? $"The '{FormatResponseMessage.GetCasing(fieldName)}' field must be '{MininumLength}' characters long."
         : $"The '{FormatResponseMessage.GetCasing(fieldName)}' field must be between '{MininumLength}' and '{MaximumLength}' characters long.");
 }
コード例 #23
0
 public IHttpActionResult HttpGenericErrorResponse(int errorId, string debugErrorMessage,
                                                   HttpStatusCode httpStatusCode)
 {
     return(FormatResponseMessage.CreateErrorResponse(this, errorId, debugErrorMessage, httpStatusCode));
 }
コード例 #24
0
 private static string CreateErrorMessage(string fieldName)
 {
     return($"The '{FormatResponseMessage.GetCasing(fieldName)}' field is an invalid email address.");
 }
コード例 #25
0
 private static string CreateErrorMessage(string fieldName)
 {
     return($"The '{FormatResponseMessage.GetCasing(fieldName)}' field is required.");
 }
コード例 #26
0
 public void IsSnakeCaseReturnsFalseWithNoAppConfigSnakeCaseSetting()
 {
     //--Act/Assert
     FormatResponseMessage.IsSnakeCase().ShouldBeFalse();
 }
コード例 #27
0
 private string CreateErrorMessage(string fieldName)
 {
     return($"The '{FormatResponseMessage.GetCasing(fieldName)}' must be in ISO-8601 format, (i.e. yyyy-mm-ddThh:mm:ss.ffffff).");
 }
コード例 #28
0
 private string CreateErrorMessage(string fieldName)
 {
     return($"The value of the '{FormatResponseMessage.GetCasing(fieldName)}' field must be between '{Mininum}' and '{Maximum}'.");
 }
コード例 #29
0
 private string CreateErrorMessage(string fieldName)
 {
     return($"The '{FormatResponseMessage.GetCasing(fieldName)}' field must be an integer value between '{MIN}' and '{MAX}'.");
 }
コード例 #30
0
 private string CreateErrorMessage(string fieldName)
 {
     return $"The '{FormatResponseMessage.GetCasing(fieldName)}' field must be less than '{Length}' characters long.";
 }