using Microsoft.Playwright; namespace LANCommander.Server.UI.Tests.Pages; /// /// Page object for the First Time Setup wizard at /FirstTimeSetup. /// public class FirstTimeSetupPage { private readonly IPage _page; public FirstTimeSetupPage(IPage page) { _page = page; } public async Task NavigateAsync() { await _page.GotoAsync("/FirstTimeSetup"); // Wait for Blazor to render the page await _page.WaitForSelectorAsync("text=First Time Setup", new() { Timeout = 10000 }); } public async Task IsDisplayedAsync() { return await _page.GetByText("First Time Setup").IsVisibleAsync(); } // Step 1: Database public async Task SelectDatabaseProviderAsync(string provider) { await _page.GetByRole(AriaRole.Combobox).ClickAsync(); await _page.GetByRole(AriaRole.Option, new() { Name = provider }).ClickAsync(); } public async Task ClickConnectAsync() { await _page.GetByRole(AriaRole.Button, new() { Name = "Connect" }).ClickAsync(); } public async Task CompleteDatabaseStepAsync(string provider = "SQLite") { await SelectDatabaseProviderAsync(provider); await ClickConnectAsync(); // Wait for navigation to paths step await _page.WaitForURLAsync("**/FirstTimeSetup/Paths", new() { Timeout = 30000 }); } // Step 2: Paths public async Task CompletePathsStepAsync() { await _page.GetByRole(AriaRole.Button, new() { Name = "Next" }).ClickAsync(); await _page.WaitForURLAsync("**/FirstTimeSetup/Metadata", new() { Timeout = 10000 }); } // Step 3: Metadata public async Task CompleteMetadataStepAsync() { await _page.GetByRole(AriaRole.Button, new() { Name = "Save" }).ClickAsync(); await _page.WaitForURLAsync("**/FirstTimeSetup/Administrator", new() { Timeout = 10000 }); } // Step 4: Administrator public async Task CreateAdministratorAsync(string username, string password) { // AntDesign doesn't use standard label/for associations, so use role-based selection // Username is the first textbox on the Administrator step await _page.WaitForSelectorAsync("text=To get started", new() { Timeout = 10000 }); await _page.GetByRole(AriaRole.Textbox).First.FillAsync(username); await _page.Locator("input[name='context.Password']").FillAsync(password); await _page.Locator("input[name='context.PasswordConfirm']").FillAsync(password); await _page.GetByRole(AriaRole.Button, new() { Name = "Create" }).ClickAsync(); } /// /// Completes the entire first-time setup wizard from start to finish. /// public async Task CompleteFullSetupAsync( string adminUsername = "admin", string adminPassword = "Password1234!", string databaseProvider = "SQLite") { await CompleteDatabaseStepAsync(databaseProvider); await CompletePathsStepAsync(); await CompleteMetadataStepAsync(); await CreateAdministratorAsync(adminUsername, adminPassword); // Wait for the success message await _page.WaitForSelectorAsync("text=Setup completed", new() { Timeout = 15000 }); // Wait for redirect to login page (may already have happened) await _page.WaitForSelectorAsync("text=User Name", new() { Timeout = 15000 }); } }