diff --git a/test/Core.Test/Auth/UserFeatures/EmergencyAccess/EmergencyAccessMailTests.cs b/test/Core.Test/Auth/UserFeatures/EmergencyAccess/EmergencyAccessMailTests.cs index aa3c778fa5..0bc50ffe4b 100644 --- a/test/Core.Test/Auth/UserFeatures/EmergencyAccess/EmergencyAccessMailTests.cs +++ b/test/Core.Test/Auth/UserFeatures/EmergencyAccess/EmergencyAccessMailTests.cs @@ -13,18 +13,20 @@ namespace Bit.Core.Test.Auth.UserFeatures.EmergencyAccess; [SutProviderCustomize] public class EmergencyAccessMailTests { + // Constant values for all Emergency Access emails + private const string _emergencyAccessHelpUrl = "https://bitwarden.com/help/emergency-access/"; + private const string _emergencyAccessMailSubject = "Emergency contacts removed"; + /// /// Documents how to construct and send the emergency access removal email. /// 1. Inject IMailer into their command/service - /// 2. Get WebVaultUrl from GlobalSettings.BaseServiceUri.VaultWithHash - /// 3. Construct EmergencyAccessRemoveGranteesMail as shown below - /// 4. Call mailer.SendEmail(mail) + /// 2. Construct EmergencyAccessRemoveGranteesMail as shown below + /// 3. Call mailer.SendEmail(mail) /// [Theory, BitAutoData] public async Task SendEmergencyAccessRemoveGranteesEmail_SingleGrantee_Success( string grantorEmail, - string granteeName, - string webVaultUrl) + string granteeName) { // Arrange var logger = Substitute.For>(); @@ -39,8 +41,7 @@ public class EmergencyAccessMailTests ToEmails = [grantorEmail], View = new EmergencyAccessRemoveGranteesMailView { - RemovedGranteeNames = [granteeName], - WebVaultUrl = webVaultUrl + RemovedGranteeNames = [granteeName] } }; @@ -55,15 +56,10 @@ public class EmergencyAccessMailTests // Assert Assert.NotNull(sentMessage); Assert.Contains(grantorEmail, sentMessage.ToEmails); - Assert.Equal("Emergency contacts removed", sentMessage.Subject); // Verify the content contains the grantee name Assert.Contains(granteeName, sentMessage.TextContent); Assert.Contains(granteeName, sentMessage.HtmlContent); - - // Verify the vault link is present - Assert.Contains(webVaultUrl, sentMessage.HtmlContent); - Assert.Contains("web app", sentMessage.HtmlContent); } /// @@ -71,8 +67,7 @@ public class EmergencyAccessMailTests /// [Theory, BitAutoData] public async Task SendEmergencyAccessRemoveGranteesEmail_MultipleGrantees_RendersAllNames( - string grantorEmail, - string webVaultUrl) + string grantorEmail) { // Arrange var logger = Substitute.For>(); @@ -89,8 +84,7 @@ public class EmergencyAccessMailTests ToEmails = [grantorEmail], View = new EmergencyAccessRemoveGranteesMailView { - RemovedGranteeNames = granteeNames, - WebVaultUrl = webVaultUrl + RemovedGranteeNames = granteeNames } }; @@ -112,13 +106,11 @@ public class EmergencyAccessMailTests } /// - /// Validates the minimal required fields for the email view model. - /// Both RemovedGranteeNames and WebVaultUrl are marked as 'required' in the view model. + /// Validates the required GranteeNames for the email view model. /// [Theory, BitAutoData] - public void EmergencyAccessRemoveGranteesMailView_RequiredFields_MustBeProvided( - string grantorEmail, - string webVaultUrl) + public void EmergencyAccessRemoveGranteesMailView_GranteeNames_AreRequired( + string grantorEmail) { // Arrange - Shows the minimum required to construct the email var mail = new EmergencyAccessRemoveGranteesMail @@ -127,18 +119,30 @@ public class EmergencyAccessMailTests View = new EmergencyAccessRemoveGranteesMailView { // Required: at least one removed grantee name - RemovedGranteeNames = ["Example Grantee"], - // Required: link to vault for managing emergency contacts - // In production: use GlobalSettings.BaseServiceUri.VaultWithHash - WebVaultUrl = webVaultUrl + RemovedGranteeNames = ["Example Grantee"] } }; - // Assert - If this compiles and constructs, required fields are satisfied + // Assert Assert.NotNull(mail); Assert.NotNull(mail.View); Assert.NotEmpty(mail.View.RemovedGranteeNames); - Assert.NotNull(mail.View.WebVaultUrl); - Assert.Equal("Emergency contacts removed", mail.Subject); + } + + [Theory, BitAutoData] + public void EmergencyAccessRemoveGranteesMailView_SubjectAndHelpLink_MatchesExpectedValues(string grantorEmail, string granteeName) + { + // Arrange + var mail = new EmergencyAccessRemoveGranteesMail + { + ToEmails = [grantorEmail], + View = new EmergencyAccessRemoveGranteesMailView { RemovedGranteeNames = [granteeName] } + }; + + // Assert + Assert.NotNull(mail); + Assert.NotNull(mail.View); + Assert.Equal(_emergencyAccessMailSubject, mail.Subject); + Assert.Equal(_emergencyAccessHelpUrl, mail.View.EmergencyAccessHelpPageUrl); } }