@@ -121,6 +121,26 @@ public void MerchantsEdit_TabSwitch_ToContact_UpdatesActiveTab()
121121 cut . WaitForAssertion ( ( ) => cut . Markup . ShouldContain ( "Contact Name" ) , timeout : TimeSpan . FromSeconds ( 5 ) ) ;
122122 }
123123
124+ [ Fact ]
125+ public void MerchantsEdit_TabSwitch_ToOpeningHours_UpdatesActiveTab ( )
126+ {
127+ var merchantId = Guid . NewGuid ( ) ;
128+ SetupSuccessfulDataLoad ( merchantId ) ;
129+ IRenderedComponent < MerchantsEdit > cut = RenderComponent < MerchantsEdit > ( parameters => parameters
130+ . Add ( p => p . MerchantId , merchantId ) ) ;
131+ cut . WaitForState ( ( ) => ! cut . Markup . Contains ( "animate-spin" ) , TimeSpan . FromSeconds ( 5 ) ) ;
132+
133+ IRefreshableElementCollection < IElement > buttons = cut . FindAll ( "button" ) ;
134+ IElement ? openingHoursButton = buttons . FirstOrDefault ( b => b . TextContent . Contains ( "Opening Hours" ) ) ;
135+ openingHoursButton ? . Click ( ) ;
136+
137+ 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 ) ) ;
140+ cut . Markup . ShouldContain ( "Sunday" ) ;
141+ cut . Markup . ShouldContain ( "Saturday" ) ;
142+ }
143+
124144 [ Fact ]
125145 public void MerchantsEdit_TabSwitch_ToOperators_UpdatesActiveTab ( )
126146 {
@@ -870,6 +890,96 @@ public void MerchantsEdit_SaveAllChanges_Failure_ShowsErrorMessage()
870890 this . MerchantUIService . Verify ( m => m . UpdateMerchant ( It . IsAny < CorrelationId > ( ) , It . IsAny < Guid > ( ) , merchantId , It . IsAny < MerchantModels . MerchantEditModel > ( ) ) , Times . Once ) ;
871891 }
872892
893+ [ Fact ]
894+ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsService ( )
895+ {
896+ var merchantId = Guid . NewGuid ( ) ;
897+ SetupSuccessfulDataLoad ( merchantId ) ;
898+
899+ this . MerchantUIService . Setup ( m => m . UpdateMerchantOpeningHours ( It . IsAny < CorrelationId > ( ) , It . IsAny < Guid > ( ) , merchantId , It . IsAny < MerchantModels . MerchantOpeningHoursModel > ( ) ) )
900+ . ReturnsAsync ( Result . Success ) ;
901+
902+ IRenderedComponent < MerchantsEdit > cut = RenderComponent < MerchantsEdit > ( parameters => parameters
903+ . Add ( p => p . MerchantId , merchantId ) ) ;
904+ cut . WaitForState ( ( ) => ! cut . Markup . Contains ( "animate-spin" ) , TimeSpan . FromSeconds ( 5 ) ) ;
905+
906+ IElement ? openingHoursButton = cut . FindAll ( "button" ) . FirstOrDefault ( b => b . TextContent . Contains ( "Opening Hours" ) ) ;
907+ openingHoursButton ? . Click ( ) ;
908+
909+ cut . Find ( "#mondayOpening" ) . Change ( "0800" ) ;
910+ cut . Find ( "#mondayClosing" ) . Change ( "1700" ) ;
911+ cut . Find ( "#tuesdayOpening" ) . Change ( "0800" ) ;
912+ cut . Find ( "#tuesdayClosing" ) . Change ( "1700" ) ;
913+ cut . Find ( "#wednesdayOpening" ) . Change ( "0800" ) ;
914+ cut . Find ( "#wednesdayClosing" ) . Change ( "1700" ) ;
915+ cut . Find ( "#thursdayOpening" ) . Change ( "0800" ) ;
916+ cut . Find ( "#thursdayClosing" ) . Change ( "1700" ) ;
917+ cut . Find ( "#fridayOpening" ) . Change ( "0800" ) ;
918+ cut . Find ( "#fridayClosing" ) . Change ( "1700" ) ;
919+ cut . Find ( "#saturdayOpening" ) . Change ( "0900" ) ;
920+ cut . Find ( "#saturdayClosing" ) . Change ( "1600" ) ;
921+ cut . Find ( "#sundayOpening" ) . Change ( "8:00" ) ;
922+ cut . Find ( "#sundayClosing" ) . Change ( "1800" ) ;
923+
924+ cut . Find ( "#saveOpeningHoursButton" ) . Click ( ) ;
925+
926+ cut . WaitForAssertion ( ( ) => cut . Markup . ShouldContain ( "Merchant opening hours updated successfully" ) , timeout : TimeSpan . FromSeconds ( 10 ) ) ;
927+ this . MerchantUIService . Verify ( m => m . UpdateMerchantOpeningHours (
928+ It . IsAny < CorrelationId > ( ) ,
929+ It . IsAny < Guid > ( ) ,
930+ merchantId ,
931+ It . Is < MerchantModels . MerchantOpeningHoursModel > ( hours =>
932+ hours . Sunday . Opening == "0800" &&
933+ hours . Sunday . Closing == "1800" &&
934+ hours . Saturday . Opening == "0900" &&
935+ hours . Saturday . Closing == "1600" ) ) ,
936+ Times . Once ) ;
937+ }
938+
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+
873983 [ Fact ]
874984 public void MerchantsEdit_SwapDeviceConfirm_Success_ShowsSuccessMessage ( )
875985 {
@@ -1122,4 +1232,22 @@ private void SetupSuccessfulDataLoadWithContracts(Guid merchantId, List<Contract
11221232
11231233 private void SetupSuccessfulDataLoadWithAssignedContracts ( Guid merchantId , List < MerchantModels . MerchantContractModel > assignedContracts )
11241234 => 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+ }
11251253}
0 commit comments