Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 12
0
        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);
        }
Esempio n. 14
0
        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);
        }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
        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);
        }