From 667d141f1a8d6dd8cf4a38eefa372b787c55e5fb Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 5 Jun 2026 11:00:27 -0400 Subject: [PATCH] test(e2e): unify toast assertion + extract shared PlaywrightDbConnection (review cleanups) --- .../Audit/AuditDataSeeder.cs | 20 +++-------- .../Cluster/PlaywrightDbConnection.cs | 35 +++++++++++++++++++ .../Notifications/NotificationDataSeeder.cs | 19 +++------- .../SiteCalls/SiteCallDataSeeder.cs | 20 +++-------- .../SiteCalls/SiteCallsPageTests.cs | 6 ++-- 5 files changed, 49 insertions(+), 51 deletions(-) create mode 100644 tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/PlaywrightDbConnection.cs diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Audit/AuditDataSeeder.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Audit/AuditDataSeeder.cs index 321ede18..642d1cbf 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Audit/AuditDataSeeder.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Audit/AuditDataSeeder.cs @@ -1,6 +1,7 @@ using System.Globalization; using System.Text.Json; using Microsoft.Data.SqlClient; +using ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Cluster; namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Audit; @@ -33,24 +34,11 @@ namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Audit; /// internal static class AuditDataSeeder { - private const string DefaultConnectionString = - "Server=localhost,1433;Database=ScadaBridgeConfig;User Id=scadabridge_app;Password=ScadaBridge_Dev1#;TrustServerCertificate=true;Encrypt=false;Connect Timeout=5"; - - private const string EnvVar = "SCADABRIDGE_PLAYWRIGHT_DB"; - /// - /// Connection string for the running cluster's configuration DB. Resolved - /// from SCADABRIDGE_PLAYWRIGHT_DB when set, otherwise the local docker - /// dev defaults. + /// Connection string for the running cluster's configuration DB. + /// Delegates to . /// - public static string ConnectionString - { - get - { - var fromEnv = Environment.GetEnvironmentVariable(EnvVar); - return string.IsNullOrWhiteSpace(fromEnv) ? DefaultConnectionString : fromEnv; - } - } + public static string ConnectionString => PlaywrightDbConnection.ConnectionString; /// /// Inserts a single audit row into the canonical AuditLog table. After the diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/PlaywrightDbConnection.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/PlaywrightDbConnection.cs new file mode 100644 index 00000000..cd4eeb03 --- /dev/null +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Cluster/PlaywrightDbConnection.cs @@ -0,0 +1,35 @@ +namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Cluster; + +/// +/// Single source of truth for the dev-cluster database credential used by the +/// Playwright E2E suite. +/// +/// +/// The connection string mirrors the Docker cluster's scadabridge_app +/// account from docker/central-node-a/appsettings.Central.json, with the +/// host pointed at the host-exposed port (localhost:1433). The +/// SCADABRIDGE_PLAYWRIGHT_DB environment variable lets CI override the +/// connection without recompiling. +/// +/// +internal static class PlaywrightDbConnection +{ + private const string DefaultConnectionString = + "Server=localhost,1433;Database=ScadaBridgeConfig;User Id=scadabridge_app;Password=ScadaBridge_Dev1#;TrustServerCertificate=true;Encrypt=false;Connect Timeout=5"; + + private const string EnvVar = "SCADABRIDGE_PLAYWRIGHT_DB"; + + /// + /// Connection string for the running cluster's configuration DB. Resolved + /// from SCADABRIDGE_PLAYWRIGHT_DB when set (non-whitespace), otherwise + /// the local docker dev defaults. + /// + public static string ConnectionString + { + get + { + var fromEnv = Environment.GetEnvironmentVariable(EnvVar); + return string.IsNullOrWhiteSpace(fromEnv) ? DefaultConnectionString : fromEnv; + } + } +} diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Notifications/NotificationDataSeeder.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Notifications/NotificationDataSeeder.cs index 4c22f61d..a5fb0488 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Notifications/NotificationDataSeeder.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/Notifications/NotificationDataSeeder.cs @@ -1,4 +1,5 @@ using Microsoft.Data.SqlClient; +using ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Cluster; namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Notifications; @@ -30,23 +31,11 @@ namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Notifications; /// internal static class NotificationDataSeeder { - private const string DefaultConnectionString = - "Server=localhost,1433;Database=ScadaBridgeConfig;User Id=scadabridge_app;Password=ScadaBridge_Dev1#;TrustServerCertificate=true;Encrypt=false;Connect Timeout=5"; - - private const string EnvVar = "SCADABRIDGE_PLAYWRIGHT_DB"; - /// - /// Connection string for the running cluster's configuration DB. Resolved from - /// SCADABRIDGE_PLAYWRIGHT_DB when set, otherwise the local docker dev defaults. + /// Connection string for the running cluster's configuration DB. + /// Delegates to . /// - public static string ConnectionString - { - get - { - var fromEnv = Environment.GetEnvironmentVariable(EnvVar); - return string.IsNullOrWhiteSpace(fromEnv) ? DefaultConnectionString : fromEnv; - } - } + public static string ConnectionString => PlaywrightDbConnection.ConnectionString; /// /// Inserts a single Parked row into the central Notifications table. diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallDataSeeder.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallDataSeeder.cs index ef1d8e2b..714752d6 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallDataSeeder.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallDataSeeder.cs @@ -1,4 +1,5 @@ using Microsoft.Data.SqlClient; +using ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.Cluster; namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.SiteCalls; @@ -25,24 +26,11 @@ namespace ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests.SiteCalls; /// internal static class SiteCallDataSeeder { - private const string DefaultConnectionString = - "Server=localhost,1433;Database=ScadaBridgeConfig;User Id=scadabridge_app;Password=ScadaBridge_Dev1#;TrustServerCertificate=true;Encrypt=false;Connect Timeout=5"; - - private const string EnvVar = "SCADABRIDGE_PLAYWRIGHT_DB"; - /// - /// Connection string for the running cluster's configuration DB. Resolved - /// from SCADABRIDGE_PLAYWRIGHT_DB when set, otherwise the local docker - /// dev defaults. + /// Connection string for the running cluster's configuration DB. + /// Delegates to . /// - public static string ConnectionString - { - get - { - var fromEnv = Environment.GetEnvironmentVariable(EnvVar); - return string.IsNullOrWhiteSpace(fromEnv) ? DefaultConnectionString : fromEnv; - } - } + public static string ConnectionString => PlaywrightDbConnection.ConnectionString; /// /// Inserts a single row into the central SiteCalls table. Optional diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallsPageTests.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallsPageTests.cs index ead5e963..a53837ea 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallsPageTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests/SiteCalls/SiteCallsPageTests.cs @@ -320,10 +320,8 @@ public class SiteCallsPageTests // path can sit on the 10s inner relay timeout before the response — // and the toast itself auto-dismisses 5s after it appears, so the // assertion must catch it inside that window. - var toast = page.Locator(".toast"); - await Assertions.Expect(toast).ToBeVisibleAsync( - new() { Timeout = 15_000 }); - Assert.Equal(1, await toast.CountAsync()); + await Assertions.Expect(page.Locator(".toast")).ToHaveCountAsync( + 1, new() { Timeout = 15_000 }); } finally {