Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,32 @@ public void ProcessAttachments_CompressionWithFileNameMap_ShouldUseCustomNames()
email.Dispose();
}

/// <summary>
/// Verifies that repeated compression operations create distinct temporary attachment names.
/// </summary>
/// <remarks>
/// Guards against timestamp-only temporary zip names colliding during parallel test or application runs.
/// </remarks>
[TestMethod]
public void ProcessAttachments_RepeatedCompression_ShouldUseUniqueZipNames()
{
// Arrange
var files = new List<string> { _testFiles[2] };
var zipNames = new HashSet<string>(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
Expand Down Expand Up @@ -620,4 +646,4 @@ public void ProcessAttachments_FileSizeFormatting_ShouldDisplayCorrectly()

#endregion
}
}
}
4 changes: 2 additions & 2 deletions Toolkit.Modern/Mail/EmailAttachmentHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ public AttachmentProcessResult ProcessAttachments(MailMessage email, List<string

EnsureTempDirectoryExists();

var timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
var zipFileName = Path.Combine(TempDirectory, $"Attachments_{timeStamp}.zip");
var timeStamp = DateTime.UtcNow.ToString("yyyyMMddHHmmssfffffff");
var zipFileName = Path.Combine(TempDirectory, $"Attachments_{timeStamp}_{Guid.NewGuid():N}.zip");

if (!TryCompressFiles(filesToAttach, zipFileName, fileNameMap, result))
return result;
Expand Down
Loading