Skip to content

Commit 5fdd18e

Browse files
fix: tighten opening hours validation and reorder days
Agent-Logs-Url: https://github.com/TransactionProcessing/EstateManagementUI/sessions/2054837e-a332-4c53-9600-4cd22cfdab22 Co-authored-by: StuartFerguson <16325469+StuartFerguson@users.noreply.github.com>
1 parent a9b3039 commit 5fdd18e

2 files changed

Lines changed: 76 additions & 8 deletions

File tree

EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ public void MerchantsEdit_TabSwitch_ToOpeningHours_UpdatesActiveTab()
135135
openingHoursButton?.Click();
136136

137137
cut.WaitForAssertion(() => cut.Markup.ShouldContain("Save Opening Hours"), timeout: TimeSpan.FromSeconds(5));
138+
cut.Markup.IndexOf("Monday", StringComparison.Ordinal).ShouldBeLessThan(cut.Markup.IndexOf("Sunday", StringComparison.Ordinal));
139+
cut.Markup.IndexOf("Saturday", StringComparison.Ordinal).ShouldBeLessThan(cut.Markup.IndexOf("Sunday", StringComparison.Ordinal));
138140
cut.Markup.ShouldContain("Sunday");
139141
cut.Markup.ShouldContain("Saturday");
140142
}
@@ -904,8 +906,6 @@ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsSe
904906
IElement? openingHoursButton = cut.FindAll("button").FirstOrDefault(b => b.TextContent.Contains("Opening Hours"));
905907
openingHoursButton?.Click();
906908

907-
cut.Find("#sundayOpening").Change("8:00");
908-
cut.Find("#sundayClosing").Change("1800");
909909
cut.Find("#mondayOpening").Change("0800");
910910
cut.Find("#mondayClosing").Change("1700");
911911
cut.Find("#tuesdayOpening").Change("0800");
@@ -918,6 +918,8 @@ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsSe
918918
cut.Find("#fridayClosing").Change("1700");
919919
cut.Find("#saturdayOpening").Change("0900");
920920
cut.Find("#saturdayClosing").Change("1600");
921+
cut.Find("#sundayOpening").Change("8:00");
922+
cut.Find("#sundayClosing").Change("1800");
921923

922924
cut.Find("#saveOpeningHoursButton").Click();
923925

@@ -934,6 +936,50 @@ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsSe
934936
Times.Once);
935937
}
936938

939+
[Fact]
940+
public void MerchantsEdit_SaveOpeningHours_InvalidClosingTimeAbove2359_ShowsErrorAndDoesNotCallService()
941+
{
942+
var merchantId = Guid.NewGuid();
943+
SetupSuccessfulDataLoad(merchantId);
944+
945+
IRenderedComponent<MerchantsEdit> cut = RenderComponent<MerchantsEdit>(parameters => parameters
946+
.Add(p => p.MerchantId, merchantId));
947+
cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5));
948+
949+
IElement? openingHoursButton = cut.FindAll("button").FirstOrDefault(b => b.TextContent.Contains("Opening Hours"));
950+
openingHoursButton?.Click();
951+
952+
PopulateValidOpeningHours(cut);
953+
cut.Find("#sundayClosing").Change("2400");
954+
955+
cut.Find("#saveOpeningHoursButton").Click();
956+
957+
cut.WaitForAssertion(() => cut.Markup.ShouldContain("Sunday closing time must be entered in HHmm format."), timeout: TimeSpan.FromSeconds(10));
958+
this.MerchantUIService.Verify(m => m.UpdateMerchantOpeningHours(It.IsAny<CorrelationId>(), It.IsAny<Guid>(), merchantId, It.IsAny<MerchantModels.MerchantOpeningHoursModel>()), Times.Never);
959+
}
960+
961+
[Fact]
962+
public void MerchantsEdit_SaveOpeningHours_InvalidOpeningTimeBelow0000_ShowsErrorAndDoesNotCallService()
963+
{
964+
var merchantId = Guid.NewGuid();
965+
SetupSuccessfulDataLoad(merchantId);
966+
967+
IRenderedComponent<MerchantsEdit> cut = RenderComponent<MerchantsEdit>(parameters => parameters
968+
.Add(p => p.MerchantId, merchantId));
969+
cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5));
970+
971+
IElement? openingHoursButton = cut.FindAll("button").FirstOrDefault(b => b.TextContent.Contains("Opening Hours"));
972+
openingHoursButton?.Click();
973+
974+
PopulateValidOpeningHours(cut);
975+
cut.Find("#mondayOpening").Change("-100");
976+
977+
cut.Find("#saveOpeningHoursButton").Click();
978+
979+
cut.WaitForAssertion(() => cut.Markup.ShouldContain("Monday opening time must be entered in HHmm format."), timeout: TimeSpan.FromSeconds(10));
980+
this.MerchantUIService.Verify(m => m.UpdateMerchantOpeningHours(It.IsAny<CorrelationId>(), It.IsAny<Guid>(), merchantId, It.IsAny<MerchantModels.MerchantOpeningHoursModel>()), Times.Never);
981+
}
982+
937983
[Fact]
938984
public void MerchantsEdit_SwapDeviceConfirm_Success_ShowsSuccessMessage()
939985
{
@@ -1186,4 +1232,22 @@ private void SetupSuccessfulDataLoadWithContracts(Guid merchantId, List<Contract
11861232

11871233
private void SetupSuccessfulDataLoadWithAssignedContracts(Guid merchantId, List<MerchantModels.MerchantContractModel> assignedContracts)
11881234
=> SetupSuccessfulDataLoad(merchantId, assignedContracts: assignedContracts);
1235+
1236+
private static void PopulateValidOpeningHours(IRenderedComponent<MerchantsEdit> cut)
1237+
{
1238+
cut.Find("#mondayOpening").Change("0800");
1239+
cut.Find("#mondayClosing").Change("1700");
1240+
cut.Find("#tuesdayOpening").Change("0800");
1241+
cut.Find("#tuesdayClosing").Change("1700");
1242+
cut.Find("#wednesdayOpening").Change("0800");
1243+
cut.Find("#wednesdayClosing").Change("1700");
1244+
cut.Find("#thursdayOpening").Change("0800");
1245+
cut.Find("#thursdayClosing").Change("1700");
1246+
cut.Find("#fridayOpening").Change("0800");
1247+
cut.Find("#fridayClosing").Change("1700");
1248+
cut.Find("#saturdayOpening").Change("0900");
1249+
cut.Find("#saturdayClosing").Change("1600");
1250+
cut.Find("#sundayOpening").Change("0800");
1251+
cut.Find("#sundayClosing").Change("1800");
1252+
}
11891253
}

EstateManagementUI.BlazorServer/Components/Pages/Merchants/Edit.razor.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -415,13 +415,13 @@ private async Task AddDeviceToMerchant() {
415415

416416
private IReadOnlyList<OpeningHoursRow> GetOpeningHoursRows() =>
417417
[
418-
new("Sunday", merchantOpeningHoursModel.Sunday),
419418
new("Monday", merchantOpeningHoursModel.Monday),
420419
new("Tuesday", merchantOpeningHoursModel.Tuesday),
421420
new("Wednesday", merchantOpeningHoursModel.Wednesday),
422421
new("Thursday", merchantOpeningHoursModel.Thursday),
423422
new("Friday", merchantOpeningHoursModel.Friday),
424-
new("Saturday", merchantOpeningHoursModel.Saturday)
423+
new("Saturday", merchantOpeningHoursModel.Saturday),
424+
new("Sunday", merchantOpeningHoursModel.Sunday)
425425
];
426426

427427
private Boolean TryNormaliseAndValidateOpeningHours(out String validationError) {
@@ -454,13 +454,17 @@ private Boolean TryNormaliseAndValidateOpeningHours(out String validationError)
454454
return value;
455455
}
456456

457-
String digitsOnly = new(value.Where(Char.IsDigit).ToArray());
457+
String trimmedValue = value.Trim();
458458

459-
if (digitsOnly.Length == 3) {
460-
digitsOnly = digitsOnly.PadLeft(4, '0');
459+
if (DateTime.TryParseExact(trimmedValue,
460+
["HHmm", "Hmm", "HH:mm", "H:mm"],
461+
CultureInfo.InvariantCulture,
462+
DateTimeStyles.None,
463+
out DateTime parsed) == false) {
464+
return trimmedValue;
461465
}
462466

463-
return digitsOnly;
467+
return parsed.ToString("HHmm", CultureInfo.InvariantCulture);
464468
}
465469

466470
private static Boolean TryParseOpeningHoursValue(String? value, out TimeSpan time) {

0 commit comments

Comments
 (0)