/// <summary> /// Examines input json string to ensure that it compiles with the JsonSchema definition. Any errors in the /// validation of the schema are returned via the errors out parameter. /// </summary> /// <param name="schema">Schemas definition used as a reference.</param> /// <param name="inputJson">Input json example to be validated</param> /// <param name="errors">Out parameter that provides any errors, warnings, or messages that were generated</param> /// <param name="expectedJson"></param> /// <returns></returns> public bool ValidateJsonCompilesWithSchema(JsonSchema schema, JsonExample inputJson, out ValidationError[] errors, JsonExample expectedJson = null, ValidationOptions options = null) { if (null == schema) { throw new ArgumentNullException("schema"); } if (null == inputJson) { throw new ArgumentNullException("inputJson"); } string collectionPropertyName = "value"; if (null != inputJson.Annotation && null != inputJson.Annotation.CollectionPropertyName) { collectionPropertyName = inputJson.Annotation.CollectionPropertyName; } // If we didn't get an options, create a new one with some defaults provided by the annotation options = options ?? new ValidationOptions(); options.AllowTruncatedResponses = (inputJson.Annotation ?? new CodeBlockAnnotation()).TruncatedResult; options.CollectionPropertyName = collectionPropertyName; return(schema.ValidateJson(inputJson, out errors, this.registeredSchema, options, expectedJson)); }
/// <summary> /// Checks that the expected response of a method definition is valid with this resource. /// </summary> /// <param name="method"></param> /// <param name="errors"></param> /// <returns></returns> public bool ValidateExpectedResponse(MethodDefinition method, out ValidationError[] errors) { HttpParser parser = new HttpParser(); var response = parser.ParseHttpResponse(method.ExpectedResponse); JsonExample example = new JsonExample(response.Body, method.ExpectedResponseMetadata); var otherSchemas = new Dictionary <string, JsonSchema>(); return(this.ValidateJson(example, out errors, otherSchemas, null)); }
public void NullPropertyShouldBeOk() { var nullableSchema = this.SchemaForNullTest(expectNulls: true); var exampleObj = new { prop1 = (string)null, prop2 = 12345 }; string json = JsonConvert.SerializeObject(exampleObj); var testExample = new JsonExample(json); ValidationError[] errors; Assert.IsTrue(nullableSchema.ValidateJson(testExample, out errors, new Dictionary<string,JsonSchema>(), new ValidationOptions())); Assert.AreEqual(0, errors.Length); }
/// <summary> /// Examines input json string to ensure that it compiles with the JsonSchema definition. Any errors in the /// validation of the schema are returned via the errors out parameter. /// </summary> /// <param name="schema">Schemas definition used as a reference.</param> /// <param name="inputJson">Input json example to be validated</param> /// <param name="errors">Out parameter that provides any errors, warnings, or messages that were generated</param> /// <param name="expectedJson"></param> /// <returns></returns> public bool ValidateJsonCompilesWithSchema(JsonSchema schema, JsonExample inputJson, out ValidationError[] errors, JsonExample expectedJson = null, ValidationOptions options = null) { if (null == schema) throw new ArgumentNullException("schema"); if (null == inputJson) throw new ArgumentNullException("inputJson"); string collectionPropertyName = "value"; if (null != inputJson.Annotation && null != inputJson.Annotation.CollectionPropertyName) { collectionPropertyName = inputJson.Annotation.CollectionPropertyName; } // If we didn't get an options, create a new one with some defaults provided by the annotation options = options ?? new ValidationOptions(); options.AllowTruncatedResponses = (inputJson.Annotation ?? new CodeBlockAnnotation()).TruncatedResult; options.CollectionPropertyName = collectionPropertyName; return schema.ValidateJson(inputJson, out errors, this.registeredSchema, options, expectedJson); }
public void NullPropertyShouldGenerateWarning() { var nullableSchema = this.SchemaForNullTest(expectNulls: false); var exampleObj = new { prop1 = (string)null, prop2 = 12345 }; string json = JsonConvert.SerializeObject(exampleObj); var testExample = new JsonExample(json); ValidationError[] errors; Assert.IsFalse(nullableSchema.ValidateJson(testExample, out errors, new Dictionary<string, JsonSchema>(), new ValidationOptions())); Assert.AreEqual(1, errors.Length); var error = errors.First(); Assert.AreEqual(ValidationErrorCode.NullPropertyValue, error.Code); }
/// <summary> /// Validate the input json against the defined scehma when the instance was created. /// </summary> /// <param name="jsonInput">Input json to validate against schema</param> /// <param name="errors">Array of errors if the validation fails</param> /// <param name="otherSchemas"></param> /// <param name="options"></param> /// <param name="expectedJson"></param> /// <returns>True if validation was successful, otherwise false.</returns> public bool ValidateJson(JsonExample jsonInput, out ValidationError[] errors, Dictionary <string, JsonSchema> otherSchemas, ValidationOptions options, JsonExample expectedJson = null) { JContainer obj; try { var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None, NullValueHandling = NullValueHandling.Include, DefaultValueHandling = DefaultValueHandling.Include }; obj = (JContainer)JsonConvert.DeserializeObject(jsonInput.JsonData, settings); } catch (Exception ex) { errors = new ValidationError[] { new ValidationError(ValidationErrorCode.JsonParserException, null, "Failed to parse json string: {0}. Json: {1}", ex.Message, jsonInput.JsonData) }; return(false); } var annotation = jsonInput.Annotation ?? new CodeBlockAnnotation(); List <ValidationError> detectedErrors = new List <ValidationError>(); bool expectErrorObject = (jsonInput.Annotation != null) && jsonInput.Annotation.ExpectError; // Check for an error response dynamic errorObject = obj["error"]; if (null != errorObject && !expectErrorObject) { string code = errorObject.code; string message = errorObject.message; detectedErrors.Clear(); detectedErrors.Add(new ValidationError(ValidationErrorCode.JsonErrorObject, null, "Error response received. Code: {0}, Message: {1}", code, message)); errors = detectedErrors.ToArray(); return(false); } else if (expectErrorObject && null == errorObject) { detectedErrors.Clear(); detectedErrors.Add(new ValidationError(ValidationErrorCode.JsonErrorObjectExpected, null, "Expected an error object response, but didn't receive one.")); errors = detectedErrors.ToArray(); return(false); } // Check to see if this is a "collection" instance if (null != annotation && annotation.IsCollection) { this.ValidateCollectionObject(obj, annotation, otherSchemas, options.CollectionPropertyName, detectedErrors, options); } // otherwise verify the object matches this schema else { options = options ?? new ValidationOptions(annotation); if (null != expectedJson) { var expectedJsonSchema = new JsonSchema(expectedJson.JsonData, expectedJson.Annotation); options.ExpectedJsonSchema = expectedJsonSchema; options.RequiredPropertyNames = expectedJsonSchema.ExpectedProperties.Keys.ToArray(); } this.ValidateContainerObject(obj, options, otherSchemas, detectedErrors); } errors = detectedErrors.ToArray(); return(detectedErrors.Count == 0); }
/// <summary> /// Validate the input json against the defined scehma when the instance was created. /// </summary> /// <param name="jsonInput">Input json to validate against schema</param> /// <param name="errors">Array of errors if the validation fails</param> /// <param name="otherSchemas"></param> /// <param name="options"></param> /// <param name="expectedJson"></param> /// <returns>True if validation was successful, otherwise false.</returns> public bool ValidateJson(JsonExample jsonInput, out ValidationError[] errors, Dictionary<string, JsonSchema> otherSchemas, ValidationOptions options, JsonExample expectedJson = null) { JContainer obj; try { var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None, NullValueHandling = NullValueHandling.Include, DefaultValueHandling = DefaultValueHandling.Include }; obj = (JContainer)JsonConvert.DeserializeObject(jsonInput.JsonData, settings); } catch (Exception ex) { errors = new ValidationError[] { new ValidationError(ValidationErrorCode.JsonParserException, null, "Failed to parse json string: {0}. Json: {1}", ex.Message, jsonInput.JsonData) }; return false; } var annotation = jsonInput.Annotation ?? new CodeBlockAnnotation(); List<ValidationError> detectedErrors = new List<ValidationError>(); bool expectErrorObject = (jsonInput.Annotation != null) && jsonInput.Annotation.ExpectError; // Check for an error response dynamic errorObject = obj["error"]; if (null != errorObject && !expectErrorObject) { string code = errorObject.code; string message = errorObject.message; detectedErrors.Clear(); detectedErrors.Add(new ValidationError(ValidationErrorCode.JsonErrorObject, null, "Error response received. Code: {0}, Message: {1}", code, message)); errors = detectedErrors.ToArray(); return false; } else if (expectErrorObject && null == errorObject) { detectedErrors.Clear(); detectedErrors.Add(new ValidationError(ValidationErrorCode.JsonErrorObjectExpected, null, "Expected an error object response, but didn't receive one.")); errors = detectedErrors.ToArray(); return false; } // Check to see if this is a "collection" instance if (null != annotation && annotation.IsCollection) { this.ValidateCollectionObject(obj, annotation, otherSchemas, options.CollectionPropertyName, detectedErrors); } // otherwise verify the object matches this schema else { options = options ?? new ValidationOptions(annotation); if (null != expectedJson) { var expectedJsonSchema = new JsonSchema(expectedJson.JsonData, expectedJson.Annotation); options.ExpectedJsonSchema = expectedJsonSchema; options.RequiredPropertyNames = expectedJsonSchema.ExpectedProperties.Keys.ToArray(); } this.ValidateContainerObject(obj, options, otherSchemas, detectedErrors); } errors = detectedErrors.ToArray(); return detectedErrors.Count == 0; }
/// <summary> /// Checks that the expected response of a method definition is valid with this resource. /// </summary> /// <param name="method"></param> /// <param name="errors"></param> /// <returns></returns> public bool ValidateExpectedResponse(MethodDefinition method, out ValidationError[] errors) { HttpParser parser = new HttpParser(); var response = parser.ParseHttpResponse(method.ExpectedResponse); JsonExample example = new JsonExample(response.Body, method.ExpectedResponseMetadata); var otherSchemas = new Dictionary<string, JsonSchema>(); return this.ValidateJson(example, out errors, otherSchemas, null); }