Пример #1
0
        public async Task When_query_parameter_is_enum_array_then_the_enum_is_referenced()
        {
            //// Arrange
            var settings = new WebApiOpenApiDocumentGeneratorSettings
            {
                DefaultUrlTemplate          = "api/{controller}/{action}/{id}",
                DefaultEnumHandling         = EnumHandling.String,
                DefaultPropertyNameHandling = PropertyNameHandling.Default,
                SchemaType = SchemaType.Swagger2,
            };
            var generator = new WebApiOpenApiDocumentGenerator(settings);

            //// Act
            var document = await generator.GenerateForControllerAsync <FooController>();

            var json = document.ToJson();

            var clientSettings = new TypeScriptClientGeneratorSettings
            {
                Template = TypeScriptTemplate.JQueryCallbacks
            };

            clientSettings.TypeScriptGeneratorSettings.TypeScriptVersion = 1.8m;

            var gen  = new TypeScriptClientGenerator(document, clientSettings);
            var code = gen.GenerateFile();

            //// Assert
            Assert.NotNull(document.Operations.First().Operation.Parameters.First().Item.Reference);
            Assert.Contains("getFoos(bars: Bar[], ", code);
        }
Пример #2
0
        public async Task When_generic_request()
        {
            // Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <DiscussionController>();

            var json = document.ToJson();

            // Act
            var codeGen = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings
            {
                Template                    = TypeScriptTemplate.Angular,
                GenerateDtoTypes            = true,
                TypeScriptGeneratorSettings =
                {
                    TypeScriptVersion = 2.7m,
                    ExportTypes       = false
                }
            });
            var code = codeGen.GenerateFile();

            // Assert
            Assert.Contains("this.request = new RequestBodyBase()", code);
            Assert.Contains("this.request = new RequestBody()", code);
        }
Пример #3
0
        public async Task When_redundant_attributes_are_available_then_output_is_correct()
        {
            //// Arrange
            var settings = new WebApiOpenApiDocumentGeneratorSettings
            {
                TypeMappers =
                {
                    new ObjectTypeMapper(typeof(JsonDate), new JsonSchema
                    {
                        Type   = JsonObjectType.String,
                        Format = "date"
                    })
                },
                AddMissingPathParameters = false,
                SchemaType                  = SchemaType.Swagger2,
                GenerateKnownTypes          = true,
                FlattenInheritanceHierarchy = true,
                DefaultEnumHandling         = EnumHandling.String,
                IsAspNetCore                = false,
            };
            var generator = new WebApiOpenApiDocumentGenerator(settings);

            //// Act
            var document = await generator.GenerateForControllerAsync <MyController>();

            var json = document.ToJson();

            //// Assert
            Assert.IsTrue(json.Contains("\"$ref\": \"#/definitions/LockedFlight\""));
        }
Пример #4
0
        public async Task When_controller_has_tag_attributes_then_they_are_processed()
        {
            //// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync <TagsTest1Controller>();

            var json = document.ToJson();

            //// Assert
            Assert.AreEqual(4, document.Tags.Count);

            Assert.AreEqual("x", document.Tags[0].Name);
            Assert.AreEqual("y", document.Tags[1].Name);

            Assert.AreEqual("a1", document.Tags[2].Name);
            Assert.AreEqual("a2", document.Tags[2].Description);
            Assert.AreEqual(null, document.Tags[2].ExternalDocumentation);

            Assert.AreEqual("b1", document.Tags[3].Name);
            Assert.AreEqual("b2", document.Tags[3].Description);
            Assert.AreEqual("b3", document.Tags[3].ExternalDocumentation.Description);
            Assert.AreEqual("b4", document.Tags[3].ExternalDocumentation.Url);
        }
Пример #5
0
        public async Task When_response_is_not_nullable_then_nullable_is_false_in_spec()
        {
            /// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings
            {
                DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null
            });

            /// Act
            var document = await generator.GenerateForControllerAsync <NotNullResponseTestController>();

            /// Assert
            var operationAbc = document.Operations.Single(o => o.Path.Contains("Abc"));
            var responseAbc  = operationAbc.Operation.ActualResponses.First().Value;

            var operationDef = document.Operations.Single(o => o.Path.Contains("Def"));
            var responseDef  = operationDef.Operation.ActualResponses.First().Value;

            var operationGhi = document.Operations.Single(o => o.Path.Contains("Ghi"));
            var responseGhi  = operationGhi.Operation.ActualResponses.First().Value;

            Assert.IsTrue(responseAbc.IsNullable(SchemaType.Swagger2));
            Assert.IsFalse(responseDef.IsNullable(SchemaType.Swagger2));
            Assert.IsFalse(responseGhi.IsNullable(SchemaType.Swagger2));
        }
Пример #6
0
        private static OpenApiDocument CreateDocument(params Assembly[] assemblies)
        {
            var swaggerGenerator = new WebApiOpenApiDocumentGenerator(SettingsFactory.WebApiOpenApiDocumentGeneratorSettings);
            var controllers      = assemblies.SelectMany(x => x.GetTypes().Where(c => typeof(ControllerBase).IsAssignableFrom(c)));

            return(swaggerGenerator.GenerateForControllersAsync(controllers).Result);
        }
Пример #7
0
        public async Task When_parameter_is_abstract_then_generate_union()
        {
            //// Arrange
            var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document         = await swaggerGenerator.GenerateForControllerAsync <DiscriminatorController>();

            var clientGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings
            {
                TypeScriptGeneratorSettings =
                {
                    UseLeafType       = true,
                    TypeScriptVersion = 1.4m,
                    NullValue         = TypeScriptNullValue.Undefined
                }
            });

            var json = document.ToJson();

            //// Act
            var code = clientGenerator.GenerateFile();

            //// Assert
            Assert.Contains("test(param: OneChild)", code);
            Assert.Contains("testLeaf(param: OneChild | SecondChild)", code);
            Assert.Contains("testLeafArr(param: (OneChild | SecondChild)[])", code);
            Assert.Contains("child?: OneChild | SecondChild;", code);
            Assert.Contains("childCollection?: (OneChild | SecondChild)[];", code);
        }
Пример #8
0
        public async Task When_export_types_is_false_then_dont_add_export_before_classes()
        {
            //// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <DiscussionController>();

            var json = document.ToJson();

            //// Act
            var codeGen = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings
            {
                Template = TypeScriptTemplate.Fetch,
                GenerateClientInterfaces    = true,
                TypeScriptGeneratorSettings =
                {
                    TypeScriptVersion = 2.0m,
                    ExportTypes       = false
                }
            });
            var code = codeGen.GenerateFile();

            //// Assert
            Assert.DoesNotContain("export class DiscussionClient", code);
            Assert.DoesNotContain("export interface IDiscussionClient", code);
        }
Пример #9
0
        public async Task When_operations_have_no_tags_they_are_grouped_into_one_client()
        {
            // Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllersAsync(new List <Type>() { typeof(PointControllerA), typeof(PointControllerB) });

            // Remove tags
            foreach (var path in document.Paths.Values)
            {
                foreach (var operation in path.Values)
                {
                    operation.Tags.Clear();
                }
            }
            var codeGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings
            {
                OperationNameGenerator = new MultipleClientsFromFirstTagAndPathSegmentsOperationNameGenerator()
            });

            // Act
            var code = codeGenerator.GenerateFile();

            // Assert
            Assert.IsTrue(code.Contains("export class Client"));
            Assert.IsTrue(!code.Contains("export class PointControllerAClient"));
            Assert.IsTrue(!code.Contains("export class PointControllerBClient"));
        }
Пример #10
0
        public async Task When_parameter_is_complex_and_has_CustomBinding_that_will_not_read_body_with_mapped_parameter_then_it_is_a_query_parameter()
        {
            //// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            });

            //// Act
            generator.Settings.TypeMappers.Add(
                new PrimitiveTypeMapper(
                    typeof(MyMappedParameter),
                    s =>
            {
                s.Type = JsonObjectType.String;
                s.Enumeration.Add("hello");
                s.Enumeration.Add("world");
            }));
            var document = await generator.GenerateForControllerAsync <TestController>();

            var operation = document.Operations.Single(o => o.Operation.OperationId == "Test_WithCustomFromUriTypeMappedParameter").Operation;
            var json      = document.ToJson();

            //// Assert
            Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[0].Kind);
            Assert.AreEqual(JsonObjectType.String, operation.ActualParameters[0].Type);
            Assert.AreEqual("mappedParameter", operation.ActualParameters[0].Name);
        }
Пример #11
0
        /// <summary>Generates the Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual async Task <string> GenerateDocumentAsync(IOwinContext context)
        {
            var settings  = _settings.CreateGeneratorSettings(null, null);
            var generator = new WebApiOpenApiDocumentGenerator(settings);
            var document  = await generator.GenerateForControllersAsync(_controllerTypes);

            if (_settings.MiddlewareBasePath != null)
            {
                document.Host = context.Request.Host.Value ?? "";
                document.Schemes.Add(context.Request.Scheme == "http" ? OpenApiSchema.Http : OpenApiSchema.Https);
                document.BasePath = context.Request.PathBase.Value?.Substring(0, context.Request.PathBase.Value.Length - (_settings.MiddlewareBasePath?.Length ?? 0)) ?? "";
            }
            else
            {
                document.Servers.Clear();
                document.Servers.Add(new OpenApiServer
                {
                    Url = context.Request.GetServerUrl()
                });
            }

            _settings.PostProcess?.Invoke(document);
            var schemaJson = document.ToJson();

            return(schemaJson);
        }
Пример #12
0
        private static async Task <OpenApiDocument> GenerateSwaggerDocument()
        {
            var generator   = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var assembly    = Assembly.GetAssembly(typeof(Web.Program));
            var controllers = WebApiOpenApiDocumentGenerator.GetControllerClasses(assembly);

            return(await generator.GenerateForControllersAsync(controllers));
        }
Пример #13
0
        public async Task Skip_null_route_attribute_temlates()
        {
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <SkipNullController>();

            var swaggerSpecification = document.ToJson();

            StringAssert.Contains(swaggerSpecification, "\"/api/SkipNull\"");
        }
Пример #14
0
        public async Task Use_base_class_route_attribute()
        {
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <FooController>();

            var swaggerSpecification = document.ToJson();

            StringAssert.Contains(swaggerSpecification, "\"/api/Foo\"");
        }
Пример #15
0
        public async Task Custom_internal_route_attribute()
        {
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <MyApiController>();

            var swaggerSpecification = document.ToJson();

            StringAssert.Contains(swaggerSpecification, "\"/api/MyApi\"");
        }
Пример #16
0
        public async Task Route_attribute_overrides_base()
        {
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <BarController>();

            var swaggerSpecification = document.ToJson();

            StringAssert.Contains(swaggerSpecification, "\"/api/other\"");
        }
        public void When_controller_has_ApiExplorerSettingsAttribute_with_IgnoreApi_then_it_is_ignored()
        {
            //// Arrange

            //// Act
            var controllers = WebApiOpenApiDocumentGenerator.GetControllerClasses(typeof(ApiExplorerIgnoredController).Assembly);

            //// Assert
            Assert.IsFalse(controllers.Any(c => c.Name == "ApiExplorerIgnoredController"));
        }
        private WebApiOpenApiDocumentGenerator GetOpenApi3Generator()
        {
            WebApiOpenApiDocumentGeneratorSettings settings = new WebApiOpenApiDocumentGeneratorSettings
            {
                SchemaType = SchemaType.Swagger2
            };
            WebApiOpenApiDocumentGenerator generator = new WebApiOpenApiDocumentGenerator(settings);

            return(generator);
        }
Пример #19
0
        public async Task When_parameter_is_ignored_then_the_route_is_correct()
        {
            //// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync <MyController>();

            //// Assert
            Assert.AreEqual("/api/service", document.Paths.First().Key);
        }
Пример #20
0
        public async Task When_operation_has_tags_attributes_then_they_are_processed()
        {
            //// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync <TagsTest2Controller>();

            //// Assert
            Assert.AreEqual("[\"foo\",\"bar\"]", JsonConvert.SerializeObject(document.Operations.First().Operation.Tags));
        }
Пример #21
0
        public void When_class_inherits_from_ApiController_then_it_is_found()
        {
            // Arrange


            // Act
            var controllerClasses = WebApiOpenApiDocumentGenerator.GetControllerClasses(typeof(ControllerClassesTests).Assembly);

            // Assert
            Assert.IsTrue(controllerClasses.Contains(typeof(MyWebApi)));
        }
Пример #22
0
        public async Task When_route_is_on_inherited_parent_class_then_it_is_used_for_swagger_generation()
        {
            //// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync <MyController2>();

            //// Assert
            Assert.AreEqual("/Foo", document.Operations.First().Path);
        }
Пример #23
0
        public void When_class_is_abstract_then_it_is_ignored()
        {
            // Arrange


            // Act
            var controllerClasses = WebApiOpenApiDocumentGenerator.GetControllerClasses(typeof(ControllerClassesTests).Assembly);

            // Assert
            Assert.IsFalse(controllerClasses.Contains(typeof(MyAbstractController)));
        }
Пример #24
0
        public async Task <HttpResponseMessage> Swagger()
        {
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings
            {
                DefaultUrlTemplate = Configuration.Routes.First(r => !string.IsNullOrEmpty(r.RouteTemplate)).RouteTemplate
            });
            var document = await generator.GenerateForControllerAsync(GetType());

            return(new HttpResponseMessage {
                Content = new StringContent(document.ToJson(), Encoding.UTF8)
            });
        }
Пример #25
0
        public async Task When_SwaggerOperation_attribute_is_available_then_operation_id_is_correct()
        {
            // Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            // Act
            var document = await generator.GenerateForControllerAsync <OperationIdController>();

            // Assert
            Assert.AreEqual("MyFoo", document.Operations.First(o => o.Path == "/Foo").Operation.OperationId);
            Assert.AreEqual("OperationId_Bar", document.Operations.First(o => o.Path == "/Bar").Operation.OperationId);
        }
Пример #26
0
        public async Task When_routes_are_same_and_http_method_different_then_operation_ids_are_still_generated_from_method_name()
        {
            // Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            // Act
            var document = await generator.GenerateForControllerAsync <AccountController>();

            // Assert
            Assert.AreEqual("Account_GetAccount", document.Operations.First().Operation.OperationId);
            Assert.AreEqual("Account_DeleteAccount", document.Operations.Last().Operation.OperationId);
        }
Пример #27
0
        public async Task When_spec_is_generated_then_no_NPE_is_thrown()
        {
            /// Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            /// Act
            var document = await generator.GenerateForControllerAsync <MyApiController>();

            var json = document.ToJson();

            /// Assert
            Assert.IsTrue(document.Operations.First().Operation.ActualResponses.First().Value.Schema.Item.IsAnyType);
        }
Пример #28
0
        public async Task When_optional_id_is_used_then_generation_works()
        {
            // Arrange
            var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            // Act
            var document = await generator.GenerateForControllerAsync <ValuesController>();

            var json = document.ToJson();

            // Assert
            Assert.IsTrue(json != null);
        }
Пример #29
0
        public async Task When_response_is_enum_then_it_is_referenced()
        {
            // Arrange
            var apiGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            //// Act
            var document = await apiGenerator.GenerateForControllerAsync <MyEnumResultController>();

            var json = document.ToJson();

            // Assert
            Assert.IsTrue(document.Operations.First().Operation.ActualResponses.First().Value.Schema.HasReference);
        }
Пример #30
0
        public async Task When_enum_is_used_as_array_item_then_it_is_generated_only_once()
        {
            // Arrange
            var apiGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());

            //// Act
            var document = await apiGenerator.GenerateForControllerAsync <MyController>();

            var json = document.ToJson();

            // Assert
            Assert.IsTrue(json.Split(new[] { "x-enumNames" }, StringSplitOptions.None).Length == 2); // enum is defined only once
        }