Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,18 @@ public async Task StartAsync()
var startInfo = new ProcessStartInfo
{
FileName = "dotnet",
Arguments = $"run --no-build --project \"{_projectPath}\"",
WorkingDirectory = Path.GetDirectoryName(_projectPath)!,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};

startInfo.ArgumentList.Add("run");
startInfo.ArgumentList.Add("--no-build");
startInfo.ArgumentList.Add("--project");
startInfo.ArgumentList.Add(_projectPath);

startInfo.Environment["ASPNETCORE_ENVIRONMENT"] = "Test";
startInfo.Environment["AppSettings__TestMode"] = "BackedByTestDataStore";
startInfo.Environment["ASPNETCORE_URLS"] = BaseUri.ToString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ namespace EstateManagementUI.IntegrationTests.Common;

public sealed class ReportingPageHelper
{
private const string TableRowsSelector = "table tbody tr";
private const string ValueText = "Value";
private const string ValueColumnName = ValueText;
private const string DateFormat = "yyyy-MM-dd";

private readonly IPage _page;

public ReportingPageHelper(IPage page)
Expand Down Expand Up @@ -89,7 +94,7 @@ public async Task AssertTransactionDetailSummaryValuesAsync(DataTable table)

public async Task AssertTransactionDetailRowsAsync(DataTable table)
{
var rows = _page.Locator("table tbody tr");
var rows = _page.Locator(TableRowsSelector);
(await rows.CountAsync()).ShouldBe(table.Rows.Count);

for (var index = 0; index < table.Rows.Count; index++)
Expand All @@ -116,7 +121,7 @@ public async Task AssertMerchantSummaryValuesAsync(DataTable table)

public async Task AssertMerchantSummaryRowsAsync(DataTable table)
{
var rows = _page.Locator("table tbody tr");
var rows = _page.Locator(TableRowsSelector);
(await rows.CountAsync()).ShouldBe(table.Rows.Count);

for (var index = 0; index < table.Rows.Count; index++)
Expand Down Expand Up @@ -145,7 +150,7 @@ public async Task AssertOperatorSummaryValuesAsync(DataTable table)

public async Task AssertOperatorSummaryRowsAsync(DataTable table)
{
var rows = _page.Locator("table tbody tr");
var rows = _page.Locator(TableRowsSelector);
(await rows.CountAsync()).ShouldBe(table.Rows.Count);

for (var index = 0; index < table.Rows.Count; index++)
Expand Down Expand Up @@ -174,7 +179,7 @@ public async Task AssertProductPerformanceSummaryValuesAsync(DataTable table)

public async Task AssertProductPerformanceRowsAsync(DataTable table)
{
var rows = _page.Locator("table tbody tr");
var rows = _page.Locator(TableRowsSelector);
(await rows.CountAsync()).ShouldBe(table.Rows.Count);

for (var index = 0; index < table.Rows.Count; index++)
Expand Down Expand Up @@ -245,7 +250,7 @@ public async Task AssertAnalyticalChartsSummaryValuesAsync(DataTable table)
foreach (var row in table.Rows)
{
var label = ReqnrollTableHelper.GetStringRowValue(row, "Label");
var value = ReqnrollTableHelper.GetStringRowValue(row, "Value");
var value = ReqnrollTableHelper.GetStringRowValue(row, ValueColumnName);

if (IsMoneyLabel(label))
{
Expand All @@ -261,7 +266,7 @@ public async Task AssertAnalyticalChartsSummaryValuesAsync(DataTable table)
public async Task AssertAnalyticalChartsComparisonDateAsync(string comparisonDate)
{
var dateToSelect = ResolveComparisonDateValue(comparisonDate);
var expectedLabel = DateTime.ParseExact(dateToSelect, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("MMM dd", CultureInfo.InvariantCulture);
var expectedLabel = DateTime.ParseExact(dateToSelect, DateFormat, CultureInfo.InvariantCulture).ToString("MMM dd", CultureInfo.InvariantCulture);

await _page.Locator("#comparisonDateSelector").SelectOptionAsync(new SelectOptionValue { Value = dateToSelect });
await WaitForAnalyticalChartsReadyAsync();
Expand Down Expand Up @@ -289,7 +294,7 @@ public async Task AssertAnalyticalChartsChartTotalsAsync(DataTable table)
volumeChart.TotalTodayCount.ShouldBe((int)today);
volumeChart.TotalComparisonCount.ShouldBe((int)comparison);
}
else if (chart.Equals("Value", StringComparison.OrdinalIgnoreCase))
else if (chart.Equals(ValueText, StringComparison.OrdinalIgnoreCase))
{
var valueChart = await ReadChartAsync("valueChart");
valueChart.TotalTodayValue.ShouldBe(today);
Expand Down Expand Up @@ -318,7 +323,7 @@ public async Task AssertAnalyticalChartsHourlyPointsAsync(DataTable table)
{
AssertChartSeriesPoint(volumeChart, hour, today, comparison);
}
else if (chart.Equals("Value", StringComparison.OrdinalIgnoreCase))
else if (chart.Equals(ValueText, StringComparison.OrdinalIgnoreCase))
{
AssertChartSeriesPoint(valueChart, hour, today, comparison);
}
Expand Down Expand Up @@ -360,7 +365,7 @@ private string ResolveBaseUrl()

private static bool IsMoneyLabel(string label)
{
return label.Contains("Value", StringComparison.OrdinalIgnoreCase) ||
return label.Contains(ValueText, StringComparison.OrdinalIgnoreCase) ||
label.Contains("Amount", StringComparison.OrdinalIgnoreCase) ||
label.Contains("Fee", StringComparison.OrdinalIgnoreCase) ||
label.Contains("Settlement", StringComparison.OrdinalIgnoreCase) ||
Expand Down Expand Up @@ -461,7 +466,7 @@ private async Task AssertSummaryValuesAsync(DataTable table)
foreach (var row in table.Rows)
{
var label = ReqnrollTableHelper.GetStringRowValue(row, "Label");
var value = ReqnrollTableHelper.GetStringRowValue(row, "Value");
var value = ReqnrollTableHelper.GetStringRowValue(row, ValueColumnName);

if (IsMoneyLabel(label))
{
Expand Down Expand Up @@ -500,13 +505,13 @@ private async Task AssertCellTextAsync(ILocator row, int columnIndex, string exp

private static string ResolveComparisonDateValue(string comparisonDate)
{
if (DateOnly.TryParseExact(comparisonDate, "yyyy-MM-dd", out var date))
if (DateOnly.TryParseExact(comparisonDate, DateFormat, out var date))
{
return date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
return date.ToString(DateFormat, CultureInfo.InvariantCulture);
}

var resolved = ReqnrollTableHelper.GetDateForDateString(comparisonDate, DateTime.Now);
return resolved.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
return resolved.ToString(DateFormat, CultureInfo.InvariantCulture);
}

private static void AssertChartSeriesPoint(ChartSeriesSnapshot chart, string hour, decimal expectedToday, decimal expectedComparison)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ namespace EstateManagementUI.BlazorServer.Common;
/// </summary>
public class TestAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
private const string TestUserRoleKey = "TestUserRole";
public static readonly string SchemeName = "TestAuthentication";
private readonly IConfiguration _configuration;
private readonly IHttpContextAccessor _httpContextAccessor;
Expand All @@ -32,7 +33,7 @@ protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// Check for role switch in query parameter
string? roleName = null;
if (_httpContextAccessor.HttpContext?.Request.Cookies.TryGetValue("TestUserRole", out var cookieRole) == true)
if (_httpContextAccessor.HttpContext?.Request.Cookies.TryGetValue(TestUserRoleKey, out var cookieRole) == true)
{
roleName = cookieRole;
}
Expand All @@ -41,9 +42,9 @@ protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
roleName = roleQuery.ToString();
// Store in session for persistence
_httpContextAccessor.HttpContext.Session.SetString("TestUserRole", roleName);
_httpContextAccessor.HttpContext.Session.SetString(TestUserRoleKey, roleName);
_httpContextAccessor.HttpContext.Response.Cookies.Append(
"TestUserRole",
TestUserRoleKey,
roleName,
new CookieOptions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
<div class="flex items-start justify-between mb-2">
<h4 class="text-md font-semibold text-gray-900">@product.ProductName</h4>
<div class="flex space-x-2">
<button type="button" class="text-red-600 hover:text-red-800 p-1" @onclick="() => RemoveProduct(product.ContractProductId)" title="Remove Product">
<button type="button" class="text-red-600 hover:text-red-800 p-1" @onclick="RemoveProduct" title="Remove Product">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path>
</svg>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,15 @@ private async Task<Result> LoadContract() {
return Result.Success();
}

private async Task HandleSubmit()
private Task HandleSubmit()
{
isSaving = true;

// Note: Update contract description endpoint is not currently implemented in the backend
// This form is present for future implementation
errorMessage = "Contract description update is not yet supported by the backend API";
isSaving = false;
return Task.CompletedTask;
}

private void ShowAddProductModal()
Expand Down Expand Up @@ -157,9 +158,10 @@ private async Task HandleAddFee() {
isAddingFee = false;
}

private async Task RemoveProduct(Guid productId)
private Task RemoveProduct()
{
errorMessage = "Product removal is not yet supported by the backend API. This feature will be available once the backend endpoint is implemented.";
return Task.CompletedTask;
}

private async Task RemoveFee(Guid productId, Guid feeId)
Expand Down Expand Up @@ -187,4 +189,4 @@ private async Task RemoveFee(Guid productId, Guid feeId)
private void BackToView() => this.NavigationManager.NavigateToContract(ContractId);

private void BackToList() => this.NavigationManager.NavigateToContractList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public partial class View
private MerchantModels.MerchantOpeningHoursModel merchantOpeningHoursModel = new();

// Settlement transaction history data
private List<TransactionDetailModel>? settlementTransactions;
private List<TransactionDetailModel> settlementTransactions = [];
private bool loadingSettlementTransactions = false;

// Pagination for settlement transactions
Expand Down Expand Up @@ -118,9 +118,12 @@ private async Task<Result> LoadMerchant()
}
}

private async Task LoadSettlementTransactions()
private Task LoadSettlementTransactions()
{

settlementTransactions = [];
settlementCurrentPage = 1;
settlementTotalPages = 0;
return Task.CompletedTask;
}

private string GetResultBadgeClass(string? status)
Expand Down Expand Up @@ -160,15 +163,15 @@ private string GetSettlementStatusText(string? settlementReference)
private async Task OnSettlementsTabClick()
{
activeTab = "settlements";
if (settlementTransactions == null)
if (settlementTransactions.Count == 0)
{
await LoadSettlementTransactions();
}
}

private List<TransactionDetailModel> GetPagedSettlementTransactions()
{
if (settlementTransactions == null || !settlementTransactions.Any())
if (!settlementTransactions.Any())
return new List<TransactionDetailModel>();

settlementTotalPages = (int)Math.Ceiling(settlementTransactions.Count / (double)settlementPageSize);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ public abstract class AuthorizedComponentBase : CustomComponentBase
protected ClaimsPrincipal User { get; private set; } = default!;
protected AuthenticationState AuthState { get; private set; } = default!;

protected override async Task OnInitializedAsync() {

}

[Inject] protected IPermissionService PermissionService { get; set; } = default!;
[Inject] protected NavigationManager NavigationManager { get; set; } = default!;

Expand Down
2 changes: 1 addition & 1 deletion EstateManagementUI.BlazorServer/Models/MerchantModels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public class DayOpeningHoursModel

private class DateNotInFutureAttribute : ValidationAttribute
{
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
protected override ValidationResult? IsValid(object? value, ValidationContext _)
{
if (value is DateTime date)
{
Expand Down
Loading
Loading