/// <summary>Creates a Swagger specification from a JSON string.</summary> /// <param name="data">The JSON data.</param> /// <param name="documentPath">The document path (URL or file path) for resolving relative document references.</param> /// <param name="expectedSchemaType">The expected schema type which is used when the type cannot be determined.</param> /// <returns>The <see cref="SwaggerDocument"/>.</returns> public static async Task <SwaggerDocument> FromJsonAsync(string data, string documentPath = null, SchemaType expectedSchemaType = SchemaType.Swagger2) { if (data.Contains(@"""swagger"": ""2")) { expectedSchemaType = SchemaType.Swagger2; } else if (data.Contains(@"""openapi"": ""3")) { expectedSchemaType = SchemaType.OpenApi3; } else if (expectedSchemaType == SchemaType.JsonSchema) { throw new NotSupportedException("The schema type JsonSchema is not supported."); } data = JsonSchemaReferenceUtilities.ConvertJsonReferences(data); var contractResolver = CreateJsonSerializerContractResolver(expectedSchemaType); var document = JsonConvert.DeserializeObject <SwaggerDocument>(data, new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore, ConstructorHandling = ConstructorHandling.Default, ReferenceLoopHandling = ReferenceLoopHandling.Serialize, PreserveReferencesHandling = PreserveReferencesHandling.Objects, ContractResolver = contractResolver }); document.DocumentPath = documentPath; var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); var referenceResolver = new JsonReferenceResolver(schemaResolver); await JsonSchemaReferenceUtilities.UpdateSchemaReferencesAsync(document, referenceResolver).ConfigureAwait(false); return(document); }
public async Task When_inheritance_with_object_without_props_is_generated_then_all_classes_exist_and_additional_properties_property_is_not_generated() { // Arrange var json = @"{ ""type"": ""object"", ""properties"": { ""Exception"": { ""$ref"": ""#/definitions/BusinessException"" } }, ""additionalProperties"": false, ""definitions"": { ""BusinessException"": { ""type"": ""object"", ""additionalProperties"": false, ""properties"": { ""customerId"": { ""type"": ""string"", ""nullable"": true }, ""customerAlias"": { ""type"": ""string"", ""nullable"": true }, ""userId"": { ""type"": ""string"", ""nullable"": true } } }, ""ValidationException"": { ""allOf"": [ { ""$ref"": ""#/definitions/BusinessException"" }, { ""type"": ""object"", ""additionalProperties"": false } ] } } }"; var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var schema = await JsonSchemaSerialization.FromJsonAsync(json, SchemaType.OpenApi3, null, factory, new DefaultContractResolver()); // Act var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings { SchemaType = SchemaType.OpenApi3 }); var code = generator.GenerateFile("MyClass"); //// Act Assert.Contains("class BusinessException", code); Assert.Contains("class ValidationException", code); Assert.DoesNotContain("AdditionalProperties", code); }
public async Task When_schema_JSON_is_deserialized_then_AllowAdditionalProperties_is_correct(SchemaType schemaType, string json, bool expectedAllowAdditionalProperties) { //// Act var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var schema = await JsonSchemaSerialization.FromJsonAsync(json, schemaType, null, factory, new DefaultContractResolver()); //// Assert Assert.Equal(expectedAllowAdditionalProperties, schema.AllowAdditionalProperties); }
public void When_AllowAdditionalProperties_is_true_then_JSON_is_correct(SchemaType schemaType, bool allowAdditionalProperties, string expectedJson) { //// Act var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var json = JsonSchemaSerialization.ToJson(new JsonSchema { AllowAdditionalProperties = allowAdditionalProperties }, schemaType, new DefaultContractResolver(), Formatting.None); //// Assert Assert.Equal(expectedJson, json); }
public void When_default_schema_is_serialized_then_AllowAdditionalProperties_is_correct(SchemaType schemaType, string expectedJson) { // default schema (new JsonSchema) has always AllowAdditionalProperties = true //// Act var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var json = JsonSchemaSerialization.ToJson(new JsonSchema(), schemaType, new DefaultContractResolver(), Formatting.None); //// Assert Assert.Equal(expectedJson, json); }
public async Task When_object_is_root_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema(); //// Act var resolver = new JsonReferenceResolver(null); var foundObject = await resolver.ResolveReferenceAsync(objectToSearch, "#"); //// Assert Assert.Equal(foundObject, objectToSearch); }
public void When_object_is_root_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema4(); //// Act var resolver = new JsonReferenceResolver(); var foundObject = resolver.ResolveReference(objectToSearch, "#"); //// Assert Assert.AreEqual(foundObject, objectToSearch); }
/// <summary>Creates a Swagger specification from a JSON string.</summary> /// <param name="data">The JSON data.</param> /// <param name="documentPath">The document path (URL or file path) for resolving relative document references.</param> /// <returns>The <see cref="SwaggerDocument"/>.</returns> public static async Task <SwaggerDocument> FromJsonAsync(string data, string documentPath = null) { data = JsonSchemaReferenceUtilities.ConvertJsonReferences(data); var document = JsonConvert.DeserializeObject <SwaggerDocument>(data, new JsonSerializerSettings { ConstructorHandling = ConstructorHandling.Default, ReferenceLoopHandling = ReferenceLoopHandling.Serialize, PreserveReferencesHandling = PreserveReferencesHandling.Objects }); document.DocumentPath = documentPath; var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); var referenceResolver = new JsonReferenceResolver(schemaResolver); await JsonSchemaReferenceUtilities.UpdateSchemaReferencesAsync(document, referenceResolver).ConfigureAwait(false); return(document); }
public async Task When_date_reference_is_generated_from_swagger2_schema_then_generated_member_is_decorated_with_date_format_attribute() { // Arrange var json = @"{ ""type"": ""object"", ""properties"": { ""MyType"": { ""$ref"": ""#/definitions/MyType"" } }, ""additionalProperties"": false, ""definitions"": { ""MyType"": { ""type"": ""object"", ""required"": [ ""EntryDate"", ], ""properties"": { ""EntryDate"": { ""$ref"": ""#/definitions/EntryDate"" } } }, ""EntryDate"": { ""example"": ""2020-08-28"", ""type"": ""string"", ""format"": ""date"" } } }"; var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var schema = await JsonSchemaSerialization.FromJsonAsync(json, SchemaType.Swagger2, null, factory, new DefaultContractResolver()); // Act var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings { SchemaType = SchemaType.Swagger2 }); var code = generator.GenerateFile("MyClass"); //// Act Assert.Contains("[Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]", code); }
public async Task When_object_is_in_property_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema(); var obj = new { Property = new { Property1 = new { }, Property2 = objectToSearch } }; //// Act var resolver = new JsonReferenceResolver(null); var foundObject = await resolver.ResolveReferenceAsync(obj, "#/Property/Property2"); //// Assert Assert.Equal(foundObject, objectToSearch); }
public void When_object_is_in_property_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema4(); var obj = new { Property = new { Property1 = new { }, Property2 = objectToSearch } }; //// Act var resolver = new JsonReferenceResolver(); var foundObject = resolver.ResolveReference(obj, "#/Property/Property2"); //// Assert Assert.AreEqual(foundObject, objectToSearch); }
public async Task When_reference_is_registered_in_custom_resolver_it_should_not_try_to_access_file() { //// Arrange var externalSchema = await JsonSchema.FromJsonAsync( @"{ ""type"": ""object"", ""properties"": { ""foo"": { ""type"": ""string"" } } }"); Func <JsonSchema, JsonReferenceResolver> factory = schema4 => { var schemaResolver = new JsonSchemaResolver(schema4, new JsonSchemaGeneratorSettings()); var resolver = new JsonReferenceResolver(schemaResolver); resolver.AddDocumentReference("../dir/external.json", externalSchema); return(resolver); }; string schemaJson = @"{ ""$schema"": ""http://json-schema.org/draft-07/schema#"", ""type"": ""object"", ""properties"": { ""title"": { ""$ref"": ""../dir/external.json#"" } } }"; //// Act var schema = await JsonSchema.FromJsonAsync(schemaJson, ".", factory); //// Assert Assert.NotNull(schema); }
public void When_object_is_in_dictionary_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema4(); var obj = new { Property = new { List = new Dictionary <string, object> { { "Test1", new { } }, { "Test2", new { } }, { "Test3", objectToSearch }, } } }; //// Act var resolver = new JsonReferenceResolver(); var foundObject = resolver.ResolveReference(obj, "#/Property/List/Test3"); //// Assert Assert.AreEqual(foundObject, objectToSearch); }
public async Task When_object_is_in_list_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema4(); var obj = new { Property = new { List = new List <object> { new { }, new { }, objectToSearch } } }; //// Act var resolver = new JsonReferenceResolver(null); var foundObject = await resolver.ResolveReferenceAsync(obj, "#/Property/List/2"); //// Assert Assert.AreEqual(foundObject, objectToSearch); }
public async Task When_object_is_in_dictionary_then_path_should_be_built_correctly() { //// Arrange var objectToSearch = new JsonSchema(); var obj = new { Property = new { List = new Dictionary <string, object> { { "Test1", new { } }, { "Test2", new { } }, { "Test3", objectToSearch }, } } }; //// Act var resolver = new JsonReferenceResolver(null); var foundObject = await resolver.ResolveReferenceAsync(obj, "#/Property/List/Test3", typeof(JsonSchema), new DefaultContractResolver()); //// Assert Assert.Equal(foundObject, objectToSearch); }
public async Task When_schema_with_inheritance_to_object_type_is_generated_then_the_object_type_is_generated(SchemaType schemaType) { var json = @"{ ""type"": ""object"", ""properties"": { ""request1"": { ""$ref"": ""#/definitions/GenericRequest1"" }, ""request2"": { ""$ref"": ""#/definitions/GenericRequest2"" } }, ""definitions"": { ""GenericRequest1"": { ""allOf"": [ { ""$ref"": ""#/definitions/GenericRequestBaseOfRequestBodyBase"" }, { ""type"": ""object"" } ] }, ""GenericRequestBaseOfRequestBodyBase"": { ""type"": ""object"", ""required"": [ ""Request"" ], ""properties"": { ""Request"": { ""$ref"": ""#/definitions/RequestBodyBase"" } } }, ""RequestBodyBase"": { ""type"": ""object"" }, ""GenericRequest2"": { ""allOf"": [ { ""$ref"": ""#/definitions/GenericRequestBaseOfRequestBody"" }, { ""type"": ""object"" } ] }, ""GenericRequestBaseOfRequestBody"": { ""type"": ""object"", ""required"": [ ""Request"" ], ""properties"": { ""Request"": { ""$ref"": ""#/definitions/RequestBody"" } } }, ""RequestBody"": { ""allOf"": [ { ""$ref"": ""#/definitions/RequestBodyBase"" }, { ""type"": ""object"" } ] } } }"; var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var schema = await JsonSchemaSerialization.FromJsonAsync(json, schemaType, null, factory, new DefaultContractResolver()); var generator = new TypeScriptGenerator(schema, new TypeScriptGeneratorSettings { TypeScriptVersion = 2.0m, SchemaType = schemaType }); //// Act var code = generator.GenerateFile(); //// Assert Assert.DoesNotContain("request!: any;", code); Assert.DoesNotContain("request: any;", code); Assert.Contains("this.request = new RequestBodyBase()", code); Assert.Contains("this.request = new RequestBody()", code); }
public async Task When_schema_with_inheritance_and_references_is_generated_then_there_are_no_duplicates(SchemaType schemaType) { var json = @" { ""type"": ""object"", ""properties"": { ""foo"": { ""$ref"": ""#/definitions/Teacher"" } }, ""definitions"": { ""Person"": { ""type"": ""object"", ""discriminator"": ""discriminator"", ""required"": [ ""discriminator"" ], ""properties"": { ""Skills"": { ""type"": ""object"", ""additionalProperties"": { ""$ref"": ""#/definitions/SkillLevel"" } }, ""discriminator"": { ""type"": ""string"" } } }, ""SkillLevel"": { ""type"": ""integer"", ""description"": """", ""x-enumNames"": [ ""Low"", ""Medium"", ""Height"" ], ""enum"": [ 0, 1, 2 ] }, ""Teacher"": { ""allOf"": [ { ""$ref"": ""#/definitions/Person"" }, { ""type"": ""object"", ""required"": [ ""SkillLevel"" ], ""properties"": { ""Course"": { ""type"": ""string"" }, ""SkillLevel"": { ""default"": 1, ""allOf"": [ { ""$ref"": ""#/definitions/SkillLevel"" } ] } } } ] } } } "; var factory = JsonReferenceResolver.CreateJsonReferenceResolverFactory(new DefaultTypeNameGenerator()); var schema = await JsonSchemaSerialization.FromJsonAsync(json, schemaType, null, factory, new DefaultContractResolver()); var generator = new TypeScriptGenerator(schema, new TypeScriptGeneratorSettings { TypeScriptVersion = 2.0m, SchemaType = schemaType }); //// Act var code = generator.GenerateFile(); //// Assert Assert.DoesNotContain("SkillLevel2", code); }