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); }
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); }
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\"")); }
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); }
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)); }
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); }
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); }
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); }
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")); }
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); }
/// <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); }
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)); }
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\""); }
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\""); }
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\""); }
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); }
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); }
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)); }
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))); }
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); }
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))); }
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) }); }
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); }
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); }
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); }
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); }
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); }
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 }