Skip to content

Commit 7722b87

Browse files
committed
Add test for alternate Swagger route
1 parent 5ab8b22 commit 7722b87

File tree

129 files changed

+15579
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+15579
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using FluentAssertions;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Kiota.Http.HttpClientLibrary;
4+
using OpenApiKiotaEndToEndTests.Links.GeneratedCode;
5+
using OpenApiKiotaEndToEndTests.Links.GeneratedCode.Models;
6+
using OpenApiTests;
7+
using OpenApiTests.Links;
8+
using Swashbuckle.AspNetCore.Swagger;
9+
using TestBuildingBlocks;
10+
using Xunit;
11+
using Xunit.Abstractions;
12+
13+
namespace OpenApiKiotaEndToEndTests.Links;
14+
15+
public sealed class AlternateOpenApiRouteTests : IClassFixture<IntegrationTestContext<OpenApiStartup<LinkDbContext>, LinkDbContext>>
16+
{
17+
private readonly IntegrationTestContext<OpenApiStartup<LinkDbContext>, LinkDbContext> _testContext;
18+
private readonly TestableHttpClientRequestAdapterFactory _requestAdapterFactory;
19+
private readonly LinkFakers _fakers = new();
20+
21+
public AlternateOpenApiRouteTests(IntegrationTestContext<OpenApiStartup<LinkDbContext>, LinkDbContext> testContext, ITestOutputHelper testOutputHelper)
22+
{
23+
_testContext = testContext;
24+
_requestAdapterFactory = new TestableHttpClientRequestAdapterFactory(testOutputHelper);
25+
26+
testContext.ConfigureServices(services =>
27+
services.Configure<SwaggerOptions>(options => options.RouteTemplate = "api-docs/{documentName}/swagger.yaml"));
28+
29+
testContext.UseController<ExcursionsController>();
30+
}
31+
32+
[Fact]
33+
public async Task DescribedBy_link_matches_alternate_OpenAPI_route()
34+
{
35+
// Arrange
36+
Excursion excursion = _fakers.Excursion.Generate();
37+
38+
using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
39+
var apiClient = new LinksClient(requestAdapter);
40+
41+
await _testContext.RunOnDatabaseAsync(async dbContext =>
42+
{
43+
dbContext.Excursions.Add(excursion);
44+
await dbContext.SaveChangesAsync();
45+
});
46+
47+
// Act
48+
ExcursionPrimaryResponseDocument? response = await apiClient.Excursions[excursion.StringId].GetAsync();
49+
50+
// Assert
51+
response.ShouldNotBeNull();
52+
response.Links.ShouldNotBeNull();
53+
response.Links.Describedby.Should().Be("api-docs/v1/swagger.yaml");
54+
}
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
// <auto-generated/>
2+
using Microsoft.Kiota.Abstractions.Serialization;
3+
using Microsoft.Kiota.Abstractions;
4+
using OpenApiKiotaEndToEndTests.Links.GeneratedCode.Accommodations.Item;
5+
using OpenApiKiotaEndToEndTests.Links.GeneratedCode.Models;
6+
using System.Collections.Generic;
7+
using System.IO;
8+
using System.Linq;
9+
using System.Threading.Tasks;
10+
using System.Threading;
11+
using System;
12+
namespace OpenApiKiotaEndToEndTests.Links.GeneratedCode.Accommodations {
13+
/// <summary>
14+
/// Builds and executes requests for operations under \accommodations
15+
/// </summary>
16+
public class AccommodationsRequestBuilder : BaseRequestBuilder {
17+
/// <summary>Gets an item from the OpenApiKiotaEndToEndTests.Links.GeneratedCode.accommodations.item collection</summary>
18+
/// <param name="position">The identifier of the accommodation to retrieve.</param>
19+
public AccommodationsItemRequestBuilder this[string position] { get {
20+
var urlTplParams = new Dictionary<string, object>(PathParameters);
21+
urlTplParams.Add("id", position);
22+
return new AccommodationsItemRequestBuilder(urlTplParams, RequestAdapter);
23+
} }
24+
/// <summary>
25+
/// Instantiates a new AccommodationsRequestBuilder and sets the default values.
26+
/// </summary>
27+
/// <param name="pathParameters">Path parameters for the request</param>
28+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
29+
public AccommodationsRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/accommodations{?query*}", pathParameters) {
30+
}
31+
/// <summary>
32+
/// Instantiates a new AccommodationsRequestBuilder and sets the default values.
33+
/// </summary>
34+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
35+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
36+
public AccommodationsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/accommodations{?query*}", rawUrl) {
37+
}
38+
/// <summary>
39+
/// Retrieves a collection of accommodations.
40+
/// </summary>
41+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
42+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
43+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
44+
#nullable enable
45+
public async Task<AccommodationCollectionResponseDocument?> GetAsync(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default) {
46+
#nullable restore
47+
#else
48+
public async Task<AccommodationCollectionResponseDocument> GetAsync(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default) {
49+
#endif
50+
var requestInfo = ToGetRequestInformation(requestConfiguration);
51+
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>> {
52+
{"400", ErrorResponseDocument.CreateFromDiscriminatorValue},
53+
};
54+
return await RequestAdapter.SendAsync<AccommodationCollectionResponseDocument>(requestInfo, AccommodationCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
55+
}
56+
/// <summary>
57+
/// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
58+
/// </summary>
59+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
60+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
61+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
62+
#nullable enable
63+
public async Task<Stream?> HeadAsync(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default) {
64+
#nullable restore
65+
#else
66+
public async Task<Stream> HeadAsync(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default) {
67+
#endif
68+
var requestInfo = ToHeadRequestInformation(requestConfiguration);
69+
return await RequestAdapter.SendPrimitiveAsync<Stream>(requestInfo, default, cancellationToken).ConfigureAwait(false);
70+
}
71+
/// <summary>
72+
/// Creates a new accommodation.
73+
/// </summary>
74+
/// <param name="body">The request body</param>
75+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
76+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
77+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
78+
#nullable enable
79+
public async Task<AccommodationPrimaryResponseDocument?> PostAsync(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default) {
80+
#nullable restore
81+
#else
82+
public async Task<AccommodationPrimaryResponseDocument> PostAsync(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default) {
83+
#endif
84+
_ = body ?? throw new ArgumentNullException(nameof(body));
85+
var requestInfo = ToPostRequestInformation(body, requestConfiguration);
86+
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>> {
87+
{"400", ErrorResponseDocument.CreateFromDiscriminatorValue},
88+
{"403", ErrorResponseDocument.CreateFromDiscriminatorValue},
89+
{"404", ErrorResponseDocument.CreateFromDiscriminatorValue},
90+
{"409", ErrorResponseDocument.CreateFromDiscriminatorValue},
91+
{"422", ErrorResponseDocument.CreateFromDiscriminatorValue},
92+
};
93+
return await RequestAdapter.SendAsync<AccommodationPrimaryResponseDocument>(requestInfo, AccommodationPrimaryResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
94+
}
95+
/// <summary>
96+
/// Retrieves a collection of accommodations.
97+
/// </summary>
98+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
99+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
100+
#nullable enable
101+
public RequestInformation ToGetRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>>? requestConfiguration = default) {
102+
#nullable restore
103+
#else
104+
public RequestInformation ToGetRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>> requestConfiguration = default) {
105+
#endif
106+
var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
107+
requestInfo.Configure(requestConfiguration);
108+
requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json");
109+
return requestInfo;
110+
}
111+
/// <summary>
112+
/// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
113+
/// </summary>
114+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
115+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
116+
#nullable enable
117+
public RequestInformation ToHeadRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>>? requestConfiguration = default) {
118+
#nullable restore
119+
#else
120+
public RequestInformation ToHeadRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>> requestConfiguration = default) {
121+
#endif
122+
var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
123+
requestInfo.Configure(requestConfiguration);
124+
return requestInfo;
125+
}
126+
/// <summary>
127+
/// Creates a new accommodation.
128+
/// </summary>
129+
/// <param name="body">The request body</param>
130+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
131+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
132+
#nullable enable
133+
public RequestInformation ToPostRequestInformation(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>>? requestConfiguration = default) {
134+
#nullable restore
135+
#else
136+
public RequestInformation ToPostRequestInformation(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>> requestConfiguration = default) {
137+
#endif
138+
_ = body ?? throw new ArgumentNullException(nameof(body));
139+
var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
140+
requestInfo.Configure(requestConfiguration);
141+
requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json");
142+
requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json", body);
143+
return requestInfo;
144+
}
145+
/// <summary>
146+
/// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
147+
/// </summary>
148+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
149+
public AccommodationsRequestBuilder WithUrl(string rawUrl) {
150+
return new AccommodationsRequestBuilder(rawUrl, RequestAdapter);
151+
}
152+
/// <summary>
153+
/// Retrieves a collection of accommodations.
154+
/// </summary>
155+
public class AccommodationsRequestBuilderGetQueryParameters {
156+
/// <summary>For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.</summary>
157+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
158+
#nullable enable
159+
[QueryParameter("query")]
160+
public string? Query { get; set; }
161+
#nullable restore
162+
#else
163+
[QueryParameter("query")]
164+
public string Query { get; set; }
165+
#endif
166+
}
167+
/// <summary>
168+
/// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
169+
/// </summary>
170+
public class AccommodationsRequestBuilderHeadQueryParameters {
171+
/// <summary>For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.</summary>
172+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
173+
#nullable enable
174+
[QueryParameter("query")]
175+
public string? Query { get; set; }
176+
#nullable restore
177+
#else
178+
[QueryParameter("query")]
179+
public string Query { get; set; }
180+
#endif
181+
}
182+
/// <summary>
183+
/// Creates a new accommodation.
184+
/// </summary>
185+
public class AccommodationsRequestBuilderPostQueryParameters {
186+
/// <summary>For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.</summary>
187+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
188+
#nullable enable
189+
[QueryParameter("query")]
190+
public string? Query { get; set; }
191+
#nullable restore
192+
#else
193+
[QueryParameter("query")]
194+
public string Query { get; set; }
195+
#endif
196+
}
197+
}
198+
}

0 commit comments

Comments
 (0)