From 0cb5514407c99b5c8b3421bded4cbfa6598d3804 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Mon, 14 Oct 2024 21:59:32 +0900 Subject: [PATCH 01/11] add UpdateEventDetailsComponent.razor Related to: #199 --- .../UI/Admin/UpdateEventDetailsComponent.razor | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor new file mode 100644 index 00000000..bd70d173 --- /dev/null +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -0,0 +1,10 @@ +@using AzureOpenAIProxy.PlaygroundApp.Models + + + + + +@code { + [Parameter] + public string? Id { get; set; } +} \ No newline at end of file From 92d2802c5b79ec7db6f0ddf4b90ee67e3f71ca92 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Mon, 14 Oct 2024 22:57:51 +0900 Subject: [PATCH 02/11] add AdminUpdateEvent page Related to: #199 --- .../Components/Pages/AdminUpdateEvent.razor | 15 +++++++++++++++ .../UI/Admin/UpdateEventDetailsComponent.razor | 12 +++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor new file mode 100644 index 00000000..526aa331 --- /dev/null +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor @@ -0,0 +1,15 @@ +@page "/admin/events/edit" + +@using AzureOpenAIProxy.PlaygroundApp.Models; + +Update Event + +

Update Event

+ + + +@code { + [Parameter] + public AdminEventDetails Event { get; set; } +} + diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor index bd70d173..d1667360 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -1,10 +1,20 @@ @using AzureOpenAIProxy.PlaygroundApp.Models - +@if(Event == null) +{ +

Loading...

+} +else +{ + // Do something +}
@code { [Parameter] public string? Id { get; set; } + + [Parameter] + public AdminEventDetails Event { get; set;} } \ No newline at end of file From f684a4836a61b6ccdb3618ba461103b605f96c73 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Thu, 17 Oct 2024 11:26:38 +0900 Subject: [PATCH 03/11] add navigate func to update event page Related to: #199 --- .../Components/UI/Admin/AdminEventsComponent.razor | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor index 09c43446..48c3ada7 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor @@ -1,5 +1,7 @@ @using AzureOpenAIProxy.PlaygroundApp.Models +@inject NavigationManager NavigationManager + @if (eventDetails == null) { @@ -21,7 +23,7 @@ - + @@ -89,4 +91,9 @@ private string? AriaCurrentValue(int pageIndex) => pagination.CurrentPageIndex == pageIndex ? "page" : null; + + private void NavigateToEdit(Guid eventId) + { + NavigationManager.NavigateTo("/admin/events/edit"); + } } From d413426812781cd2b1f5e6f349846a3b1df3486c Mon Sep 17 00:00:00 2001 From: sikutisa Date: Thu, 17 Oct 2024 12:04:12 +0900 Subject: [PATCH 04/11] add OnAfterRenderAsync to UpdateEventDetailsComponent Related to: #199 --- .../Components/Pages/AdminUpdateEvent.razor | 9 ++--- .../UI/Admin/AdminEventsComponent.razor | 2 +- .../Admin/UpdateEventDetailsComponent.razor | 37 ++++++++++++++++++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor index 526aa331..0e115dbc 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/Pages/AdminUpdateEvent.razor @@ -1,4 +1,4 @@ -@page "/admin/events/edit" +@page "/admin/events/edit/{EventId:guid}" @using AzureOpenAIProxy.PlaygroundApp.Models; @@ -6,10 +6,9 @@

Update Event

- + @code { [Parameter] - public AdminEventDetails Event { get; set; } -} - + public Guid EventId { get; set; } +} \ No newline at end of file diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor index 48c3ada7..a0ff196c 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/AdminEventsComponent.razor @@ -94,6 +94,6 @@ private void NavigateToEdit(Guid eventId) { - NavigationManager.NavigateTo("/admin/events/edit"); + NavigationManager.NavigateTo($"/admin/events/edit/{eventId}"); } } diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor index d1667360..c10aed95 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -1,12 +1,13 @@ @using AzureOpenAIProxy.PlaygroundApp.Models -@if(Event == null) +@if(EventDetails == null) {

Loading...

} else { +

@EventDetails.EventId

// Do something }
@@ -16,5 +17,37 @@ else public string? Id { get; set; } [Parameter] - public AdminEventDetails Event { get; set;} + public Guid EventId { get; set;} + + private AdminEventDetails? EventDetails; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if(firstRender) + { + // TODO: Fetch AdminEventDetails through the /admin/events/{eventId} API. + await Task.Delay(2000); + + // Make dummy data + EventDetails = new AdminEventDetails + { + EventId = EventId, + Title = "dummy title", + Summary = "dummy summary", + Description = "dummy description", + DateStart = DateTimeOffset.Now, + DateEnd = DateTimeOffset.Now.AddDays(7), + TimeZone = "KST", + IsActive = true, + OrganizerName = $"dummy organizer", + OrganizerEmail = $"dummy_user@gmail.com", + CoorganizerName = $"dummy coorganizer", + CoorganizerEmail = $"dummy_supprot@gmail.com", + MaxTokenCap = 10000, + DailyRequestCap = 1000 + }; + + await InvokeAsync(StateHasChanged); + } + } } \ No newline at end of file From b5173d91956d64003cb9f85d7349852a8dfb25a2 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Thu, 17 Oct 2024 15:13:39 +0900 Subject: [PATCH 05/11] add FluentUI elements to UpdateEventDetailsComponents Related to: #199 --- .../Admin/UpdateEventDetailsComponent.razor | 113 ++++++++++++++++-- .../UpdateEventDetailsComponent.razor.css | 25 ++++ 2 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor.css diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor index c10aed95..5ee4590a 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -1,15 +1,105 @@ @using AzureOpenAIProxy.PlaygroundApp.Models +@using NodaTime -@if(EventDetails == null) -{ -

Loading...

-} -else -{ -

@EventDetails.EventId

- // Do something -} + @if(adminEventDetails == null) + { +

Loading...

+ } + else + { + Update Event + +
+

Event Infomation

+ + + Title + + + + + Summary + + + + + Description + + + + + Event Start Date + + + + + + Event End Date + + + + + + Time Zone + + @foreach (var timeZone in timeZoneList) + { + @timeZone.Id + } + + +
+ +
+

Event Organizer

+ + + Organizer Name + + + + + + Organizer Email + + +
+ +
+

Event Coorganizers

+ + + Coorgnizer Name + + + + + Coorgnizer Email + + +
+ +
+

Event Configuration

+ + + Max Token Cap + + + + + Daily Request Cap + + +
+ +
+ Update Event + Cancel +
+
+ }
@code { @@ -19,7 +109,8 @@ else [Parameter] public Guid EventId { get; set;} - private AdminEventDetails? EventDetails; + private List? timeZoneList = []; + private AdminEventDetails? adminEventDetails; protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -29,7 +120,7 @@ else await Task.Delay(2000); // Make dummy data - EventDetails = new AdminEventDetails + adminEventDetails = new AdminEventDetails { EventId = EventId, Title = "dummy title", diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor.css b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor.css new file mode 100644 index 00000000..76e38e4d --- /dev/null +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor.css @@ -0,0 +1,25 @@ +section { + margin-bottom: 100px +} + +::deep .update-input-label { + width: 200px; + --type-ramp-base-font-size: 22px; +} + +::deep .update-fluent-stack { + height: 100px; +} + +.button-section { + display: flex; + justify-content: center; + gap: 50px; +} + +.button { + width: 150px; + height: 50px; + font-size: 16px; + margin: 0 10px; +} From f04ffa08d8cdbd1cd85ebe6e289e937e0d8f512b Mon Sep 17 00:00:00 2001 From: sikutisa Date: Thu, 17 Oct 2024 15:47:52 +0900 Subject: [PATCH 06/11] add timeZoneList and CultureInfo Related to: #199 --- .../UI/Admin/UpdateEventDetailsComponent.razor | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor index 5ee4590a..7c63becb 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -1,5 +1,7 @@ @using AzureOpenAIProxy.PlaygroundApp.Models @using NodaTime +@using NodaTime.Extensions +@using System.Globalization @if(adminEventDetails == null) @@ -112,6 +114,18 @@ private List? timeZoneList = []; private AdminEventDetails? adminEventDetails; + protected override void OnInitialized() + { + timeZoneList = DateTimeZoneProviders.Tzdb.GetAllZones().ToList(); + + CultureInfo customCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); + customCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"; + customCulture.DateTimeFormat.ShortTimePattern = "HH:mm"; + + CultureInfo.DefaultThreadCurrentCulture = customCulture; + CultureInfo.DefaultThreadCurrentUICulture = customCulture; + } + protected override async Task OnAfterRenderAsync(bool firstRender) { if(firstRender) @@ -128,7 +142,7 @@ Description = "dummy description", DateStart = DateTimeOffset.Now, DateEnd = DateTimeOffset.Now.AddDays(7), - TimeZone = "KST", + TimeZone = "Asia/Seoul", IsActive = true, OrganizerName = $"dummy organizer", OrganizerEmail = $"dummy_user@gmail.com", From 16c2c29ac20ac776d5b7c47ffede63f584572015 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Thu, 17 Oct 2024 15:54:17 +0900 Subject: [PATCH 07/11] add UpdateEvent and CancelUpdate func Related to: #199 --- .../Admin/UpdateEventDetailsComponent.razor | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor index 7c63becb..301145cf 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -3,6 +3,8 @@ @using NodaTime.Extensions @using System.Globalization +@inject NavigationManager NavigationManager + @if(adminEventDetails == null) { @@ -97,8 +99,8 @@
- Update Event - Cancel + Update Event + Cancel
} @@ -130,7 +132,7 @@ { if(firstRender) { - // TODO: Fetch AdminEventDetails through the /admin/events/{eventId} API. + // TODO: GET AdminEventDetails through the /admin/events/{eventId} API. await Task.Delay(2000); // Make dummy data @@ -155,4 +157,15 @@ await InvokeAsync(StateHasChanged); } } + + private async Task UpdateEvent() + { + // TODO: PUT AdminEventDetails through the /admin/events/{eventId} API. + await Task.CompletedTask; + } + + private void CancelUpdate() + { + NavigationManager.NavigateTo("/admin/events", forceLoad: false); + } } \ No newline at end of file From 582879226d55aa8641474fec0be750189d1d4787 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Mon, 9 Dec 2024 17:12:27 +0900 Subject: [PATCH 08/11] add apphost test Related to: #199 --- .../Pages/AdminUpdateEventTests.cs | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs new file mode 100644 index 00000000..88919572 --- /dev/null +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs @@ -0,0 +1,81 @@ +using System.Net; + +using AzureOpenAIProxy.AppHost.Tests.Fixtures; + +using FluentAssertions; + +namespace AzureOpenAIProxy.AppHost.Tests.PlaygroundApp.Pages; + +public class AdminUpdateEventPageTests(AspireAppHostFixture host) : IClassFixture +{ + [Fact] + public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_OK() + { + // Arrange + using var httpClient = host.App!.CreateHttpClient("playgroundapp"); + await host.ResourceNotificationService.WaitForResourceAsync("playgroundapp", KnownResourceStates.Running).WaitAsync(TimeSpan.FromSeconds(30)); + + var eventId = Guid.NewGuid(); + var expectedUrl = $"/admin/events/edit/{eventId}"; + + // Act + var response = await httpClient.GetAsync(expectedUrl); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.OK); + } + + [Theory] + [InlineData("_content/Microsoft.FluentUI.AspNetCore.Components/css/reboot.css")] + public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_CSS_Elements(string expected) + { + // Arrange + using var httpClient = host.App!.CreateHttpClient("playgroundapp"); + await host.ResourceNotificationService.WaitForResourceAsync("playgroundapp", KnownResourceStates.Running).WaitAsync(TimeSpan.FromSeconds(30)); + + var eventId = Guid.NewGuid(); + var expectedUrl = $"/admin/events/edit/{eventId}"; + + // Act + var html = await httpClient.GetStringAsync(expectedUrl); + + // Assert + html.Should().Contain(expected); + } + + [Theory] + [InlineData("_content/Microsoft.FluentUI.AspNetCore.Components/Microsoft.FluentUI.AspNetCore.Components.lib.module.js")] + public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_JavaScript_Elements(string expected) + { + // Arrange + using var httpClient = host.App!.CreateHttpClient("playgroundapp"); + await host.ResourceNotificationService.WaitForResourceAsync("playgroundapp", KnownResourceStates.Running).WaitAsync(TimeSpan.FromSeconds(30)); + + var eventId = Guid.NewGuid(); + var expectedUrl = $"/admin/events/edit/{eventId}"; + + // Act + var html = await httpClient.GetStringAsync(expectedUrl); + + // Assert + html.Should().Contain(expected); + } + + [Theory] + [InlineData("
")] + public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) + { + // Arrange + using var httpClient = host.App!.CreateHttpClient("playgroundapp"); + await host.ResourceNotificationService.WaitForResourceAsync("playgroundapp", KnownResourceStates.Running).WaitAsync(TimeSpan.FromSeconds(30)); + + var eventId = Guid.NewGuid(); + var expectedUrl = $"/admin/events/edit/{eventId}"; + + // Act + var html = await httpClient.GetStringAsync(expectedUrl); + + // Assert + html.Should().Contain(expected); + } +} \ No newline at end of file From 64ca95f7efa35821dfb0db3e14d37ec78dcf42c4 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Mon, 9 Dec 2024 18:10:59 +0900 Subject: [PATCH 09/11] add playgroundapp tests Related to: #199 --- .../Pages/AdminUpdateEventPageTests.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs diff --git a/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs b/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs new file mode 100644 index 00000000..c6b4e18c --- /dev/null +++ b/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs @@ -0,0 +1,52 @@ +using Microsoft.Playwright; +using Microsoft.Playwright.NUnit; + +namespace AzureOpenAIProxy.PlaygroundApp.Tests.Pages; + +[Parallelizable(ParallelScope.Self)] +[TestFixture] +[Property("Category", "Integration")] +public class AdminUpdateEventPageTests : PageTest +{ + public override BrowserNewContextOptions ContextOptions() => new() { IgnoreHTTPSErrors = true, }; + + [SetUp] + public async Task Init() + { + var eventId = Guid.NewGuid(); + await Page.GotoAsync($"https://localhost:5001/admin/events/edit/{eventId}"); + await Page.WaitForLoadStateAsync(LoadState.NetworkIdle); + } + + [Test] + [TestCase("event-title")] + [TestCase("event-summary")] + [TestCase("event-description")] + [TestCase("event-start-date")] + [TestCase("event-start-time")] + [TestCase("event-end-date")] + [TestCase("event-end-time")] + [TestCase("event-timezone")] + [TestCase("event-organizer-name")] + [TestCase("event-organizer-email")] + [TestCase("event-coorgnizer-name")] + [TestCase("event-coorgnizer-email")] + [TestCase("event-max-token-cap")] + [TestCase("event-daily-request-cap")] + [TestCase("admin-event-detail-update")] + [TestCase("admin-event-detail-cancel")] + public async Task Given_Update_Event_Details_Page_When_Navigated_Then_It_Should_Load_Correctly(string id) + { + // Act + var element = Page.Locator($"#{id}"); + + // Assert + await Expect(element).ToBeVisibleAsync(); + } + + [TearDown] + public async Task CleanUp() + { + await Page.CloseAsync(); + } +} \ No newline at end of file From 5b437708092adace7a66c25cacf4a6e6ef3dc1ba Mon Sep 17 00:00:00 2001 From: sikutisa Date: Wed, 11 Dec 2024 23:22:03 +0900 Subject: [PATCH 10/11] fix ui tests Related to: #199 --- .../PlaygroundApp/Pages/AdminNewEventPageTests.cs | 2 +- .../PlaygroundApp/Pages/AdminPageTests.cs | 2 +- .../PlaygroundApp/Pages/AdminUpdateEventTests.cs | 2 +- .../PlaygroundApp/Pages/EventsPageTests.cs | 2 +- .../PlaygroundApp/Pages/HomePageTests.cs | 2 +- .../PlaygroundApp/Pages/PlaygroundPageTests.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminNewEventPageTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminNewEventPageTests.cs index 2cc2a3f3..31a51ff3 100644 --- a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminNewEventPageTests.cs +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminNewEventPageTests.cs @@ -53,7 +53,7 @@ public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Jav } [Theory] - [InlineData("
")] + [InlineData("
")] public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) { // Arrange diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminPageTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminPageTests.cs index b1b2f936..1a7f912d 100644 --- a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminPageTests.cs +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminPageTests.cs @@ -53,7 +53,7 @@ public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Jav } [Theory] - [InlineData("
")] + [InlineData("
")] public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) { // Arrange diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs index 88919572..f00b2195 100644 --- a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/AdminUpdateEventTests.cs @@ -62,7 +62,7 @@ public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Jav } [Theory] - [InlineData("
")] + [InlineData("
")] public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) { // Arrange diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/EventsPageTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/EventsPageTests.cs index 45377403..e25bdd7c 100644 --- a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/EventsPageTests.cs +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/EventsPageTests.cs @@ -53,7 +53,7 @@ public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Jav } [Theory] - [InlineData("
")] + [InlineData("
")] public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) { // Arrange diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/HomePageTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/HomePageTests.cs index 9f276ff5..c316cf81 100644 --- a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/HomePageTests.cs +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/HomePageTests.cs @@ -53,7 +53,7 @@ public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Jav } [Theory] - [InlineData("
")] + [InlineData("
")] public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) { // Arrange diff --git a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/PlaygroundPageTests.cs b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/PlaygroundPageTests.cs index bb680273..6e2bf859 100644 --- a/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/PlaygroundPageTests.cs +++ b/test/AzureOpenAIProxy.AppHost.Tests/PlaygroundApp/Pages/PlaygroundPageTests.cs @@ -51,7 +51,7 @@ public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_Jav } [Theory] - [InlineData("
")] + [InlineData("
")] public async Task Given_Resource_When_Invoked_Endpoint_Then_It_Should_Return_HTML_Elements(string expected) { // Arrange From 20a69a016fd399eb1dc916f41d1245de122feb45 Mon Sep 17 00:00:00 2001 From: sikutisa Date: Thu, 12 Dec 2024 00:58:25 +0900 Subject: [PATCH 11/11] add timezone tests Related to: #199 --- .../Admin/UpdateEventDetailsComponent.razor | 50 +++++--- .../Pages/AdminUpdateEventPageTests.cs | 107 ++++++++++++++++++ 2 files changed, 144 insertions(+), 13 deletions(-) diff --git a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor index 301145cf..b9bff807 100644 --- a/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor +++ b/src/AzureOpenAIProxy.PlaygroundApp/Components/UI/Admin/UpdateEventDetailsComponent.razor @@ -19,12 +19,12 @@ Title - + Summary - + @@ -46,7 +46,7 @@ Time Zone - + @foreach (var timeZone in timeZoneList) { @timeZone.Id @@ -60,13 +60,13 @@ Organizer Name - + Organizer Email - + @@ -75,12 +75,12 @@ Coorgnizer Name - + Coorgnizer Email - + @@ -89,12 +89,12 @@ Max Token Cap - + Daily Request Cap - + @@ -133,7 +133,9 @@ if(firstRender) { // TODO: GET AdminEventDetails through the /admin/events/{eventId} API. - await Task.Delay(2000); + await Task.Delay(1000); + var timezoneId = GetIanaTimezoneId(); + var currentTime = GetCurrentDateTimeOffset(timezoneId); // Make dummy data adminEventDetails = new AdminEventDetails @@ -142,9 +144,9 @@ Title = "dummy title", Summary = "dummy summary", Description = "dummy description", - DateStart = DateTimeOffset.Now, - DateEnd = DateTimeOffset.Now.AddDays(7), - TimeZone = "Asia/Seoul", + DateStart = currentTime.AddHours(1).AddMinutes(-currentTime.Minute), + DateEnd = currentTime.AddDays(1).AddHours(1).AddMinutes(-currentTime.Minute), + TimeZone = timezoneId, IsActive = true, OrganizerName = $"dummy organizer", OrganizerEmail = $"dummy_user@gmail.com", @@ -168,4 +170,26 @@ { NavigationManager.NavigateTo("/admin/events", forceLoad: false); } + + private string GetIanaTimezoneId() + { + string timezoneId = TimeZoneInfo.Local.Id; + + if (OperatingSystem.IsWindows()) + { + if (TimeZoneInfo.TryConvertWindowsIdToIanaId(timezoneId, out var ianaTimezoneId)) + { + timezoneId = ianaTimezoneId; + } + } + + return timezoneId; + } + + private DateTimeOffset GetCurrentDateTimeOffset(string timezoneId) + { + var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timezoneId); + + return TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, timeZoneInfo); + } } \ No newline at end of file diff --git a/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs b/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs index c6b4e18c..70e6fad2 100644 --- a/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs +++ b/test/AzureOpenAIProxy.PlaygroundApp.Tests/Pages/AdminUpdateEventPageTests.cs @@ -1,3 +1,5 @@ +using FluentAssertions; + using Microsoft.Playwright; using Microsoft.Playwright.NUnit; @@ -44,9 +46,114 @@ public async Task Given_Update_Event_Details_Page_When_Navigated_Then_It_Should_ await Expect(element).ToBeVisibleAsync(); } + [Test] + public async Task Given_Input_Event_Timezone_When_Initialized_Timezone_Then_It_Should_Update_Value() + { + // Arrange + var inputTimezone = Page.Locator("#event-timezone"); + + string timeZone = GetIanaTimezoneId(); + + // Act + string inputTimezoneValue = await inputTimezone.GetAttributeAsync("current-value"); + + // Assert + inputTimezoneValue.Should().Be(timeZone); + } + + [Test] + public async Task Given_Input_Event_Start_Date_When_Initialized_Timezone_Then_It_Should_Update_Value() + { + // Arrange + var inputStartDate = Page.Locator("#event-start-date"); + + string timezoneId = GetIanaTimezoneId(); + DateTimeOffset currentTime = GetCurrentDateTimeOffset(timezoneId); + var startTime = currentTime.AddHours(1).AddMinutes(-currentTime.Minute); + + // Act + var inputStartDateValue = await inputStartDate.GetAttributeAsync("current-value"); + + // Assert + inputStartDateValue.Should().Be(startTime.ToString("yyyy-MM-dd")); + } + + [Test] + public async Task Given_Input_Event_Start_Time_When_Initialized_Timezone_Then_It_Should_Update_Value() + { + // Arrange + var inputStartTime = Page.Locator("#event-start-time"); + + string timezoneId = GetIanaTimezoneId(); + DateTimeOffset currentTime = GetCurrentDateTimeOffset(timezoneId); + var startTime = currentTime.AddHours(1).AddMinutes(-currentTime.Minute); + + // Act + var inputStartTimeValue = await inputStartTime.GetAttributeAsync("current-value"); + + // Assert + inputStartTimeValue.Should().Be(startTime.ToString("HH:mm")); + } + + [Test] + public async Task Given_Input_Event_End_Date_When_Initialized_Timezone_Then_It_Should_Update_Value() + { + // Arrange + var inputEndDate = Page.Locator("#event-end-date"); + + string timezoneId = GetIanaTimezoneId(); + DateTimeOffset currentTime = GetCurrentDateTimeOffset(timezoneId); + var endTime = currentTime.AddDays(1).AddHours(1).AddMinutes(-currentTime.Minute); + + // Act + var inputEndDateValue = await inputEndDate.GetAttributeAsync("current-value"); + + // Assert + inputEndDateValue.Should().Be(endTime.ToString("yyyy-MM-dd")); + } + + [Test] + public async Task Given_Input_Event_End_Time_When_Initialized_Timezone_Then_It_Should_Update_Value() + { + // Arrange + var inputEndTime = Page.Locator("#event-end-time"); + + string timezoneId = GetIanaTimezoneId(); + DateTimeOffset currentTime = GetCurrentDateTimeOffset(timezoneId); + var endTime = currentTime.AddDays(1).AddHours(1).AddMinutes(-currentTime.Minute); + + // Act + var inputEndTimeValue = await inputEndTime.GetAttributeAsync("current-value"); + + // Assert + inputEndTimeValue.Should().Be(endTime.ToString("HH:mm")); + } + [TearDown] public async Task CleanUp() { await Page.CloseAsync(); } + + private string GetIanaTimezoneId() + { + string timezoneId = TimeZoneInfo.Local.Id; + + if (OperatingSystem.IsWindows()) + { + if (TimeZoneInfo.TryConvertWindowsIdToIanaId(timezoneId, out var ianaTimezoneId)) + { + timezoneId = ianaTimezoneId; + } + } + + return timezoneId; + } + + private DateTimeOffset GetCurrentDateTimeOffset(string timezoneId) + { + var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timezoneId); + + return TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, timeZoneInfo); + } } \ No newline at end of file