diff --git a/tests/ScadaLink.CentralUI.PlaywrightTests/NavigationTests.cs b/tests/ScadaLink.CentralUI.PlaywrightTests/NavigationTests.cs index 9dcd7f4..468b53f 100644 --- a/tests/ScadaLink.CentralUI.PlaywrightTests/NavigationTests.cs +++ b/tests/ScadaLink.CentralUI.PlaywrightTests/NavigationTests.cs @@ -25,9 +25,9 @@ public class NavigationTests [Theory] [InlineData("Sites", "/admin/sites")] - [InlineData("Connections", "/admin/connections")] [InlineData("API Keys", "/admin/api-keys")] [InlineData("LDAP Mappings", "/admin/ldap-mappings")] + [InlineData("SMTP Configuration", "/admin/smtp")] public async Task AdminNavLinks_NavigateCorrectly(string linkText, string expectedPath) { var page = await _fixture.NewAuthenticatedPageAsync(); @@ -37,6 +37,7 @@ public class NavigationTests [Theory] [InlineData("Templates", "/design/templates")] [InlineData("Shared Scripts", "/design/shared-scripts")] + [InlineData("Connections", "/design/connections")] [InlineData("External Systems", "/design/external-systems")] public async Task DesignNavLinks_NavigateCorrectly(string linkText, string expectedPath) { diff --git a/tests/ScadaLink.CentralUI.PlaywrightTests/RoleNavigationTests.cs b/tests/ScadaLink.CentralUI.PlaywrightTests/RoleNavigationTests.cs index 0e85017..e394edf 100644 --- a/tests/ScadaLink.CentralUI.PlaywrightTests/RoleNavigationTests.cs +++ b/tests/ScadaLink.CentralUI.PlaywrightTests/RoleNavigationTests.cs @@ -12,10 +12,10 @@ namespace ScadaLink.CentralUI.PlaywrightTests; /// multi-role → Admin + Design + Deployment /// /// Nav structure (from NavMenu.razor): -/// All authenticated: Dashboard, Monitoring (Health Dashboard, Event Logs, Parked Messages) -/// Admin: LDAP Mappings, Sites, Data Connections, API Keys, Audit Log -/// Design: Templates, Shared Scripts, External Systems, Areas -/// Deployment: Instances, Deployments, Debug View +/// All authenticated: Dashboard, Health Dashboard +/// Admin: LDAP Mappings, Sites, API Keys, SMTP Configuration, Audit Log +/// Design: Templates, Shared Scripts, Connections, External Systems +/// Deployment: Topology, Deployments, Debug View, Event Logs, Parked Messages /// [Collection("Playwright")] public class RoleNavigationTests @@ -34,10 +34,10 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("admin", "password"); - await AssertNavLinkVisible(page, "Sites"); - await AssertNavLinkVisible(page, "Data Connections"); - await AssertNavLinkVisible(page, "API Keys"); await AssertNavLinkVisible(page, "LDAP Mappings"); + await AssertNavLinkVisible(page, "Sites"); + await AssertNavLinkVisible(page, "API Keys"); + await AssertNavLinkVisible(page, "SMTP Configuration"); await AssertNavLinkVisible(page, "Audit Log"); } @@ -48,6 +48,7 @@ public class RoleNavigationTests await AssertNavLinkHidden(page, "Templates"); await AssertNavLinkHidden(page, "Shared Scripts"); + await AssertNavLinkHidden(page, "Connections"); await AssertNavLinkHidden(page, "External Systems"); } @@ -56,19 +57,21 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("admin", "password"); - await AssertNavLinkHidden(page, "Instances"); + await AssertNavLinkHidden(page, "Topology"); await AssertNavLinkHidden(page, "Deployments"); await AssertNavLinkHidden(page, "Debug View"); } [Fact] - public async Task AdminUser_SeesMonitoringSection() + public async Task AdminUser_SeesHealthDashboard_NotDeploymentMonitoring() { var page = await _fixture.NewAuthenticatedPageAsync("admin", "password"); + // Health Dashboard is all-roles; Event Logs and Parked Messages are + // Deployment-role only (NavMenu.razor / Component-CentralUI). await AssertNavLinkVisible(page, "Health Dashboard"); - await AssertNavLinkVisible(page, "Event Logs"); - await AssertNavLinkVisible(page, "Parked Messages"); + await AssertNavLinkHidden(page, "Event Logs"); + await AssertNavLinkHidden(page, "Parked Messages"); } // ── Design-only user ──────────────────────────────────────────── @@ -80,8 +83,8 @@ public class RoleNavigationTests await AssertNavLinkVisible(page, "Templates"); await AssertNavLinkVisible(page, "Shared Scripts"); + await AssertNavLinkVisible(page, "Connections"); await AssertNavLinkVisible(page, "External Systems"); - await AssertNavLinkVisible(page, "Areas"); } [Fact] @@ -89,10 +92,10 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("designer", "password"); - await AssertNavLinkHidden(page, "Sites"); - await AssertNavLinkHidden(page, "Data Connections"); - await AssertNavLinkHidden(page, "API Keys"); await AssertNavLinkHidden(page, "LDAP Mappings"); + await AssertNavLinkHidden(page, "Sites"); + await AssertNavLinkHidden(page, "API Keys"); + await AssertNavLinkHidden(page, "SMTP Configuration"); await AssertNavLinkHidden(page, "Audit Log"); } @@ -101,19 +104,21 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("designer", "password"); - await AssertNavLinkHidden(page, "Instances"); + await AssertNavLinkHidden(page, "Topology"); await AssertNavLinkHidden(page, "Deployments"); await AssertNavLinkHidden(page, "Debug View"); } [Fact] - public async Task DesignUser_SeesMonitoringButNotAuditLog() + public async Task DesignUser_SeesHealthDashboard_NotDeploymentMonitoringOrAudit() { var page = await _fixture.NewAuthenticatedPageAsync("designer", "password"); + // A Design-only user sees the all-roles Health Dashboard but not the + // Deployment-gated Event Logs / Parked Messages, nor the Admin Audit Log. await AssertNavLinkVisible(page, "Health Dashboard"); - await AssertNavLinkVisible(page, "Event Logs"); - await AssertNavLinkVisible(page, "Parked Messages"); + await AssertNavLinkHidden(page, "Event Logs"); + await AssertNavLinkHidden(page, "Parked Messages"); await AssertNavLinkHidden(page, "Audit Log"); } @@ -124,7 +129,7 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("deployer", "password"); - await AssertNavLinkVisible(page, "Instances"); + await AssertNavLinkVisible(page, "Topology"); await AssertNavLinkVisible(page, "Deployments"); await AssertNavLinkVisible(page, "Debug View"); } @@ -134,10 +139,10 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("deployer", "password"); - await AssertNavLinkHidden(page, "Sites"); - await AssertNavLinkHidden(page, "Data Connections"); - await AssertNavLinkHidden(page, "API Keys"); await AssertNavLinkHidden(page, "LDAP Mappings"); + await AssertNavLinkHidden(page, "Sites"); + await AssertNavLinkHidden(page, "API Keys"); + await AssertNavLinkHidden(page, "SMTP Configuration"); await AssertNavLinkHidden(page, "Audit Log"); } @@ -148,6 +153,7 @@ public class RoleNavigationTests await AssertNavLinkHidden(page, "Templates"); await AssertNavLinkHidden(page, "Shared Scripts"); + await AssertNavLinkHidden(page, "Connections"); await AssertNavLinkHidden(page, "External Systems"); } @@ -156,6 +162,8 @@ public class RoleNavigationTests { var page = await _fixture.NewAuthenticatedPageAsync("deployer", "password"); + // Event Logs and Parked Messages are Deployment-role gated, so a + // Deployment user sees them; Audit Log is Admin-only. await AssertNavLinkVisible(page, "Health Dashboard"); await AssertNavLinkVisible(page, "Event Logs"); await AssertNavLinkVisible(page, "Parked Messages"); @@ -170,24 +178,24 @@ public class RoleNavigationTests var page = await _fixture.NewAuthenticatedPageAsync("multi-role", "password"); // Admin - await AssertNavLinkVisible(page, "Sites"); - await AssertNavLinkVisible(page, "Data Connections"); - await AssertNavLinkVisible(page, "API Keys"); await AssertNavLinkVisible(page, "LDAP Mappings"); + await AssertNavLinkVisible(page, "Sites"); + await AssertNavLinkVisible(page, "API Keys"); + await AssertNavLinkVisible(page, "SMTP Configuration"); await AssertNavLinkVisible(page, "Audit Log"); // Design await AssertNavLinkVisible(page, "Templates"); await AssertNavLinkVisible(page, "Shared Scripts"); + await AssertNavLinkVisible(page, "Connections"); await AssertNavLinkVisible(page, "External Systems"); - await AssertNavLinkVisible(page, "Areas"); // Deployment - await AssertNavLinkVisible(page, "Instances"); + await AssertNavLinkVisible(page, "Topology"); await AssertNavLinkVisible(page, "Deployments"); await AssertNavLinkVisible(page, "Debug View"); - // Monitoring (all authenticated) + // Monitoring await AssertNavLinkVisible(page, "Health Dashboard"); await AssertNavLinkVisible(page, "Event Logs"); await AssertNavLinkVisible(page, "Parked Messages"); diff --git a/tests/ScadaLink.CentralUI.PlaywrightTests/SiteCrudTests.cs b/tests/ScadaLink.CentralUI.PlaywrightTests/SiteCrudTests.cs index 56279d1..d6539b7 100644 --- a/tests/ScadaLink.CentralUI.PlaywrightTests/SiteCrudTests.cs +++ b/tests/ScadaLink.CentralUI.PlaywrightTests/SiteCrudTests.cs @@ -13,15 +13,17 @@ public class SiteCrudTests } [Fact] - public async Task SitesPage_ShowsTable() + public async Task SitesPage_ShowsSiteManagement() { var page = await _fixture.NewAuthenticatedPageAsync(); await page.GotoAsync($"{PlaywrightFixture.BaseUrl}/admin/sites"); await page.WaitForLoadStateAsync(LoadState.NetworkIdle); + // Sites.razor renders the management page as a heading plus site cards + // (not an HTML table) and an always-present "Add Site" action. await Expect(page.Locator("h4:has-text('Site Management')")).ToBeVisibleAsync(); - await Expect(page.Locator("table")).ToBeVisibleAsync(); + await Expect(page.Locator("button:has-text('Add Site')")).ToBeVisibleAsync(); } [Fact]