diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasConsumesAttribute_bindingSourceId=Body.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasConsumesAttribute_bindingSourceId=Body.verified.txt new file mode 100644 index 0000000000..039d96aca5 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasConsumesAttribute_bindingSourceId=Body.verified.txt @@ -0,0 +1,47 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: false, + Content: { + application/someMediaType: { + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + } + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 4CB047722B57E9853D09B038EC48DB9A63B1EE5C19DDFD234A172615EE6225134356F1B92FB3881C2D7DAA40B77D534CB317F93B407B4E7B6B74480224A9E7B7 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasConsumesAttribute_bindingSourceId=Form.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasConsumesAttribute_bindingSourceId=Form.verified.txt new file mode 100644 index 0000000000..f933ed006f --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasConsumesAttribute_bindingSourceId=Form.verified.txt @@ -0,0 +1,63 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: false, + Content: { + application/someMediaType: { + Schema: { + Type: object, + ReadOnly: false, + WriteOnly: false, + Properties: { + param: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + }, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + }, + Encoding: { + param: { + Style: Form + } + } + } + } + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: E5B7D5A3A69521A769EA033C2E26073D98F03E899B1DFE0A7CF240CE54D26EA3294FDF9D39DCABBB4F32CA029376F8CF147C001935036911E75750C367FD288E +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasFileResult.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasFileResult.verified.txt new file mode 100644 index 0000000000..97bf697dc5 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasFileResult.verified.txt @@ -0,0 +1,44 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + Content: { + application/zip: { + Schema: { + Type: string, + Format: binary, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + }, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 83ACD9647CC5FE2F4D9CB77158BC1B03C790DCF45575DD944B54B1B223692F2F000674EA282E908E25354FD80FD6843770F1CA8B70289B8BE70C58F919A2FDDA +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasObsoleteAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasObsoleteAttribute.verified.txt new file mode 100644 index 0000000000..8ad8c607d8 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasObsoleteAttribute.verified.txt @@ -0,0 +1,30 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: true + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 6ED193BE1E35B9D7BF0B260B931947E4AAC0931E500AA8ED441B6D9D2A5AFA228C99ED8B295DB246E18AFAD63CB63455167621785F98F447EBF31A5431F61380 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasProducesAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasProducesAttribute.verified.txt new file mode 100644 index 0000000000..1eccdd4e9f --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHasProducesAttribute.verified.txt @@ -0,0 +1,44 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + Content: { + application/someMediaType: { + Schema: { + Type: integer, + Format: int32, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + }, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 70543EA64D7658413247389AF5490AD05BEEDF3D5FDCEC1436353732D8D2F1566EDB6CE23863A45C135B8715D60FA95B90E6D460181B1FEABD2CD061914DFE13 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHavingFromFormAttributeButNotWithIFormFile.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHavingFromFormAttributeButNotWithIFormFile.verified.txt new file mode 100644 index 0000000000..00be61b1ac --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHavingFromFormAttributeButNotWithIFormFile.verified.txt @@ -0,0 +1,73 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param1, + In: Query, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Form, + Explode: true, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + }, + { + UnresolvedReference: false, + Name: param2, + In: Query, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Form, + Explode: true, + AllowReserved: false, + Schema: { + Type: string, + Format: binary, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 0FB4C6819BEAFC6E91679E56836641A46864BF8AB09F4C5439146C4B568315AE89C2FE246798FEB6DFF832DE97AE90010624CB9342E8E41AC45064041DE39A25 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHavingFromFormAttributeWithSwaggerIgnore.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHavingFromFormAttributeWithSwaggerIgnore.verified.txt new file mode 100644 index 0000000000..0eec3a2b81 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionHavingFromFormAttributeWithSwaggerIgnore.verified.txt @@ -0,0 +1,63 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: false, + Content: { + multipart/form-data: { + Schema: { + Type: object, + ReadOnly: false, + WriteOnly: false, + Properties: { + NotIgnoredString: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + }, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + }, + Encoding: { + NotIgnoredString: { + Style: Form + } + } + } + } + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: F2D8CE9F78193258F625FBA0732E8543EACC9F98F35622C7D834B9A4CF30328B824D914FFE1E1C94E268978D828FE142ED48EBAB9F468EF288FFD238C56C20E1 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionParameterHasBindNeverAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionParameterHasBindNeverAttribute.verified.txt new file mode 100644 index 0000000000..b275ef8989 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionParameterHasBindNeverAttribute.verified.txt @@ -0,0 +1,30 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 0E75218C57C662359EC554B377E7600D033FDF17E191A0E468F1E402807067F96CA4BF92320CC0B13E796E1E39DF7997BCF9A2F00DEF42D6D1AD6F47A7F35666 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionParameterHasSwaggerIgnoreAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionParameterHasSwaggerIgnoreAttribute.verified.txt new file mode 100644 index 0000000000..b275ef8989 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionParameterHasSwaggerIgnoreAttribute.verified.txt @@ -0,0 +1,30 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 0E75218C57C662359EC554B377E7600D033FDF17E191A0E468F1E402807067F96CA4BF92320CC0B13E796E1E39DF7997BCF9A2F00DEF42D6D1AD6F47A7F35666 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithConsumesAttributeAndProvidedOpenApiOperation.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithConsumesAttributeAndProvidedOpenApiOperation.verified.txt new file mode 100644 index 0000000000..7154917849 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithConsumesAttributeAndProvidedOpenApiOperation.verified.txt @@ -0,0 +1,67 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + OperationId: OperationIdSetInMetadata, + RequestBody: { + UnresolvedReference: false, + Required: false, + Content: { + application/someMediaType: { + Schema: { + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false, + Reference: { + IsFragrament: false, + Type: Schema, + Id: TestDto, + IsExternal: false, + IsLocal: true, + ReferenceV3: #/components/schemas/TestDto, + ReferenceV2: #/definitions/TestDto + } + } + } + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: { + Schemas: { + TestDto: { + Type: object, + ReadOnly: false, + WriteOnly: false, + Properties: { + Prop1: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: true, + Deprecated: false, + UnresolvedReference: false + } + }, + AdditionalPropertiesAllowed: false, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + }, + HashCode: 59A5DD972A919CE8EF3F08E63BB492CCCA30B825146EA05B2BEF4690888EA52FB3CEC61C7F1F9A14629EDFF141CC49084DA127F3D6C5F555D8EA39F7B202C4E9 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithParameterAndProvidedOpenApiOperation.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithParameterAndProvidedOpenApiOperation.verified.txt new file mode 100644 index 0000000000..5c71462efe --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithParameterAndProvidedOpenApiOperation.verified.txt @@ -0,0 +1,40 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + OperationId: OperationIdSetInMetadata, + Parameters: [ + { + UnresolvedReference: false, + Name: ParameterInMetadata, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 80ACD622C6A7E73B1C5084D230E624A2A5897CCCC091D32500F9192221224A9A256D1E80276A6D47B85459035DFF93938E2378ACE8A3E854CB32390244297D61 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithProducesAttributeAndProvidedOpenApiOperation.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithProducesAttributeAndProvidedOpenApiOperation.verified.txt new file mode 100644 index 0000000000..bdeb7e02a6 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithProducesAttributeAndProvidedOpenApiOperation.verified.txt @@ -0,0 +1,68 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + OperationId: OperationIdSetInMetadata, + Responses: { + 200: { + Content: { + application/someMediaType: { + Schema: { + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false, + Reference: { + IsFragrament: false, + Type: Schema, + Id: TestDto, + IsExternal: false, + IsLocal: true, + ReferenceV3: #/components/schemas/TestDto, + ReferenceV2: #/definitions/TestDto + } + } + } + }, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: { + Schemas: { + TestDto: { + Type: object, + ReadOnly: false, + WriteOnly: false, + Properties: { + Prop1: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: true, + Deprecated: false, + UnresolvedReference: false + } + }, + AdditionalPropertiesAllowed: false, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + }, + HashCode: 33EF286A101E847C16BF4B86DF410E6C22D16FEA221DEC72217642B13238E9C69382B5EBE1F7B9FEFC5E2819EA81D1C4C28A8E2AFF075F8E1CCF425F635F9532 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredBodyParameter_action=ActionWithParameterWithBindRequiredAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredBodyParameter_action=ActionWithParameterWithBindRequiredAttribute.verified.txt new file mode 100644 index 0000000000..0391bc7c93 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredBodyParameter_action=ActionWithParameterWithBindRequiredAttribute.verified.txt @@ -0,0 +1,47 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: true, + Content: { + application/json: { + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + } + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 804D6F0C92F4BE50ED4B40A4DD1F6D3FB0F279B348764AC01ABFD0218A5DE81B9CDA62C18D1345F64751D4FA1CA98298834D12D7AF7799F4845203B45FE40CFE +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredBodyParameter_action=ActionWithParameterWithRequiredAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredBodyParameter_action=ActionWithParameterWithRequiredAttribute.verified.txt new file mode 100644 index 0000000000..0391bc7c93 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredBodyParameter_action=ActionWithParameterWithRequiredAttribute.verified.txt @@ -0,0 +1,47 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: true, + Content: { + application/json: { + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + } + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 804D6F0C92F4BE50ED4B40A4DD1F6D3FB0F279B348764AC01ABFD0218A5DE81B9CDA62C18D1345F64751D4FA1CA98298834D12D7AF7799F4845203B45FE40CFE +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredQueryParameter_action=ActionWithParameterWithBindRequiredAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredQueryParameter_action=ActionWithParameterWithBindRequiredAttribute.verified.txt new file mode 100644 index 0000000000..f8133b12f1 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredQueryParameter_action=ActionWithParameterWithBindRequiredAttribute.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Query, + Required: true, + Deprecated: false, + AllowEmptyValue: false, + Style: Form, + Explode: true, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: A2DDB9D84BC2303C2E8B82FEE969073D4DCAE3D40331C1ED8376E3F427E46C7CAE5AE2791BC5FE1FFFE026EBE90FC10DE8A0409D9F0B6EBC5DBE6CB294DD6A84 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredQueryParameter_action=ActionWithParameterWithRequiredAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredQueryParameter_action=ActionWithParameterWithRequiredAttribute.verified.txt new file mode 100644 index 0000000000..f8133b12f1 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithRequiredQueryParameter_action=ActionWithParameterWithRequiredAttribute.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Query, + Required: true, + Deprecated: false, + AllowEmptyValue: false, + Style: Form, + Explode: true, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: A2DDB9D84BC2303C2E8B82FEE969073D4DCAE3D40331C1ED8376E3F427E46C7CAE5AE2791BC5FE1FFFE026EBE90FC10DE8A0409D9F0B6EBC5DBE6CB294DD6A84 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithReturnValueAndSupportedResponseTypes.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithReturnValueAndSupportedResponseTypes.verified.txt new file mode 100644 index 0000000000..7feed0f987 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ActionWithReturnValueAndSupportedResponseTypes.verified.txt @@ -0,0 +1,56 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + Content: { + application/json: { + Schema: { + Type: integer, + Format: int32, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + }, + UnresolvedReference: false + }, + 400: { + Description: Bad Request, + UnresolvedReference: false + }, + 422: { + Description: Unprocessable Content, + UnresolvedReference: false + }, + default: { + Description: Error, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 49491612C8548E72072C4BF9884EBB4F3B076CB8FA86B0ADA736DD5AA2A7EFBDE1E5E4E2698AD9241CCB5A6AA19E150B7B558356C9F7B4A6027DCC77657B5685 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterDescriptionForBodyIsRequired.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterDescriptionForBodyIsRequired.verified.txt new file mode 100644 index 0000000000..70c95a24b4 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterDescriptionForBodyIsRequired.verified.txt @@ -0,0 +1,34 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Foo, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: true + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 19A6400D0649D9875F38AAD5D6902D74BB45BC7435F3C76982D8CC6022ABD2DF08CB9083F22D74D4B915231556A80FA79185EC43D3775D1D46B53BBA970FAB59 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterHasNoCorrespondingActionParameter.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterHasNoCorrespondingActionParameter.verified.txt new file mode 100644 index 0000000000..d72f56e957 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterHasNoCorrespondingActionParameter.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Path, + Required: true, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 38B7A774F1E494464B7C8CDF5CEBD39D2F2E60726F987D4E54C8C38D7B7FB8EB46AF4D81E8F4A34122ADCEB174E9309FE336E72723AC7578A6E7AE249CEF35A2 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterIsBoundToPath.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterIsBoundToPath.verified.txt new file mode 100644 index 0000000000..d72f56e957 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParameterIsBoundToPath.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Path, + Required: true, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 38B7A774F1E494464B7C8CDF5CEBD39D2F2E60726F987D4E54C8C38D7B7FB8EB46AF4D81E8F4A34122ADCEB174E9309FE336E72723AC7578A6E7AE249CEF35A2 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreBoundToForm.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreBoundToForm.verified.txt new file mode 100644 index 0000000000..60e25dab61 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreBoundToForm.verified.txt @@ -0,0 +1,76 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + RequestBody: { + UnresolvedReference: false, + Required: false, + Content: { + multipart/form-data: { + Schema: { + Type: object, + ReadOnly: false, + WriteOnly: false, + Properties: { + param1: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + }, + param2: { + Type: integer, + Format: int32, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + }, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + }, + Encoding: { + param1: { + Style: Form + }, + param2: { + Style: Form + } + } + } + } + }, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: CC72B9C2B39FBC08D572E3EC1D511C5CE6706B54BF2DE5B3D381BAC8ABFCA83D8DDDDB402CDC8AD50122D927D56937A1B4F47078D561007DA2EFD4DA82FAF8CF +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Header.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Header.verified.txt new file mode 100644 index 0000000000..48c21a0ac9 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Header.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Header, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 7B5009B038667AE7A48CBB1ABC73A6971D6453FAA7FBC670A231E82A45223BE46E36B2A10F66D6BC665D2C89EE2A2159EF4CBB45D66220D13291A7B5D1CFBA21 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Path.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Path.verified.txt new file mode 100644 index 0000000000..d72f56e957 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Path.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Path, + Required: true, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 38B7A774F1E494464B7C8CDF5CEBD39D2F2E60726F987D4E54C8C38D7B7FB8EB46AF4D81E8F4A34122ADCEB174E9309FE336E72723AC7578A6E7AE249CEF35A2 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Query.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Query.verified.txt new file mode 100644 index 0000000000..856c5ca711 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=Query.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Query, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Form, + Explode: true, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 58CF9F0306B53D071A6262CED2A4A2D41D0DB9D62C183D00CFF85A74891E812B0AD9E56AF4F9F84E5DE4D0864EF33832BA39E5397CC6E2D2EE560075E91B4FC2 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=null.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=null.verified.txt new file mode 100644 index 0000000000..856c5ca711 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ApiParametersThatAreNotBoundToBodyOrForm_bindingSourceId=null.verified.txt @@ -0,0 +1,52 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Parameters: [ + { + UnresolvedReference: false, + Name: param, + In: Query, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Form, + Explode: true, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 58CF9F0306B53D071A6262CED2A4A2D41D0DB9D62C183D00CFF85A74891E812B0AD9E56AF4F9F84E5DE4D0864EF33832BA39E5397CC6E2D2EE560075E91B4FC2 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ConflictingActionsResolverIsSpecified.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ConflictingActionsResolverIsSpecified.verified.txt new file mode 100644 index 0000000000..b275ef8989 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.ConflictingActionsResolverIsSpecified.verified.txt @@ -0,0 +1,30 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 0E75218C57C662359EC554B377E7600D033FDF17E191A0E468F1E402807067F96CA4BF92320CC0B13E796E1E39DF7997BCF9A2F00DEF42D6D1AD6F47A7F35666 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasDescriptionAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasDescriptionAttribute.verified.txt new file mode 100644 index 0000000000..99bba4ddf0 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasDescriptionAttribute.verified.txt @@ -0,0 +1,31 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Description: A Test Description, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 377D7B06298BAF6A0588F14C290399EBDBB413894F0CD99EF1925572243C3E5A5327372612D817C05797EA624236A755956F038D6EE98703FC1B5D50CEF6DA12 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasSummaryAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasSummaryAttribute.verified.txt new file mode 100644 index 0000000000..f0d4c611fb --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasSummaryAttribute.verified.txt @@ -0,0 +1,31 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Summary: A Test Summary, + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 7FA24A4FA7C42D165A62545BD3562D78996223809931B2053BCD1658D0460D8F72824735CF34E0A5CF73E80E26F219BE05D1CCEB6CB197B29FF72EFB24DE00F5 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasTags.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasTags.verified.txt new file mode 100644 index 0000000000..07c776deb8 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.EndpointMetadataHasTags.verified.txt @@ -0,0 +1,38 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: Some, + UnresolvedReference: false + }, + { + Name: Tags, + UnresolvedReference: false + }, + { + Name: Here, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 6F8975472729E3A264232F09327A9B51A158FC6D0952BFC812CA902D14346E719EDB456AC1247F9020009B8A3A813011BB9CC7E9699A064E91F4A73A32FD7A0D +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithAcceptFromHeaderParameter.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithAcceptFromHeaderParameter.verified.txt new file mode 100644 index 0000000000..253712d058 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithAcceptFromHeaderParameter.verified.txt @@ -0,0 +1,50 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Get: { + OperationId: OperationIdSetInMetadata, + Parameters: [ + { + UnresolvedReference: false, + Name: accept, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false + }, + { + UnresolvedReference: false, + Name: param, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 48AB134AF00E0ED90AEA7E4E5BADDD7218AB02E7956DD5FAE3C500F4324F14066B32F2EF85E9C52A68431858FED77604C3ABE6CAED518CCB8EC46D22DF63A3DF +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithAuthorizationFromHeaderParameter.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithAuthorizationFromHeaderParameter.verified.txt new file mode 100644 index 0000000000..e6b98e02f1 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithAuthorizationFromHeaderParameter.verified.txt @@ -0,0 +1,50 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Get: { + OperationId: OperationIdSetInMetadata, + Parameters: [ + { + UnresolvedReference: false, + Name: authorization, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false + }, + { + UnresolvedReference: false, + Name: param, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 7B61DF19EC4750E8986D14FA33D86546B51021EA5782C80735BD0BE7A8937AB7CF57D19DDB31BAF396652C20AE904404BAF7116B4C6678720293B513806412ED +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithContentTypeFromHeaderParameter.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithContentTypeFromHeaderParameter.verified.txt new file mode 100644 index 0000000000..7d4ba212df --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.IllegalHeaderParameterWithOpenApiOperation_action=ActionWithContentTypeFromHeaderParameter.verified.txt @@ -0,0 +1,50 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Get: { + OperationId: OperationIdSetInMetadata, + Parameters: [ + { + UnresolvedReference: false, + Name: Content-Type, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false + }, + { + UnresolvedReference: false, + Name: param, + Required: false, + Deprecated: false, + AllowEmptyValue: false, + Style: Simple, + Explode: false, + AllowReserved: false, + Schema: { + Type: string, + ReadOnly: false, + WriteOnly: false, + AdditionalPropertiesAllowed: true, + Nullable: false, + Deprecated: false, + UnresolvedReference: false + } + } + ], + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: F6CB61AEE648F54EC5BBCD1801BF8194997A0D5B99DDCFC0AF71CEDF79888B58EC1798313ECD4181CBAA61F377A80199CDB82412B744E9EF115F247F8A4A18EC +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.OperationHasSwaggerIgnoreAttribute.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.OperationHasSwaggerIgnoreAttribute.verified.txt new file mode 100644 index 0000000000..ba50ebcb2d --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.OperationHasSwaggerIgnoreAttribute.verified.txt @@ -0,0 +1,8 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Components: {}, + HashCode: 862B7E551B2E991D5F9B640090999C8D4EA20752DC6C69FC82E176A30B2039344A80321E469E806BD3AEA3641DAD6DEE970423561F262A187C04F58915996596 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.SortKeySelectorIsSpecified.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.SortKeySelectorIsSpecified.verified.txt new file mode 100644 index 0000000000..86ae63d164 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.SortKeySelectorIsSpecified.verified.txt @@ -0,0 +1,70 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource1: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + }, + /resource2: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + }, + /resource3: { + Operations: { + Post: { + Tags: [ + { + Name: Fake, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 6A7EE4850A3B6C88EFE631633A4697175A2BD849DD792CC4F3182CBE0F1480315A7C7BDEE0EA3243913A2D1632B10B91554A10C017B345B76018EBF3A2AF774B +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.TagSelectorIsSpecified.verified.txt b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.TagSelectorIsSpecified.verified.txt new file mode 100644 index 0000000000..67eccdecb8 --- /dev/null +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.TagSelectorIsSpecified.verified.txt @@ -0,0 +1,30 @@ +{ + Info: { + Title: Test API, + Version: V1 + }, + Paths: { + /resource: { + Operations: { + Post: { + Tags: [ + { + Name: resource, + UnresolvedReference: false + } + ], + Responses: { + 200: { + Description: OK, + UnresolvedReference: false + } + }, + Deprecated: false + } + }, + UnresolvedReference: false + } + }, + Components: {}, + HashCode: 69CCB42286A25F56E56EAA7871BD9DA98131363AC8B40108CAE81CC37239B4120053F46BCE3E442D28004982C097C4712D8646DE2B588BBFCA085557BC0488F7 +} \ No newline at end of file diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.cs index 891f3cd308..4de92a8d8d 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGeneratorVerifyTests/SwaggerGeneratorVerifyTests.cs @@ -1,15 +1,20 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; using Microsoft.AspNetCore.Routing; using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen.Test.Fixtures; using Swashbuckle.AspNetCore.TestSupport; using VerifyXunit; using Xunit; @@ -124,36 +129,724 @@ public Task ActionWithProvidedOpenApiMetadata() return Verifier.Verify(document); } + [Fact] + public Task ActionWithProducesAttributeAndProvidedOpenApiOperation() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithProducesAttribute)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() + { + new OpenApiOperation + { + OperationId = "OperationIdSetInMetadata", + Responses = new() + { + ["200"] = new() + { + Content = new Dictionary() + { + ["application/someMediaType"] = new() + } + } + } + } + }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + actionDescriptor, + methodInfo, + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + supportedResponseTypes: new[] + { + new ApiResponseType() + { + StatusCode = 200, + Type = typeof(TestDto) + } + }), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionWithConsumesAttributeAndProvidedOpenApiOperation() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithConsumesAttribute)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() + { + new OpenApiOperation + { + OperationId = "OperationIdSetInMetadata", + RequestBody = new() + { + Content = new Dictionary() + { + ["application/someMediaType"] = new() + } + } + } + }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + actionDescriptor, + methodInfo, + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription() + { + Name = "param", + Source = BindingSource.Body, + ModelMetadata = ModelMetadataFactory.CreateForType(typeof(TestDto)) + } + }), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionWithParameterAndProvidedOpenApiOperation() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithParameter)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() + { + new OpenApiOperation + { + OperationId = "OperationIdSetInMetadata", + Parameters = new List() + { + new OpenApiParameter + { + Name = "ParameterInMetadata" + } + } + } + }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + actionDescriptor, + methodInfo, + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription + { + Name = "ParameterInMetadata", + ModelMetadata = ModelMetadataFactory.CreateForType(typeof(string)) + } + }), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionHasObsoleteAttribute() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithObsoleteAttribute), groupName: "v1", httpMethod: "POST", relativePath: "resource"), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task SortKeySelectorIsSpecified() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource3"), + + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource1"), + + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource2"), + }, + options: new SwaggerGeneratorOptions + { + SwaggerDocs = new Dictionary + { + ["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" } + }, + SortKeySelector = (apiDesc) => apiDesc.RelativePath + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task TagSelectorIsSpecified() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource"), + }, + options: new SwaggerGeneratorOptions + { + SwaggerDocs = new Dictionary + { + ["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" } + }, + TagsSelector = (apiDesc) => new[] { apiDesc.RelativePath } + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task EndpointMetadataHasTags() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithParameter)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() { new TagsAttribute("Some", "Tags", "Here") }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create(actionDescriptor, methodInfo, groupName: "v1", httpMethod: "POST", relativePath: "resource"), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Theory] + [InlineData(nameof(BindingSource.Query))] + [InlineData(nameof(BindingSource.Header))] + [InlineData(nameof(BindingSource.Path))] + [InlineData(null)] + public Task ApiParametersThatAreNotBoundToBodyOrForm(string bindingSourceId) + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithParameter), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param", + Source = (bindingSourceId != null) ? new BindingSource(bindingSourceId, null, false, true) : null + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document).UseParameters(bindingSourceId); + } + + [Fact] + public Task OperationHasSwaggerIgnoreAttribute() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithSwaggerIgnoreAttribute), + groupName: "v1", + httpMethod: "POST", + relativePath: "ignored", + parameterDescriptions: Array.Empty() + ) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionParameterHasBindNeverAttribute() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithParameterWithBindNeverAttribute), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Query + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionParameterHasSwaggerIgnoreAttribute() + { + var subject = Subject( + new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithIntParameterWithSwaggerIgnoreAttribute), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Query + } + } + ) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + [Theory] [InlineData(nameof(FakeController.ActionWithAcceptFromHeaderParameter))] [InlineData(nameof(FakeController.ActionWithContentTypeFromHeaderParameter))] [InlineData(nameof(FakeController.ActionWithAuthorizationFromHeaderParameter))] public Task ActionsWithIllegalHeaderParameters(string action) { - var illegalParameter = typeof(FakeController).GetMethod(action).GetParameters()[0]; - var fromHeaderAttribute = illegalParameter.GetCustomAttribute(); + var illegalParameter = typeof(FakeController).GetMethod(action).GetParameters()[0]; + var fromHeaderAttribute = illegalParameter.GetCustomAttribute(); + + var subject = Subject( + new[] + { + ApiDescriptionFactory.Create( + c => action, + groupName: "v1", + httpMethod: "GET", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription + { + Name = fromHeaderAttribute?.Name ?? illegalParameter.Name, + Source = BindingSource.Header, + ModelMetadata = ModelMetadataFactory.CreateForParameter(illegalParameter) + }, + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Header + } + } + ) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document).UseParameters(action); + } + + [Theory] + [InlineData(nameof(FakeController.ActionWithAcceptFromHeaderParameter))] + [InlineData(nameof(FakeController.ActionWithContentTypeFromHeaderParameter))] + [InlineData(nameof(FakeController.ActionWithAuthorizationFromHeaderParameter))] + public Task ActionParameterIsIllegalHeaderParameterWithProvidedOpenApiOperation(string action) + { + var illegalParameter = typeof(FakeController).GetMethod(action).GetParameters()[0]; + var fromHeaderAttribute = illegalParameter.GetCustomAttribute(); + var illegalParameterName = fromHeaderAttribute?.Name ?? illegalParameter.Name; + var methodInfo = typeof(FakeController).GetMethod(action); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() + { + new OpenApiOperation + { + OperationId = "OperationIdSetInMetadata", + Parameters = new List() + { + new OpenApiParameter + { + Name = illegalParameterName, + }, + new OpenApiParameter + { + Name = "param", + } + } + } + }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + actionDescriptor, + methodInfo, + groupName: "v1", + httpMethod: "GET", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription + { + Name = illegalParameterName, + Source = BindingSource.Header, + ModelMetadata = ModelMetadataFactory.CreateForParameter(illegalParameter) + }, + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Header, + ModelMetadata = ModelMetadataFactory.CreateForType(typeof(string)) + } + }), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document) + .UseParameters(action) + .UseMethodName("IllegalHeaderParameterWithOpenApiOperation"); + } + + [Fact] + public Task ApiParameterIsBoundToPath() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithParameter), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Path + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Theory] + [InlineData(nameof(FakeController.ActionWithParameterWithRequiredAttribute))] + [InlineData(nameof(FakeController.ActionWithParameterWithBindRequiredAttribute))] + public Task ActionWithRequiredQueryParameter(string action) + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + methodInfo: typeof(FakeController).GetMethod(action), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Query + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document).UseParameters(action); + } + + [Theory] + [InlineData(nameof(FakeController.ActionWithParameterWithRequiredAttribute))] + [InlineData(nameof(FakeController.ActionWithParameterWithBindRequiredAttribute))] + public Task ActionWithRequiredBodyParameter(string action) + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + methodInfo: typeof(FakeController).GetMethod(action), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Body, + } + }, + supportedRequestFormats: new[] + { + new ApiRequestFormat { MediaType = "application/json" } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document).UseParameters(action); + } + +#if NET7_0_OR_GREATER + [Fact] + public Task ActionWithRequiredMember() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + methodInfo: typeof(FakeController).GetMethod(nameof(FakeController.ActionWithRequiredMember)), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param", + Source = BindingSource.Query, + ModelMetadata = ModelMetadataFactory.CreateForProperty(typeof(FakeController.TypeWithRequiredProperty), "RequiredProperty") + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task EndpointMetadataHasSummaryAttribute() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithParameter)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() { new EndpointSummaryAttribute("A Test Summary") }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create(actionDescriptor, methodInfo, groupName: "v1", httpMethod: "POST", relativePath: "resource"), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + [Fact] + public Task EndpointMetadataHasDescriptionAttribute() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithParameter)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() { new EndpointDescriptionAttribute("A Test Description") }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; var subject = Subject( - new[] + apiDescriptions: new[] + { + ApiDescriptionFactory.Create(actionDescriptor, methodInfo, groupName: "v1", httpMethod: "POST", relativePath: "resource"), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } +#endif + + [Fact] + public Task ApiParameterDescriptionForBodyIsRequired() + { + static void Execute(object obj) { } + + Action action = Execute; + + var actionDescriptor = new ActionDescriptor + { + RouteValues = new Dictionary + { + ["controller"] = "Foo", + } + }; + + var parameter = new ApiParameterDescription + { + Name = "obj", + Source = BindingSource.Body, + IsRequired = true, + Type = typeof(object), + ModelMetadata = ModelMetadataFactory.CreateForParameter(action.Method.GetParameters()[0]) + }; + + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create(actionDescriptor, action.Method, groupName: "v1", httpMethod: "POST", relativePath: "resource", parameterDescriptions: new[]{ parameter }), + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ApiParameterHasNoCorrespondingActionParameter() + { + var subject = Subject( + apiDescriptions: new[] { ApiDescriptionFactory.Create( - c => action, + c => nameof(c.ActionWithNoParameters), groupName: "v1", - httpMethod: "GET", + httpMethod: "POST", relativePath: "resource", - parameterDescriptions: new[] + parameterDescriptions: new [] { new ApiParameterDescription { - Name = fromHeaderAttribute?.Name ?? illegalParameter.Name, - Source = BindingSource.Header, - ModelMetadata = ModelMetadataFactory.CreateForParameter(illegalParameter) + Name = "param", + Source = BindingSource.Path + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ApiParametersThatAreBoundToForm() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithMultipleParameters), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new [] + { + new ApiParameterDescription + { + Name = "param1", + Source = BindingSource.Form, }, new ApiParameterDescription { - Name = "param", - Source = BindingSource.Header + Name = "param2", + Source = BindingSource.Form, } + } ) } @@ -161,19 +854,19 @@ public Task ActionsWithIllegalHeaderParameters(string action) var document = subject.GetSwagger("v1"); - return Verifier.Verify(document).UseParameters(action); + return Verifier.Verify(document); } [Theory] - [InlineData(nameof(FakeController.ActionWithParameterWithRequiredAttribute))] - [InlineData(nameof(FakeController.ActionWithParameterWithBindRequiredAttribute))] - public Task ActionWithRequiredParameter(string action) + [InlineData("Body")] + [InlineData("Form")] + public Task ActionHasConsumesAttribute(string bindingSourceId) { var subject = Subject( apiDescriptions: new[] { - ApiDescriptionFactory.Create( - methodInfo: typeof(FakeController).GetMethod(action), + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithConsumesAttribute), groupName: "v1", httpMethod: "POST", relativePath: "resource", @@ -182,7 +875,7 @@ public Task ActionWithRequiredParameter(string action) new ApiParameterDescription { Name = "param", - Source = BindingSource.Query + Source = new BindingSource(bindingSourceId, null, false, true) } }) } @@ -190,28 +883,169 @@ public Task ActionWithRequiredParameter(string action) var document = subject.GetSwagger("v1"); - return Verifier.Verify(document).UseParameters(action); + return Verifier.Verify(document).UseParameters(bindingSourceId); } -#if NET7_0_OR_GREATER [Fact] - public Task ActionWithRequiredMember() + public Task ActionWithReturnValueAndSupportedResponseTypes() { var subject = Subject( apiDescriptions: new[] { - ApiDescriptionFactory.Create( - methodInfo: typeof(FakeController).GetMethod(nameof(FakeController.ActionWithRequiredMember)), + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithReturnValue), groupName: "v1", httpMethod: "POST", relativePath: "resource", - parameterDescriptions: new [] + supportedResponseTypes: new [] + { + new ApiResponseType + { + ApiResponseFormats = new [] { new ApiResponseFormat { MediaType = "application/json" } }, + StatusCode = 200, + }, + new ApiResponseType + { + ApiResponseFormats = new [] { new ApiResponseFormat { MediaType = "application/json" } }, + StatusCode = 400 + }, + new ApiResponseType + { + ApiResponseFormats = new [] { new ApiResponseFormat { MediaType = "application/json" } }, + StatusCode = 422 + }, + new ApiResponseType + { + ApiResponseFormats = new [] { new ApiResponseFormat { MediaType = "application/json" } }, + IsDefaultResponse = true + } + + } + ) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionHasFileResult() + { + var apiDescription = ApiDescriptionFactory.Create( + c => nameof(c.ActionWithFileResult), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + supportedResponseTypes: new[] + { + new ApiResponseType + { + ApiResponseFormats = new [] { new ApiResponseFormat { MediaType = "application/zip" } }, + StatusCode = 200, + Type = typeof(FileContentResult) + } + }); + + // ASP.NET Core sets ModelMetadata to null for FileResults + apiDescription.SupportedResponseTypes[0].ModelMetadata = null; + + var subject = Subject( + apiDescriptions: new[] { apiDescription } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionHasProducesAttribute() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithProducesAttribute), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + supportedResponseTypes: new [] + { + new ApiResponseType + { + ApiResponseFormats = new [] { new ApiResponseFormat { MediaType = "application/json" } }, + StatusCode = 200, + } + }) + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ConflictingActionsResolverIsSpecified() + { + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource"), + + ApiDescriptionFactory.Create( + c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource") + }, + options: new SwaggerGeneratorOptions + { + SwaggerDocs = new Dictionary + { + ["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" } + }, + ConflictingActionsResolver = (apiDescriptions) => apiDescriptions.First() + } + ); + + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } + + [Fact] + public Task ActionHavingFromFormAttributeButNotWithIFormFile() + { + var parameterInfo = typeof(FakeController) + .GetMethod(nameof(FakeController.ActionHavingFromFormAttributeButNotWithIFormFile)) + .GetParameters()[0]; + + var fileUploadParameterInfo = typeof(FakeController) + .GetMethod(nameof(FakeController.ActionHavingFromFormAttributeButNotWithIFormFile)) + .GetParameters()[1]; + + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionHavingFromFormAttributeButNotWithIFormFile), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new[] { new ApiParameterDescription { - Name = "param", - Source = BindingSource.Query, - ModelMetadata = ModelMetadataFactory.CreateForProperty(typeof(FakeController.TypeWithRequiredProperty), "RequiredProperty") + Name = "param1", // Name of the parameter + Type = typeof(string), // Type of the parameter + ParameterDescriptor = new ControllerParameterDescriptor { ParameterInfo = parameterInfo } + }, + new ApiParameterDescription + { + Name = "param2", // Name of the parameter + Type = typeof(IFormFile), // Type of the parameter + ParameterDescriptor = new ControllerParameterDescriptor { ParameterInfo = fileUploadParameterInfo } } }) } @@ -221,7 +1055,52 @@ public Task ActionWithRequiredMember() return Verifier.Verify(document); } -#endif + + [Fact] + public Task ActionHavingFromFormAttributeWithSwaggerIgnore() + { + var propertyIgnored = typeof(SwaggerIngoreAnnotatedType).GetProperty(nameof(SwaggerIngoreAnnotatedType.IgnoredString)); + var modelMetadataIgnored = new DefaultModelMetadata( + new DefaultModelMetadataProvider(new FakeICompositeMetadataDetailsProvider()), + new FakeICompositeMetadataDetailsProvider(), + new DefaultMetadataDetails(ModelMetadataIdentity.ForProperty(propertyIgnored, typeof(string), typeof(SwaggerIngoreAnnotatedType)), ModelAttributes.GetAttributesForProperty(typeof(SwaggerIngoreAnnotatedType), propertyIgnored))); + + var propertyNotIgnored = typeof(SwaggerIngoreAnnotatedType).GetProperty(nameof(SwaggerIngoreAnnotatedType.NotIgnoredString)); + var modelMetadataNotIgnored = new DefaultModelMetadata( + new DefaultModelMetadataProvider(new FakeICompositeMetadataDetailsProvider()), + new FakeICompositeMetadataDetailsProvider(), + new DefaultMetadataDetails(ModelMetadataIdentity.ForProperty(propertyNotIgnored, typeof(string), typeof(SwaggerIngoreAnnotatedType)), ModelAttributes.GetAttributesForProperty(typeof(SwaggerIngoreAnnotatedType), propertyNotIgnored))); + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + c => nameof(c.ActionHavingFromFormAttributeWithSwaggerIgnore), + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription + { + Name = nameof(SwaggerIngoreAnnotatedType.IgnoredString), + Source = BindingSource.Form, + Type = typeof(string), + ModelMetadata = modelMetadataIgnored + }, + new ApiParameterDescription + { + Name = nameof(SwaggerIngoreAnnotatedType.NotIgnoredString), + Source = BindingSource.Form, + Type = typeof(string), + ModelMetadata = modelMetadataNotIgnored + } + }) + } + ); + var document = subject.GetSwagger("v1"); + + return Verifier.Verify(document); + } private static SwaggerGenerator Subject( IEnumerable apiDescriptions,