using System.ComponentModel.DataAnnotations; using Bit.Api.AdminConsole.Models.Request.Organizations; using Xunit; namespace Bit.Api.Test.AdminConsole.Models.Request.Organizations; public class CreateOrganizationInviteLinkRequestModelTests { private const string _validEncryptedString = "2.AOs41Hd8OQiCPXjyJKCiDA==|O6OHgt2U2hJGBSNGnimJmg==|iD33s8B69C8JhYYhSa4V1tArjvLr8eEaGqOV7BRo5Jk="; [Fact] public void Validate_ValidModel_ReturnsNoErrors() { var model = new CreateOrganizationInviteLinkRequestModel { AllowedDomains = new[] { "acme.com" }, EncryptedInviteKey = _validEncryptedString, }; var results = Validate(model); Assert.Empty(results); } [Theory] [InlineData("not a domain")] [InlineData("")] [InlineData("double..dot.com")] [InlineData("-starts-with-hyphen.com")] [InlineData(" acme.com ")] public void Validate_WithInvalidDomainFormat_ReturnsError(string invalidDomain) { var model = new CreateOrganizationInviteLinkRequestModel { AllowedDomains = new[] { invalidDomain }, EncryptedInviteKey = _validEncryptedString, }; var results = Validate(model); Assert.Single(results); Assert.Contains(results, r => r.MemberNames.Contains(nameof(model.AllowedDomains))); } [Fact] public void Validate_WithEmptyAllowedDomains_ReturnsError() { var model = new CreateOrganizationInviteLinkRequestModel { AllowedDomains = Array.Empty(), EncryptedInviteKey = _validEncryptedString, }; var results = Validate(model); Assert.Single(results); Assert.Contains(results, r => r.MemberNames.Contains(nameof(model.AllowedDomains))); } [Fact] public void Validate_WithMixedValidAndInvalidDomains_ReturnsError() { var model = new CreateOrganizationInviteLinkRequestModel { AllowedDomains = new[] { "acme.com", "not a domain", "