Example #1
0
        public void TestInputMapping()
        {
            var input   = Path.Combine(Core.Utilities.Extensions.CodeBaseDirectory(typeof(MappingExtensionsTests)), "Resource", "swagger-payload-flatten.json");
            var modeler = new SwaggerModeler(new Settings {
                PayloadFlatteningThreshold = 3
            });
            var clientModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));
            var plugin      = new PluginCs();

            using (plugin.Activate())
            {
                clientModel = plugin.Serializer.Load(clientModel);
                clientModel = plugin.Transformer.TransformCodeModel(clientModel);
                CodeGeneratorCs generator = new CodeGeneratorCs();

                generator.Generate(clientModel).GetAwaiter().GetResult();
                string body = Settings.Instance.FileSystemOutput.ReadAllText(Path.Combine("Payload.cs"));
                Assert.True(body.ContainsMultiline(@"
                    MinProduct minProduct = new MinProduct();
                    if (baseProductId != null || baseProductDescription != null || maxProductReference != null)
                    {
                        minProduct.BaseProductId = baseProductId;
                        minProduct.BaseProductDescription = baseProductDescription;
                        minProduct.MaxProductReference = maxProductReference;
                    }"));
            }
        }
Example #2
0
        public void TestcodeModelWithResponseHeaders()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-response-headers.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            var methods = codeModel.Methods.ToList();

            Assert.Equal(2, methods.Count);
            Assert.Equal(2, methods[0].Responses.Count);
            Assert.Equal("ListHeaders", methods[0].Responses[HttpStatusCode.OK].Headers.Name);
            Assert.Equal(3, ((CompositeType)methods[0].Responses[HttpStatusCode.OK].Headers).Properties.Count);
            Assert.Equal("ListHeaders", methods[0].Responses[HttpStatusCode.Created].Headers.Name);
            Assert.Equal(3, ((CompositeType)methods[0].Responses[HttpStatusCode.Created].Headers).Properties.Count);
            Assert.Equal("ListHeaders", methods[0].ReturnType.Headers.Name);
            Assert.Equal(3, ((CompositeType)methods[0].ReturnType.Headers).Properties.Count);

            Assert.Equal(1, methods[1].Responses.Count);
            Assert.Equal("CreateHeaders", methods[1].Responses[HttpStatusCode.OK].Headers.Name);
            Assert.Equal(3, ((CompositeType)methods[1].Responses[HttpStatusCode.OK].Headers).Properties.Count);
            Assert.Equal("CreateHeaders", methods[1].ReturnType.Headers.Name);
            Assert.Equal(3, ((CompositeType)methods[1].ReturnType.Headers).Properties.Count);
            Assert.True(codeModel.HeaderTypes.Any(c => c.Name == "ListHeaders"));
            Assert.True(codeModel.HeaderTypes.Any(c => c.Name == "CreateHeaders"));
        }
Example #3
0
        public void TestcodeModelFromSimpleSwagger()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-simple-spec.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            var description =
                "The Products endpoint returns information about the Uber products offered at a given location. The response includes the display name and other details about each product, and lists the products in the proper display order.";
            var summary = "Product Types";

            Assert.NotNull(codeModel);
            Assert.Equal(2, codeModel.Properties.Count);
            Assert.True(
                codeModel.Properties.Any(p => p.Name.EqualsIgnoreCase("subscriptionId")));
            Assert.True(
                codeModel.Properties.Any(p => p.Name.EqualsIgnoreCase("apiVersion")));
            Assert.Equal("2014-04-01-preview", codeModel.ApiVersion);
            Assert.Equal("https://management.azure.com", codeModel.BaseUrl);
            Assert.Equal("Some cool documentation.", codeModel.Documentation);
            //var allMethods = codeModel.Operations.SelectMany(each => each.Methods);
            var methods = codeModel.Methods.ToList();

            Assert.Equal(2, methods.Count);
            Assert.Equal("List", methods[0].Name);
            Assert.NotEmpty(methods[0].Description);
            Assert.Equal(description, methods[0].Description);
            Assert.NotEmpty(methods[0].Summary);
            Assert.Equal(summary, methods[0].Summary);
            Assert.Equal(HttpMethod.Get, methods[0].HttpMethod);
            Assert.Equal(3, methods[0].Parameters.Count);
            Assert.Equal("subscriptionId", methods[0].Parameters[0].Name);
            Assert.NotNull(methods[0].Parameters[0].ClientProperty);
            Assert.Equal("resourceGroupName", methods[0].Parameters[1].Name);
            Assert.Equal("resourceGroupName", methods[0].Parameters[1].SerializedName);
            Assert.Equal("Resource Group ID.", methods[0].Parameters[1].Documentation);
            Assert.Equal(true, methods[0].Parameters[0].IsRequired);
            Assert.Equal(ParameterLocation.Path, methods[0].Parameters[0].Location);
            Assert.Equal("String", methods[0].Parameters[0].ModelType.Name);
            Assert.Equal("Reset", methods[1].Name);
            Assert.Equal("Product", codeModel.ModelTypes.First(m => m.Name == "Product").Name);
            Assert.Equal("Product", codeModel.ModelTypes.First(m => m.Name == "Product").SerializedName);
            Assert.Equal("The product title.", codeModel.ModelTypes.First(m => m.Name == "Product").Summary);
            Assert.Equal("The product documentation.",
                         codeModel.ModelTypes.First(m => m.Name == "Product").Documentation);
            Assert.Equal("A product id.",
                         codeModel.ModelTypes.First(m => m.Name == "Product").Properties[0].Summary);
            Assert.Equal("ProductId", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[0].Name);
            Assert.Equal("product_id",
                         codeModel.ModelTypes.First(m => m.Name == "Product").Properties[0].SerializedName);
            Assert.Null(methods[1].ReturnType.Body);
            Assert.Null(methods[1].Responses[HttpStatusCode.NoContent].Body);
            Assert.Equal(3, methods[1].Parameters.Count);
            Assert.Equal("subscriptionId", methods[1].Parameters[0].Name);
            Assert.Null(methods[1].Parameters[0].ClientProperty);
            Assert.Equal("resourceGroupName", methods[1].Parameters[1].Name);
            Assert.Equal("apiVersion", methods[1].Parameters[2].Name);

            Assert.Equal("Capacity", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[3].Name);
            Assert.Equal("100", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[3].DefaultValue);
        }
Example #4
0
        public void TestcodeModelWithStreamAndByteArray()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-streaming.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            var methods = codeModel.Methods.ToList();

            Assert.Equal("GetWithStreamFormData", methods[0].Name);
            Assert.Equal("Stream", methods[0].Parameters[0].ModelType.Name);
            Assert.Equal("Stream", CreateCSharpResponseType(methods[0].ReturnType));
            Assert.Equal("Stream", CreateCSharpResponseType(methods[0].Responses[HttpStatusCode.OK]));

            Assert.Equal("PostWithByteArrayFormData", methods[1].Name);
            Assert.Equal("ByteArray", methods[1].Parameters[0].ModelType.Name);
            Assert.Equal("ByteArray", CreateCSharpResponseType(methods[1].ReturnType));
            Assert.Equal("ByteArray", CreateCSharpResponseType(methods[1].Responses[HttpStatusCode.OK]));

            Assert.Equal("GetWithStream", methods[2].Name);
            Assert.Equal("Stream", CreateCSharpResponseType(methods[2].ReturnType));
            Assert.Equal("Stream", CreateCSharpResponseType(methods[2].Responses[HttpStatusCode.OK]));

            Assert.Equal("PostWithByteArray", methods[3].Name);
            Assert.Equal("ByteArray", CreateCSharpResponseType(methods[3].ReturnType));
            Assert.Equal("ByteArray", CreateCSharpResponseType(methods[3].Responses[HttpStatusCode.OK]));
        }
        private IEnumerable <ValidationMessage> ValidateOpenAPISpec(string input, ServiceDefinitionMetadata metadata)
        {
            var validator         = new RecursiveObjectValidator(PropertyNameResolver.JsonName);
            var serviceDefinition = SwaggerParser.Parse(input, File.ReadAllText(input));

            return(validator.GetValidationExceptions(new Uri(input, UriKind.RelativeOrAbsolute), serviceDefinition, metadata).OfType <ValidationMessage>());
        }
Example #6
0
        public void TestYamlParsing()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-simple-spec.yaml");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
        }
Example #7
0
        public void ParseSecurityDefinitionType()
        {
            var swaggerContent = File.ReadAllText(@"Resource\SerializationTests\SerializationTests.json");
            var definition     = SwaggerParser.Parse(swaggerContent);

            Assert.Equal(SecuritySchemeType.OAuth2, definition.SecurityDefinitions["petstore_auth"].SecuritySchemeType);
            Assert.Equal(SecuritySchemeType.ApiKey, definition.SecurityDefinitions["api_key"].SecuritySchemeType);
        }
Example #8
0
        public void TestCompositeConstants()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-composite-constants.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.Equal(false, codeModel.ModelTypes.First(m => m.Name == "NetworkInterfaceIPConfigurationPropertiesFormat").ContainsConstantProperties);
            Assert.Equal(false, codeModel.ModelTypes.First(m => m.Name == "IPConfigurationPropertiesFormat").ContainsConstantProperties);
        }
        public void GlobalResponsesReference()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-global-responses.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.Equal(1, codeModel.Methods[0].Responses.Count);
            Assert.NotNull(codeModel.Methods[0].Responses[HttpStatusCode.OK]);
        }
Example #10
0
        public void TestCustomPaths()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-x-ms-paths.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal(3, codeModel.Methods.Count());
            Assert.True(codeModel.Methods.All(m => m.Url == "/values/foo"));
        }
Example #11
0
        public void DefaultReturnsCorrectType()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-multiple-response-schemas.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            var retType = codeModel.Methods.First(m => m.Name == "PatchDefaultResponse");

            Assert.Equal("Pet", CreateCSharpResponseType(retType.ReturnType));
        }
        public void TestcodeModelWithMethodGroups()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-optional-params.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal(0, codeModel.Methods.Count(m => m.Group == null));
            Assert.Equal(2, codeModel.Methods.Count(m => m.Group == "Widgets"));
            Assert.Equal("List", codeModel.Methods[0].Name);
        }
        public void GenerateCodeModel()
        {
            var input     = Path.Combine(CodeBaseDirectory, "..", "..", "..", "Resource", "Swagger", "deprecated.yaml");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            var output = Path.Combine(CodeBaseDirectory, "..", "..", "..", "Expected", "deprecated", "deprecated.json");

            Directory.CreateDirectory(Path.GetDirectoryName(output));
            File.WriteAllText(output, JsonConvert.SerializeObject(codeModel, Formatting.Indented));
        }
        public void AllowVendorExtensionInPath()
        {
            var input       = Path.Combine("Resource", "Swagger", "vendor-extension-in-path.json");
            var modeler     = new SwaggerModeler();
            var clientModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            // should return a valid model.
            Assert.NotNull(clientModel);

            // there should be one method in this generated api.
            Assert.Equal(1, modeler.CodeModel.Methods.Count);
        }
        public void TestRealPathRegular()
        {
            var input     = Path.Combine("Resource", "Swagger", "swagger-xml.yaml");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            foreach (var property in codeModel.ModelTypes.SelectMany(m => m.Properties))
            {
                Assert.Equal(property.Name, string.Join(".", property.RealPath));
                Assert.Equal(property.XmlName, string.Join(".", property.RealXmlPath));
            }
        }
Example #16
0
        public void TestcodeModelWithRecursiveTypes()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-recursive-type.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal("Product", codeModel.ModelTypes.First(m => m.Name == "Product").Name);
            Assert.Equal("ProductId", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[0].Name);
            Assert.Equal("String",
                         codeModel.ModelTypes.First(m => m.Name == "Product").Properties[0].ModelType.Name);
        }
 private IEnumerable <ValidationMessage> ValidateSwagger(string input, ServiceDefinitionMetadata metadata)
 {
     // Most rules are to be applied for ARM documents
     // Also, most rules need to be run over the composite document (i.e. AFTER merge state)
     // hence the defaults
     using (NewContext)
     {
         var validator         = new RecursiveObjectValidator(PropertyNameResolver.JsonName);
         var serviceDefinition = SwaggerParser.Parse(input, File.ReadAllText(input));
         return(validator.GetValidationExceptions(new Uri(input, UriKind.RelativeOrAbsolute), serviceDefinition, metadata).OfType <ValidationMessage>());
     }
 }
        public void TestcodeModelWithNoContent()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-no-content.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.Equal("DeleteBlob", codeModel.Methods[4].Name);
            Assert.True(codeModel.Methods[4].ReturnType.Body.IsPrimaryType(KnownPrimaryType.Object));
            Assert.True(
                codeModel.Methods[4].Responses[HttpStatusCode.OK].Body.IsPrimaryType(KnownPrimaryType.Object));
            Assert.Null(codeModel.Methods[4].Responses[HttpStatusCode.BadRequest].Body);
        }
Example #19
0
        public void TestConstants()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-validation.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            var methods = codeModel.Methods.ToList();

            Assert.Equal("myintconst", methods[0].Parameters[4].Name);
            Assert.Equal(true, methods[0].Parameters[4].ModelType.IsPrimaryType(KnownPrimaryType.Int));
            Assert.Equal(true, methods[0].Parameters[4].IsConstant);
            Assert.Equal("0", methods[0].Parameters[4].DefaultValue);

            Assert.Equal("mystrconst", methods[0].Parameters[5].Name);
            Assert.Equal(true, methods[0].Parameters[5].ModelType.IsPrimaryType(KnownPrimaryType.String));
            Assert.Equal(true, methods[0].Parameters[5].IsConstant);
            Assert.Equal("constant", methods[0].Parameters[5].DefaultValue);

            Assert.Equal("Myintconst", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[5].Name);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[5].ModelType.IsPrimaryType(KnownPrimaryType.Int));
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[5].IsConstant);
            Assert.Equal("0", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[5].DefaultValue);

            Assert.Equal("Mystrconst", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[6].Name);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[6].ModelType.IsPrimaryType(KnownPrimaryType.String));
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[6].IsConstant);
            Assert.Equal("constant", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[6].DefaultValue);

            Assert.Equal("RefStrEnumRequiredConstant", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[7].Name);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[7].ModelType.IsPrimaryType(KnownPrimaryType.String));
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[7].IsConstant);
            Assert.Equal("ReferenceEnum1", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[7].DefaultValue);

            Assert.Equal("RefIntEnumRequiredConstant", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[8].Name);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[8].ModelType.IsPrimaryType(KnownPrimaryType.Int));
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[8].IsConstant);
            Assert.Equal("0", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[8].DefaultValue);

            Assert.Equal("RefStrEnum", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[9].Name);
            Assert.Equal("enum", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[9].ModelType.Name);
            Assert.Equal(false, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[9].IsConstant);
            Assert.True(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[9].DefaultValue.IsNullOrEmpty());

            Assert.Equal("RefIntEnum", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[10].Name);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[10].ModelType.IsPrimaryType(KnownPrimaryType.Int));
            Assert.Equal(false, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[10].IsConstant);
            Assert.True(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[10].DefaultValue.IsNullOrEmpty());

            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Product").ContainsConstantProperties);
            Assert.Equal(false, codeModel.ModelTypes.First(m => m.Name == "Error").ContainsConstantProperties);
        }
        public void TestNameOverrideRules()
        {
            var input     = Path.Combine("Resource", "Swagger", "swagger-xml.yaml");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            foreach (var modelType in codeModel.ModelTypes)
            {
                Assert.Equal(modelType.Documentation, modelType.XmlName);
                foreach (var property in codeModel.Properties)
                {
                    Assert.Equal(property.Documentation, property.XmlName);
                }
            }
        }
Example #21
0
        public void TestcodeModelWithInheritance()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-allOf.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal("Pet", codeModel.ModelTypes.First(m => m.Name == "Pet").Name);
            Assert.Equal("Cat", codeModel.ModelTypes.First(m => m.Name == "Cat").Name);
            Assert.Equal("Pet", codeModel.ModelTypes.First(m => m.Name == "Cat").BaseModelType.Name);
            Assert.Equal("Breed", codeModel.ModelTypes.First(m => m.Name == "Cat").Properties[0].Name);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Cat").Properties[0].IsRequired);
            Assert.Equal("Color", codeModel.ModelTypes.First(m => m.Name == "Cat").Properties[1].Name);
            Assert.Equal("Siamese", codeModel.ModelTypes.First(m => m.Name == "Siamese").Name);
            Assert.Equal("Cat", codeModel.ModelTypes.First(m => m.Name == "Siamese").BaseModelType.Name);
        }
Example #22
0
        public void TestcodeModelWithXmsDiscriminatorValue()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-x-ms-discriminator-value.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal("Pet", codeModel.ModelTypes.First(m => m.Name == "Pet").Name);
            Assert.Equal("Microsoft.Models.MSPet", codeModel.ModelTypes.First(m => m.Name == "Pet").Extensions["x-ms-discriminator-value"]);
            Assert.Equal("type", codeModel.ModelTypes.First(m => m.Name == "Pet").PolymorphicDiscriminator);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Pet").IsPolymorphic);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Pet").BaseIsPolymorphic);
            Assert.Equal("Cat", codeModel.ModelTypes.First(m => m.Name == "Cat").Name);
            Assert.Equal("Microsoft.Models.MSCat", codeModel.ModelTypes.First(m => m.Name == "Cat").Extensions["x-ms-discriminator-value"]);
            Assert.Equal(true, codeModel.ModelTypes.First(m => m.Name == "Cat").BaseIsPolymorphic);
            Assert.Equal("Pet", codeModel.ModelTypes.First(m => m.Name == "Cat").BaseModelType.Name);
        }
Example #23
0
        public void TestcodeModelPolymorhism()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-polymorphism.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal("Pet", codeModel.ModelTypes.First(m => m.Name == "Pet").Name);
            Assert.Equal("dtype", codeModel.ModelTypes.First(m => m.Name == "Pet").PolymorphicDiscriminator);
            Assert.Equal(2, codeModel.ModelTypes.First(m => m.Name == "Pet").Properties.Count);
            Assert.Equal("Id", codeModel.ModelTypes.First(m => m.Name == "Pet").Properties[0].Name);
            Assert.Equal("Description", codeModel.ModelTypes.First(m => m.Name == "Pet").Properties[1].Name);
            Assert.Equal("Cat", codeModel.ModelTypes.First(m => m.Name == "Cat").Name);
            Assert.Equal("Pet", codeModel.ModelTypes.First(m => m.Name == "Cat").BaseModelType.Name);
            Assert.Equal(1, codeModel.ModelTypes.First(m => m.Name == "Cat").Properties.Count);
            Assert.Equal("Lizard", codeModel.ModelTypes.First(m => m.Name == "Lizard").Name);
            Assert.Equal("lzd", codeModel.ModelTypes.First(m => m.Name == "Lizard").SerializedName);
        }
        internal static MemoryFileSystem GenerateCodeInto(this string testName, MemoryFileSystem inputFileSystem, Settings settings, IAnyPlugin plugin = null)
        {
            plugin = plugin ?? new PluginCs();
            Settings.Instance.FileSystemInput = inputFileSystem;
            // copy the whole input directory into the memoryfilesystem.
            inputFileSystem.CopyFolder("Resource", testName, "");

            // find the appropriately named .yaml or .json file for the swagger.
            foreach (var ext in new[] { ".yaml", ".json", ".md" })
            {
                var name = testName + ext;
                if (inputFileSystem.FileExists(name))
                {
                    settings.Input = name;
                }
            }

            if (string.IsNullOrWhiteSpace(settings.Input))
            {
                throw new Exception($"Can't find swagger file ${testName} [.yaml] [.json] [.md]");
            }

            var modeler   = new SwaggerModeler(Settings.Instance);
            var swagger   = SwaggerParser.Parse(inputFileSystem.ReadAllText(Settings.Instance.Input));
            var codeModel = modeler.Build(swagger);

            using (plugin.Activate())
            {
                // load model into language-specific code model
                codeModel = plugin.Serializer.Load(codeModel);

                // apply language-specific tranformation (more than just language-specific types)
                // used to be called "NormalizeClientModel" .
                codeModel = plugin.Transformer.TransformCodeModel(codeModel);

                // Generate code from CodeModel.
                plugin.CodeGenerator.Generate(codeModel).GetAwaiter().GetResult();

                return(settings.FileSystemOutput);
            }
        }
        public void ConvertsPageResultsToPageTypeTest()
        {
            using (NewContext)
            {
                var input     = Path.Combine(Core.Utilities.Extensions.CodeBaseDirectory(typeof(CSharpAzureCodeNamingFrameworkTests)), "Resource", "azure-paging.json");
                var modeler   = new SwaggerModeler();
                var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));
                var plugin    = new AutoRest.CSharp.Azure.PluginCsa();
                using (plugin.Activate()) {
                    codeModel = plugin.Serializer.Load(codeModel);
                    codeModel = plugin.Transformer.TransformCodeModel(codeModel);

                    var methods = codeModel.Methods.ToList();
                    Assert.Equal(7, methods.Count);
                    Assert.Equal(1, methods.Count(m => m.Name == "GetSinglePage"));
                    Assert.Equal(0, methods.Count(m => m.Name == "GetSinglePageNext"));
                    Assert.Equal(1, methods.Count(m => m.Name == "PutSinglePage"));
                    Assert.Equal(1, methods.Count(m => m.Name == "PutSinglePageSpecialNext"));

                    Assert.Equal("Page<Product>", methods[0].ReturnType.Body.Name);
                    Assert.Equal("object", methods[1].ReturnType.Body.Name.ToLowerInvariant());
                    Assert.Equal("Page1<Product>", methods[1].Responses.ElementAt(0).Value.Body.Name);
                    Assert.Equal("string",
                                 methods[1].Responses.ElementAt(1).Value.Body.Name.ToLowerInvariant());
                    Assert.Equal("object", methods[2].ReturnType.Body.Name.ToLowerInvariant());
                    Assert.Equal("Page1<Product>", methods[2].Responses.ElementAt(0).Value.Body.Name);
                    Assert.Equal("Page1<Product>", methods[2].Responses.ElementAt(1).Value.Body.Name);
                    Assert.Equal("object", methods[3].ReturnType.Body.Name.ToLowerInvariant());
                    Assert.Equal("Page1<Product>", methods[3].Responses.ElementAt(0).Value.Body.Name);
                    Assert.Equal("Page1<ProductChild>", methods[3].Responses.ElementAt(1).Value.Body.Name);
                    Assert.Equal(5, codeModel.ModelTypes.Count);
                    Assert.False(
                        codeModel.ModelTypes.Any(t => t.Name.EqualsIgnoreCase("ProducResult")));
                    Assert.False(
                        codeModel.ModelTypes.Any(t => t.Name.EqualsIgnoreCase("ProducResult2")));
                    Assert.False(
                        codeModel.ModelTypes.Any(t => t.Name.EqualsIgnoreCase("ProducResult3")));
                }
            }
        }
        public void TestcodeModelWithDifferentReturnsTypesBasedOnStatusCode()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-multiple-response-schemas.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal("GetSameResponse", codeModel.Methods[0].Name);
            Assert.Equal("IList<Pet>", CreateCSharpResponseType(codeModel.Methods[0].ReturnType));
            Assert.Equal("IList<Pet>", CreateCSharpResponseType(codeModel.Methods[0].Responses[HttpStatusCode.OK]));
            Assert.Equal("IList<Pet>", CreateCSharpResponseType(codeModel.Methods[0].Responses[HttpStatusCode.Accepted]));

            Assert.Equal("PostInheretedTypes", codeModel.Methods[1].Name);
            Assert.Equal("Pet", CreateCSharpResponseType(codeModel.Methods[1].ReturnType));
            Assert.Equal("Dog", CreateCSharpResponseType(codeModel.Methods[1].Responses[HttpStatusCode.OK]));
            Assert.Equal("Cat", CreateCSharpResponseType(codeModel.Methods[1].Responses[HttpStatusCode.Accepted]));

            Assert.Equal("PatchDifferentStreamTypesNoContent", codeModel.Methods[6].Name);
            Assert.Equal("VirtualMachineGetRemoteDesktopFileResponse", CreateCSharpResponseType(codeModel.Methods[6].ReturnType));
            Assert.Equal("VirtualMachineGetRemoteDesktopFileResponse", CreateCSharpResponseType(codeModel.Methods[6].Responses[HttpStatusCode.OK]));
            Assert.Null(codeModel.Methods[6].Responses[HttpStatusCode.NoContent].Body);
        }
        public void TestRealPathIrregular()
        {
            var input     = Path.Combine("Resource", "Swagger", "swagger-xml-paths.yaml");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            foreach (var property in codeModel.ModelTypes.SelectMany(m => m.Properties))
            {
                var expectedRealPath = property.Documentation.StartsWith("CUSTOM_")
                                        ? property.Documentation.Substring("CUSTOM_".Length)
                                        : null;
                var expectedRealXmlPath = property.Summary;

                if (expectedRealPath != null)
                {
                    Assert.Equal(expectedRealPath, string.Join(".", property.RealPath));
                }
                if (expectedRealXmlPath != null)
                {
                    Assert.Equal(expectedRealXmlPath, string.Join(".", property.RealXmlPath));
                }
            }
        }
Example #28
0
        public void TestcodeModelWithManyAllOfRelationships()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-ref-allOf-inheritance.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            // the model has a few base type relationships which should be observed:
            // RedisResource is a Resource
            var resourceModel      = codeModel.ModelTypes.Single(x => x.Name == "Resource");
            var redisResourceModel = codeModel.ModelTypes.Single(x => x.Name == "RedisResource");

            Assert.Equal(resourceModel, redisResourceModel.BaseModelType);

            // RedisResourceWithAccessKey is a RedisResource
            var redisResponseWithAccessKeyModel =
                codeModel.ModelTypes.Single(x => x.Name == "RedisResourceWithAccessKey");

            Assert.Equal(redisResourceModel, redisResponseWithAccessKeyModel.BaseModelType);

            // RedisCreateOrUpdateParameters is a Resource
            var redisCreateUpdateParametersModel =
                codeModel.ModelTypes.Single(x => x.Name == "RedisCreateOrUpdateParameters");

            Assert.Equal(resourceModel, redisCreateUpdateParametersModel.BaseModelType);

            // RedisReadableProperties is a RedisProperties
            var redisPropertiesModel        = codeModel.ModelTypes.Single(x => x.Name == "RedisProperties");
            var redisReadablePropertieModel = codeModel.ModelTypes.Single(x => x.Name == "RedisReadableProperties");

            Assert.Equal(redisPropertiesModel, redisReadablePropertieModel.BaseModelType);

            // RedisReadablePropertiesWithAccessKey is a RedisReadableProperties
            var redisReadablePropertiesWithAccessKeysModel =
                codeModel.ModelTypes.Single(x => x.Name == "RedisReadablePropertiesWithAccessKey");

            Assert.Equal(redisReadablePropertieModel, redisReadablePropertiesWithAccessKeysModel.BaseModelType);
        }
Example #29
0
        public void TestAdditionalProperties()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-additional-properties.yaml");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            Assert.NotNull(codeModel);
            Assert.Equal(5, codeModel.ModelTypes.Count);

            // did we find the type?
            var wtd = codeModel.ModelTypes.FirstOrDefault(each => each.Name == "WithTypedDictionary");

            Assert.NotNull(wtd);

            // did we find the member called 'additionalProperties'
            var prop = wtd.Properties.FirstOrDefault(each => each.Name == "AdditionalProperties");

            Assert.NotNull(prop);

            // is it a DictionaryType?
            var dictionaryProperty = prop.ModelType as DictionaryType;

            Assert.NotNull(dictionaryProperty);

            // is a string,string dictionary?
            Assert.Equal("Dictionary<string,Feature>", dictionaryProperty.Name);
            Assert.Equal("Feature", dictionaryProperty.ValueType.Name);

            // is it marked as an 'additionalProperties' bucket?
            Assert.True(dictionaryProperty.SupportsAdditionalProperties);

            // did we find the type?
            var wud = codeModel.ModelTypes.FirstOrDefault(each => each.Name == "WithUntypedDictionary");

            Assert.NotNull(wud);

            // did we find the member called 'additionalProperties'
            prop = wud.Properties.FirstOrDefault(each => each.Name == "AdditionalProperties");
            Assert.NotNull(prop);

            // is it a DictionaryType?
            dictionaryProperty = prop.ModelType as DictionaryType;
            Assert.NotNull(dictionaryProperty);

            // is a string,string dictionary?
            Assert.Equal("Dictionary<string,Object>", dictionaryProperty.Name);
            Assert.Equal("Object", dictionaryProperty.ValueType.Name);

            // is it marked as an 'additionalProperties' bucket?
            Assert.True(dictionaryProperty.SupportsAdditionalProperties);

            var wsd = codeModel.ModelTypes.FirstOrDefault(each => each.Name == "WithStringDictionary");

            Assert.NotNull(wsd);

            // did we find the member called 'additionalProperties'
            prop = wsd.Properties.FirstOrDefault(each => each.Name == "AdditionalProperties");
            Assert.NotNull(prop);

            // is it a DictionaryType?
            dictionaryProperty = prop.ModelType as DictionaryType;
            Assert.NotNull(dictionaryProperty);

            // is a string,string dictionary?
            Assert.Equal("Dictionary<string,String>", dictionaryProperty.Name);
            Assert.Equal("String", dictionaryProperty.ValueType.Name);

            // is it marked as an 'additionalProperties' bucket?
            Assert.True(dictionaryProperty.SupportsAdditionalProperties);
        }
Example #30
0
        public void TestClientWithValidation()
        {
            var input     = Path.Combine(CodeBaseDirectory, "Resource", "Swagger", "swagger-validation.json");
            var modeler   = new SwaggerModeler();
            var codeModel = modeler.Build(SwaggerParser.Parse(File.ReadAllText(input)));

            var methods = codeModel.Methods.ToList();

            Assert.Equal("resourceGroupName", methods[0].Parameters[1].Name);
            Assert.Equal(true, methods[0].Parameters[1].IsRequired);
            Assert.Equal(3, methods[0].Parameters[1].Constraints.Count);
            Assert.Equal("10", methods[0].Parameters[1].Constraints[Constraint.MaxLength]);
            Assert.Equal("3", methods[0].Parameters[1].Constraints[Constraint.MinLength]);
            Assert.Equal("[a-zA-Z0-9]+", methods[0].Parameters[1].Constraints[Constraint.Pattern]);
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.MultipleOf));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.ExclusiveMaximum));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.ExclusiveMinimum));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.InclusiveMinimum));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.InclusiveMaximum));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.MinItems));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.MaxItems));
            Assert.False(methods[0].Parameters[1].Constraints.ContainsKey(Constraint.UniqueItems));


            Assert.Equal("id", methods[0].Parameters[2].Name);
            Assert.Equal(3, methods[0].Parameters[2].Constraints.Count);
            Assert.Equal("10", methods[0].Parameters[2].Constraints[Constraint.MultipleOf]);
            Assert.Equal("100", methods[0].Parameters[2].Constraints[Constraint.InclusiveMinimum]);
            Assert.Equal("1000", methods[0].Parameters[2].Constraints[Constraint.InclusiveMaximum]);
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.ExclusiveMaximum));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.ExclusiveMinimum));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.MaxLength));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.MinLength));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.Pattern));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.MinItems));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.MaxItems));
            Assert.False(methods[0].Parameters[2].Constraints.ContainsKey(Constraint.UniqueItems));

            Assert.Equal("apiVersion", methods[0].Parameters[3].Name);
            Assert.NotNull(methods[0].Parameters[3].ClientProperty);
            Assert.Equal(1, methods[0].Parameters[3].Constraints.Count);
            Assert.Equal("\\d{2}-\\d{2}-\\d{4}", methods[0].Parameters[3].Constraints[Constraint.Pattern]);

            Assert.Equal("Product", codeModel.ModelTypes.First(m => m.Name == "Product").Name);
            Assert.Equal("DisplayNames", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Name);
            Assert.Equal(3, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.Count);
            Assert.Equal("6", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints[Constraint.MaxItems]);
            Assert.Equal("0", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints[Constraint.MinItems]);
            Assert.Equal("true", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints[Constraint.UniqueItems]);
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.ExclusiveMaximum));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.ExclusiveMinimum));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.InclusiveMaximum));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.InclusiveMinimum));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.MultipleOf));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.MinLength));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.MaxLength));
            Assert.False(codeModel.ModelTypes.First(m => m.Name == "Product").Properties[2].Constraints.ContainsKey(Constraint.Pattern));

            Assert.Equal("Capacity", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[3].Name);
            Assert.Equal(2, codeModel.ModelTypes.First(m => m.Name == "Product").Properties[3].Constraints.Count);
            Assert.Equal("100", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[3].Constraints[Constraint.ExclusiveMaximum]);
            Assert.Equal("0", codeModel.ModelTypes.First(m => m.Name == "Product").Properties[3].Constraints[Constraint.ExclusiveMinimum]);
        }