diff --git a/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs b/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs index 60e33c4..d69ea3b 100644 --- a/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs +++ b/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs @@ -334,6 +334,32 @@ public void ProcessAttachments_CompressionWithFileNameMap_ShouldUseCustomNames() email.Dispose(); } + /// + /// Verifies that repeated compression operations create distinct temporary attachment names. + /// + /// + /// Guards against timestamp-only temporary zip names colliding during parallel test or application runs. + /// + [TestMethod] + public void ProcessAttachments_RepeatedCompression_ShouldUseUniqueZipNames() + { + // Arrange + var files = new List { _testFiles[2] }; + var zipNames = new HashSet(StringComparer.OrdinalIgnoreCase); + + // Act + for (var i = 0; i < 3; i++) + { + using var email = CreateTestEmail(); + var result = _handler.ProcessAttachments(email, files, [], true); + + // Assert + result.Success.Should().BeTrue($"compression pass {i} should succeed"); + email.Attachments.Should().ContainSingle("each compression pass should produce one zip"); + zipNames.Add(email.Attachments[0].Name).Should().BeTrue("each compressed attachment should use a unique zip name"); + } + } + #endregion #region ProcessAttachments Method Tests - Large File Compression @@ -620,4 +646,4 @@ public void ProcessAttachments_FileSizeFormatting_ShouldDisplayCorrectly() #endregion } -} \ No newline at end of file +} diff --git a/Toolkit.Modern/Mail/EmailAttachmentHandler.cs b/Toolkit.Modern/Mail/EmailAttachmentHandler.cs index 0b870ec..ea84e0a 100644 --- a/Toolkit.Modern/Mail/EmailAttachmentHandler.cs +++ b/Toolkit.Modern/Mail/EmailAttachmentHandler.cs @@ -82,8 +82,8 @@ public AttachmentProcessResult ProcessAttachments(MailMessage email, List