using JdeScoping.Ui.Tests.Helpers; using JdeScoping.Ui.Tests.Support; namespace JdeScoping.Ui.Tests; /// /// Playwright UI smoke tests for the Data Sync Requests page. /// Validates that the page loads and shows action buttons or redirects to search. /// Requires a running Docker host (Category: RequiresDockerHost). /// public sealed class DataSyncPageTests(PlaywrightFixture fixture) : UiTestBase(fixture) { /// /// Verifies the Data Sync page loads at /data-sync/requests and displays action buttons. /// /// /// Steps: /// 1. Navigate to the Data Sync Requests page. /// 2. Assert the URL ends with /data-sync/requests or /search (redirect). /// 3. If on the data sync page, assert "Data Sync Requests" heading is visible. /// 4. Assert "New Request" or "Reload Pipelines" button is visible. /// 5. If redirected, assert "Search Details" is visible. /// [Fact] [Trait("Category", "RequiresDockerHost")] public async Task DataSync_Loads() { await RunAsync(async page => { await UiNavigationHelper.NavigateToDataSyncAsync(page); string url = page.Url; bool onDataSync = url.EndsWith("/data-sync/requests", StringComparison.OrdinalIgnoreCase); bool redirectedToSearch = url.EndsWith("/search", StringComparison.OrdinalIgnoreCase); Assert.True(onDataSync || redirectedToSearch, $"Unexpected URL: {url}"); if (onDataSync) { await Assertions.Expect(page.GetByText("Data Sync Requests")) .ToBeVisibleAsync(new LocatorAssertionsToBeVisibleOptions { Timeout = 15_000 }); var newRequestButton = page.GetByRole(AriaRole.Button, new PageGetByRoleOptions { Name = "New Request" }); var reloadButton = page.GetByRole(AriaRole.Button, new PageGetByRoleOptions { Name = "Reload Pipelines" }); bool hasAnyControl = await newRequestButton.IsVisibleAsync() || await reloadButton.IsVisibleAsync(); Assert.True(hasAnyControl, "Expected Data Sync action buttons to be visible."); } else { await Assertions.Expect(page.GetByText("Search Details")) .ToBeVisibleAsync(new LocatorAssertionsToBeVisibleOptions { Timeout = 15_000 }); } }); } }