Skip to content

[OpenAPI] Add endpoint for create event details #212 #261

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

33 changes: 33 additions & 0 deletions src/AzureOpenAIProxy.ApiApp/Endpoints/AdminEventEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,37 @@ public static RouteHandlerBuilder AddUpdateAdminEvents(this WebApplication app)

return builder;
}

/// <summary>
/// Adds the admin event endpoint
/// </summary>
/// <param name="app"><see cref="WebApplication"/> instance.</param>
/// <returns>Returns <see cref="RouteHandlerBuilder"/> instance.</returns>
public static RouteHandlerBuilder CreateAdminEvent(this WebApplication app)
{
var builder = app.MapPost(AdminEndpointUrls.AdminEvents, async (
[FromBody] AdminEventDetails payload,
HttpRequest request) =>
{
return await Task.FromResult(Results.Ok());
})
// TODO: Check both request/response payloads
.Accepts<AdminEventDetails>(contentType: "application/json")
.Produces<AdminEventDetails>(statusCode: StatusCodes.Status200OK, contentType: "application/json")
// TODO: Check both request/response payloads
.Produces(statusCode: StatusCodes.Status400BadRequest)
.Produces(statusCode: StatusCodes.Status401Unauthorized)
.Produces<string>(statusCode: StatusCodes.Status500InternalServerError, contentType: "text/plain")
.WithTags("admin")
.WithName("CreateAdminEvent")
.WithOpenApi(operation =>
{
operation.Summary = "Create admin event";
operation.Description = "Create admin event";

return operation;
});

return builder;
}
}
1 change: 1 addition & 0 deletions src/AzureOpenAIProxy.ApiApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,6 @@
app.AddAdminEvents();
app.AddAdminEventList();
app.AddUpdateAdminEvents();
app.CreateAdminEvent();

await app.RunAsync();
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
using System.Text.Json;
using System.Net;

using AzureOpenAIProxy.AppHost.Tests.Fixtures;

using FluentAssertions;

using System.Text;

namespace AzureOpenAIProxy.AppHost.Tests.ApiApp.Endpoints;

public class AdminCreateEventsOpenApiTests(AspireAppHostFixture host) : IClassFixture<AspireAppHostFixture>
{
[Fact]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Path()
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("paths")
.GetProperty("/admin/events");
result.ValueKind.Should().Be(JsonValueKind.Object);
}

[Fact]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Verb()
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("paths")
.GetProperty("/admin/events")
.TryGetProperty("post", out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.Object);
}

[Theory]
[InlineData("admin")]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Tags(string tag)
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("paths")
.GetProperty("/admin/events")
.GetProperty("post")
.TryGetProperty("tags", out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.Array);
result.EnumerateArray().Select(p => p.GetString()).Should().Contain(tag);
}

[Theory]
[InlineData("summary")]
[InlineData("description")]
[InlineData("operationId")]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Value(string attribute)
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("paths")
.GetProperty("/admin/events")
.GetProperty("post")
.TryGetProperty(attribute, out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.String);
}

[Theory]
[InlineData("requestBody")]
[InlineData("responses")]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Object(string attribute)
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("paths")
.GetProperty("/admin/events")
.GetProperty("post")
.TryGetProperty(attribute, out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.Object);
}


[Theory]
[InlineData("200")]
[InlineData("400")]
[InlineData("401")]
[InlineData("500")]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Response(string attribute)
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("paths")
.GetProperty("/admin/events")
.GetProperty("post")
.GetProperty("responses")
.TryGetProperty(attribute, out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.Object);
}

[Fact]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Schemas()
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("components")
.TryGetProperty("schemas", out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.Object);
}

[Fact]
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Model()
{
// Arrange
using var httpClient = host.App!.CreateHttpClient("apiapp");

// Act
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);

// Assert
var result = openapi!.RootElement.GetProperty("components")
.GetProperty("schemas")
.TryGetProperty("AdminEventDetails", out var property) ? property : default;
result.ValueKind.Should().Be(JsonValueKind.Object);
}
}