Skip to content

Commit

Permalink
Add test for alternate Swagger route
Browse files Browse the repository at this point in the history
  • Loading branch information
bkoelman committed Mar 27, 2024
1 parent 5ab8b22 commit 7722b87
Show file tree
Hide file tree
Showing 129 changed files with 15,579 additions and 0 deletions.
55 changes: 55 additions & 0 deletions test/OpenApiKiotaEndToEndTests/Links/AlternateOpenApiRouteTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Kiota.Http.HttpClientLibrary;
using OpenApiKiotaEndToEndTests.Links.GeneratedCode;
using OpenApiKiotaEndToEndTests.Links.GeneratedCode.Models;
using OpenApiTests;
using OpenApiTests.Links;
using Swashbuckle.AspNetCore.Swagger;
using TestBuildingBlocks;
using Xunit;
using Xunit.Abstractions;

namespace OpenApiKiotaEndToEndTests.Links;

public sealed class AlternateOpenApiRouteTests : IClassFixture<IntegrationTestContext<OpenApiStartup<LinkDbContext>, LinkDbContext>>
{
private readonly IntegrationTestContext<OpenApiStartup<LinkDbContext>, LinkDbContext> _testContext;
private readonly TestableHttpClientRequestAdapterFactory _requestAdapterFactory;
private readonly LinkFakers _fakers = new();

public AlternateOpenApiRouteTests(IntegrationTestContext<OpenApiStartup<LinkDbContext>, LinkDbContext> testContext, ITestOutputHelper testOutputHelper)
{
_testContext = testContext;
_requestAdapterFactory = new TestableHttpClientRequestAdapterFactory(testOutputHelper);

testContext.ConfigureServices(services =>
services.Configure<SwaggerOptions>(options => options.RouteTemplate = "api-docs/{documentName}/swagger.yaml"));

testContext.UseController<ExcursionsController>();
}

[Fact]
public async Task DescribedBy_link_matches_alternate_OpenAPI_route()
{
// Arrange
Excursion excursion = _fakers.Excursion.Generate();

using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
var apiClient = new LinksClient(requestAdapter);

await _testContext.RunOnDatabaseAsync(async dbContext =>
{
dbContext.Excursions.Add(excursion);
await dbContext.SaveChangesAsync();
});

// Act
ExcursionPrimaryResponseDocument? response = await apiClient.Excursions[excursion.StringId].GetAsync();

// Assert
response.ShouldNotBeNull();
response.Links.ShouldNotBeNull();
response.Links.Describedby.Should().Be("api-docs/v1/swagger.yaml");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
// <auto-generated/>
using Microsoft.Kiota.Abstractions.Serialization;
using Microsoft.Kiota.Abstractions;
using OpenApiKiotaEndToEndTests.Links.GeneratedCode.Accommodations.Item;
using OpenApiKiotaEndToEndTests.Links.GeneratedCode.Models;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
using System;
namespace OpenApiKiotaEndToEndTests.Links.GeneratedCode.Accommodations {
/// <summary>
/// Builds and executes requests for operations under \accommodations
/// </summary>
public class AccommodationsRequestBuilder : BaseRequestBuilder {
/// <summary>Gets an item from the OpenApiKiotaEndToEndTests.Links.GeneratedCode.accommodations.item collection</summary>
/// <param name="position">The identifier of the accommodation to retrieve.</param>
public AccommodationsItemRequestBuilder this[string position] { get {
var urlTplParams = new Dictionary<string, object>(PathParameters);
urlTplParams.Add("id", position);
return new AccommodationsItemRequestBuilder(urlTplParams, RequestAdapter);
} }
/// <summary>
/// Instantiates a new AccommodationsRequestBuilder and sets the default values.
/// </summary>
/// <param name="pathParameters">Path parameters for the request</param>
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
public AccommodationsRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/accommodations{?query*}", pathParameters) {
}
/// <summary>
/// Instantiates a new AccommodationsRequestBuilder and sets the default values.
/// </summary>
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
public AccommodationsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/accommodations{?query*}", rawUrl) {
}
/// <summary>
/// Retrieves a collection of accommodations.
/// </summary>
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public async Task<AccommodationCollectionResponseDocument?> GetAsync(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default) {
#nullable restore
#else
public async Task<AccommodationCollectionResponseDocument> GetAsync(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default) {
#endif
var requestInfo = ToGetRequestInformation(requestConfiguration);
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>> {
{"400", ErrorResponseDocument.CreateFromDiscriminatorValue},
};
return await RequestAdapter.SendAsync<AccommodationCollectionResponseDocument>(requestInfo, AccommodationCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
/// </summary>
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public async Task<Stream?> HeadAsync(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default) {
#nullable restore
#else
public async Task<Stream> HeadAsync(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default) {
#endif
var requestInfo = ToHeadRequestInformation(requestConfiguration);
return await RequestAdapter.SendPrimitiveAsync<Stream>(requestInfo, default, cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// Creates a new accommodation.
/// </summary>
/// <param name="body">The request body</param>
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public async Task<AccommodationPrimaryResponseDocument?> PostAsync(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default) {
#nullable restore
#else
public async Task<AccommodationPrimaryResponseDocument> PostAsync(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default) {
#endif
_ = body ?? throw new ArgumentNullException(nameof(body));
var requestInfo = ToPostRequestInformation(body, requestConfiguration);
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>> {
{"400", ErrorResponseDocument.CreateFromDiscriminatorValue},
{"403", ErrorResponseDocument.CreateFromDiscriminatorValue},
{"404", ErrorResponseDocument.CreateFromDiscriminatorValue},
{"409", ErrorResponseDocument.CreateFromDiscriminatorValue},
{"422", ErrorResponseDocument.CreateFromDiscriminatorValue},
};
return await RequestAdapter.SendAsync<AccommodationPrimaryResponseDocument>(requestInfo, AccommodationPrimaryResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// Retrieves a collection of accommodations.
/// </summary>
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public RequestInformation ToGetRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>>? requestConfiguration = default) {
#nullable restore
#else
public RequestInformation ToGetRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderGetQueryParameters>> requestConfiguration = default) {
#endif
var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
requestInfo.Configure(requestConfiguration);
requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json");
return requestInfo;
}
/// <summary>
/// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
/// </summary>
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public RequestInformation ToHeadRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>>? requestConfiguration = default) {
#nullable restore
#else
public RequestInformation ToHeadRequestInformation(Action<RequestConfiguration<AccommodationsRequestBuilderHeadQueryParameters>> requestConfiguration = default) {
#endif
var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
requestInfo.Configure(requestConfiguration);
return requestInfo;
}
/// <summary>
/// Creates a new accommodation.
/// </summary>
/// <param name="body">The request body</param>
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public RequestInformation ToPostRequestInformation(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>>? requestConfiguration = default) {
#nullable restore
#else
public RequestInformation ToPostRequestInformation(AccommodationPostRequestDocument body, Action<RequestConfiguration<AccommodationsRequestBuilderPostQueryParameters>> requestConfiguration = default) {
#endif
_ = body ?? throw new ArgumentNullException(nameof(body));
var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
requestInfo.Configure(requestConfiguration);
requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json");
requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json", body);
return requestInfo;
}
/// <summary>
/// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
/// </summary>
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
public AccommodationsRequestBuilder WithUrl(string rawUrl) {
return new AccommodationsRequestBuilder(rawUrl, RequestAdapter);
}
/// <summary>
/// Retrieves a collection of accommodations.
/// </summary>
public class AccommodationsRequestBuilderGetQueryParameters {
/// <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>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
[QueryParameter("query")]
public string? Query { get; set; }
#nullable restore
#else
[QueryParameter("query")]
public string Query { get; set; }
#endif
}
/// <summary>
/// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
/// </summary>
public class AccommodationsRequestBuilderHeadQueryParameters {
/// <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>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
[QueryParameter("query")]
public string? Query { get; set; }
#nullable restore
#else
[QueryParameter("query")]
public string Query { get; set; }
#endif
}
/// <summary>
/// Creates a new accommodation.
/// </summary>
public class AccommodationsRequestBuilderPostQueryParameters {
/// <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>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
[QueryParameter("query")]
public string? Query { get; set; }
#nullable restore
#else
[QueryParameter("query")]
public string Query { get; set; }
#endif
}
}
}
Loading

0 comments on commit 7722b87

Please sign in to comment.