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
{