Skip to content

Commit 81c8c6e

Browse files
authored
[OpenAPI] Add endpoint for create event details #212 (#261)
1 parent 30fd8a6 commit 81c8c6e

File tree

3 files changed

+198
-0
lines changed

3 files changed

+198
-0
lines changed

src/AzureOpenAIProxy.ApiApp/Endpoints/AdminEventEndpoints.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,37 @@ public static RouteHandlerBuilder AddUpdateAdminEvents(this WebApplication app)
105105

106106
return builder;
107107
}
108+
109+
/// <summary>
110+
/// Adds the admin event endpoint
111+
/// </summary>
112+
/// <param name="app"><see cref="WebApplication"/> instance.</param>
113+
/// <returns>Returns <see cref="RouteHandlerBuilder"/> instance.</returns>
114+
public static RouteHandlerBuilder CreateAdminEvent(this WebApplication app)
115+
{
116+
var builder = app.MapPost(AdminEndpointUrls.AdminEvents, async (
117+
[FromBody] AdminEventDetails payload,
118+
HttpRequest request) =>
119+
{
120+
return await Task.FromResult(Results.Ok());
121+
})
122+
// TODO: Check both request/response payloads
123+
.Accepts<AdminEventDetails>(contentType: "application/json")
124+
.Produces<AdminEventDetails>(statusCode: StatusCodes.Status200OK, contentType: "application/json")
125+
// TODO: Check both request/response payloads
126+
.Produces(statusCode: StatusCodes.Status400BadRequest)
127+
.Produces(statusCode: StatusCodes.Status401Unauthorized)
128+
.Produces<string>(statusCode: StatusCodes.Status500InternalServerError, contentType: "text/plain")
129+
.WithTags("admin")
130+
.WithName("CreateAdminEvent")
131+
.WithOpenApi(operation =>
132+
{
133+
operation.Summary = "Create admin event";
134+
operation.Description = "Create admin event";
135+
136+
return operation;
137+
});
138+
139+
return builder;
140+
}
108141
}

src/AzureOpenAIProxy.ApiApp/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@
4646
app.AddAdminEvents();
4747
app.AddAdminEventList();
4848
app.AddUpdateAdminEvents();
49+
app.CreateAdminEvent();
4950

5051
await app.RunAsync();
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
using System.Text.Json;
2+
using System.Net;
3+
4+
using AzureOpenAIProxy.AppHost.Tests.Fixtures;
5+
6+
using FluentAssertions;
7+
8+
using System.Text;
9+
10+
namespace AzureOpenAIProxy.AppHost.Tests.ApiApp.Endpoints;
11+
12+
public class AdminCreateEventsOpenApiTests(AspireAppHostFixture host) : IClassFixture<AspireAppHostFixture>
13+
{
14+
[Fact]
15+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Path()
16+
{
17+
// Arrange
18+
using var httpClient = host.App!.CreateHttpClient("apiapp");
19+
20+
// Act
21+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
22+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
23+
24+
// Assert
25+
var result = openapi!.RootElement.GetProperty("paths")
26+
.GetProperty("/admin/events");
27+
result.ValueKind.Should().Be(JsonValueKind.Object);
28+
}
29+
30+
[Fact]
31+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Verb()
32+
{
33+
// Arrange
34+
using var httpClient = host.App!.CreateHttpClient("apiapp");
35+
36+
// Act
37+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
38+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
39+
40+
// Assert
41+
var result = openapi!.RootElement.GetProperty("paths")
42+
.GetProperty("/admin/events")
43+
.TryGetProperty("post", out var property) ? property : default;
44+
result.ValueKind.Should().Be(JsonValueKind.Object);
45+
}
46+
47+
[Theory]
48+
[InlineData("admin")]
49+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Tags(string tag)
50+
{
51+
// Arrange
52+
using var httpClient = host.App!.CreateHttpClient("apiapp");
53+
54+
// Act
55+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
56+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
57+
58+
// Assert
59+
var result = openapi!.RootElement.GetProperty("paths")
60+
.GetProperty("/admin/events")
61+
.GetProperty("post")
62+
.TryGetProperty("tags", out var property) ? property : default;
63+
result.ValueKind.Should().Be(JsonValueKind.Array);
64+
result.EnumerateArray().Select(p => p.GetString()).Should().Contain(tag);
65+
}
66+
67+
[Theory]
68+
[InlineData("summary")]
69+
[InlineData("description")]
70+
[InlineData("operationId")]
71+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Value(string attribute)
72+
{
73+
// Arrange
74+
using var httpClient = host.App!.CreateHttpClient("apiapp");
75+
76+
// Act
77+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
78+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
79+
80+
// Assert
81+
var result = openapi!.RootElement.GetProperty("paths")
82+
.GetProperty("/admin/events")
83+
.GetProperty("post")
84+
.TryGetProperty(attribute, out var property) ? property : default;
85+
result.ValueKind.Should().Be(JsonValueKind.String);
86+
}
87+
88+
[Theory]
89+
[InlineData("requestBody")]
90+
[InlineData("responses")]
91+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Object(string attribute)
92+
{
93+
// Arrange
94+
using var httpClient = host.App!.CreateHttpClient("apiapp");
95+
96+
// Act
97+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
98+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
99+
100+
// Assert
101+
var result = openapi!.RootElement.GetProperty("paths")
102+
.GetProperty("/admin/events")
103+
.GetProperty("post")
104+
.TryGetProperty(attribute, out var property) ? property : default;
105+
result.ValueKind.Should().Be(JsonValueKind.Object);
106+
}
107+
108+
109+
[Theory]
110+
[InlineData("200")]
111+
[InlineData("400")]
112+
[InlineData("401")]
113+
[InlineData("500")]
114+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Response(string attribute)
115+
{
116+
// Arrange
117+
using var httpClient = host.App!.CreateHttpClient("apiapp");
118+
119+
// Act
120+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
121+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
122+
123+
// Assert
124+
var result = openapi!.RootElement.GetProperty("paths")
125+
.GetProperty("/admin/events")
126+
.GetProperty("post")
127+
.GetProperty("responses")
128+
.TryGetProperty(attribute, out var property) ? property : default;
129+
result.ValueKind.Should().Be(JsonValueKind.Object);
130+
}
131+
132+
[Fact]
133+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Schemas()
134+
{
135+
// Arrange
136+
using var httpClient = host.App!.CreateHttpClient("apiapp");
137+
138+
// Act
139+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
140+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
141+
142+
// Assert
143+
var result = openapi!.RootElement.GetProperty("components")
144+
.TryGetProperty("schemas", out var property) ? property : default;
145+
result.ValueKind.Should().Be(JsonValueKind.Object);
146+
}
147+
148+
[Fact]
149+
public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Model()
150+
{
151+
// Arrange
152+
using var httpClient = host.App!.CreateHttpClient("apiapp");
153+
154+
// Act
155+
var json = await httpClient.GetStringAsync("/swagger/v1.0.0/swagger.json");
156+
var openapi = JsonSerializer.Deserialize<JsonDocument>(json);
157+
158+
// Assert
159+
var result = openapi!.RootElement.GetProperty("components")
160+
.GetProperty("schemas")
161+
.TryGetProperty("AdminEventDetails", out var property) ? property : default;
162+
result.ValueKind.Should().Be(JsonValueKind.Object);
163+
}
164+
}

0 commit comments

Comments
 (0)