| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597 |
- using qdr.app.studiou.orders2printpack.EmailStorage;
- using System.IO.Abstractions.TestingHelpers;
- namespace Test
- {
- [TestFixture]
- public class EmailItemTests
- {
- private MockFileSystem _mockFileSystem;
- private string _basePath;
- private MetadataItem _testMetadata;
- [SetUp]
- public void SetUp()
- {
- _mockFileSystem = new MockFileSystem();
- _basePath = @"C:\TestBase";
-
- _testMetadata = new MetadataItem
- {
- DirectoryName = "test_user_at_example_dot_com",
- EmailAddress = "test.user@example.com",
- State = EmailStateEnum.Ready,
- Subject = "Test Subject",
- Body = "Test Body",
- FileNameAttachment = "test_attachment.zip",
- SizeAttachment = 1024,
- InternalFilesCount = 3,
- Orders = "1001,1002,1003"
- };
- // Create base directory
- _mockFileSystem.AddDirectory(_basePath);
- }
- #region Constructor Tests
- [Test]
- public void Constructor_WithValidParameters_ShouldInitializeCorrectly()
- {
- // Act
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Assert
- Assert.That(emailItem.Metadata, Is.EqualTo(_testMetadata));
- Assert.That(emailItem.DirectoryPath, Is.EqualTo(Path.Combine(_basePath, _testMetadata.DirectoryName)));
- }
- [Test]
- public void Constructor_WithNullMetadata_ShouldThrowArgumentNullException()
- {
- // Act & Assert
- var ex = Assert.Throws<ArgumentNullException>(() => new EmailItem(null, _basePath, _mockFileSystem));
- Assert.That(ex.ParamName, Is.EqualTo("metadata"));
- }
- [Test]
- public void Constructor_WithNullBasePath_ShouldThrowArgumentNullException()
- {
- // Act & Assert
- var ex = Assert.Throws<ArgumentNullException>(() => new EmailItem(_testMetadata, null, _mockFileSystem));
- Assert.That(ex.ParamName, Is.EqualTo("basePath"));
- }
- #endregion
- #region Property Tests
- [Test]
- public void DirectoryPath_ShouldCombineBasePathWithDirectoryName()
- {
- // Arrange
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- var expectedPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- // Act & Assert
- Assert.That(emailItem.DirectoryPath, Is.EqualTo(expectedPath));
- }
- [Test]
- public void DirectoryExists_WhenDirectoryExists_ShouldReturnTrue()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.DirectoryExists, Is.True);
- }
- [Test]
- public void DirectoryExists_WhenDirectoryDoesNotExist_ShouldReturnFalse()
- {
- // Arrange
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.DirectoryExists, Is.False);
- }
- [Test]
- public void JpgFiles_WhenDirectoryExists_ShouldReturnJpgFiles()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image2.jpg"), new MockFileData("image2"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "document.txt"), new MockFileData("text"));
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var jpgFiles = emailItem.JpgFiles.ToList();
- // Assert
- Assert.That(jpgFiles.Count, Is.EqualTo(2));
- Assert.That(jpgFiles.Any(f => f.EndsWith("image1.jpg")), Is.True);
- Assert.That(jpgFiles.Any(f => f.EndsWith("image2.jpg")), Is.True);
- Assert.That(jpgFiles.Any(f => f.EndsWith("document.txt")), Is.False);
- }
- [Test]
- public void JpgFiles_WhenDirectoryDoesNotExist_ShouldReturnEmptyEnumerable()
- {
- // Arrange
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var jpgFiles = emailItem.JpgFiles.ToList();
- // Assert
- Assert.That(jpgFiles, Is.Empty);
- }
- [Test]
- public void FileCount_WhenDirectoryHasJpgFiles_ShouldReturnCorrectCount()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image2.jpg"), new MockFileData("image2"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image3.jpg"), new MockFileData("image3"));
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.FileCount, Is.EqualTo(3));
- }
- [Test]
- public void FileCount_WhenDirectoryDoesNotExist_ShouldReturnZero()
- {
- // Arrange
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.FileCount, Is.EqualTo(0));
- }
- [Test]
- public void TotalFileSize_WhenDirectoryHasJpgFiles_ShouldReturnCorrectTotalSize()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData(new byte[100])); // 100 bytes
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image2.jpg"), new MockFileData(new byte[200])); // 200 bytes
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image3.jpg"), new MockFileData(new byte[300])); // 300 bytes
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.TotalFileSize, Is.EqualTo(600));
- }
- [Test]
- public void TotalFileSize_WhenDirectoryDoesNotExist_ShouldReturnZero()
- {
- // Arrange
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.TotalFileSize, Is.EqualTo(0));
- }
- [Test]
- public void IsReadyForProcessing_WhenStateIsReadyAndDirectoryExistsWithFiles_ShouldReturnTrue()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
-
- _testMetadata.State = EmailStateEnum.Ready;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.IsReadyForProcessing, Is.True);
- }
- [Test]
- public void IsReadyForProcessing_WhenStateIsNotReady_ShouldReturnFalse()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
-
- _testMetadata.State = EmailStateEnum.Processing;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.IsReadyForProcessing, Is.False);
- }
- [Test]
- public void IsReadyForProcessing_WhenDirectoryDoesNotExist_ShouldReturnFalse()
- {
- // Arrange
- _testMetadata.State = EmailStateEnum.Ready;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.IsReadyForProcessing, Is.False);
- }
- [Test]
- public void IsReadyForProcessing_WhenDirectoryExistsButNoFiles_ShouldReturnFalse()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
-
- _testMetadata.State = EmailStateEnum.Ready;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.IsReadyForProcessing, Is.False);
- }
- [Test]
- public void CanBeReset_WhenStateIsNotProcessingOrUploading_ShouldReturnTrue()
- {
- // Arrange
- var testCases = new[]
- {
- EmailStateEnum.Ready,
- EmailStateEnum.Sending,
- EmailStateEnum.Sent,
- EmailStateEnum.Error
- };
- foreach (var state in testCases)
- {
- _testMetadata.State = state;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.CanBeReset, Is.True, $"Failed for state: {state}");
- }
- }
- [Test]
- public void CanBeReset_WhenStateIsProcessingOrUploading_ShouldReturnFalse()
- {
- // Arrange
- var testCases = new[]
- {
- EmailStateEnum.Processing,
- EmailStateEnum.Uploading
- };
- foreach (var state in testCases)
- {
- _testMetadata.State = state;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.CanBeReset, Is.False, $"Failed for state: {state}");
- }
- }
- [Test]
- public void NormalizedRecipient_ShouldReplaceSpecialCharacters()
- {
- // Arrange
- _testMetadata.EmailAddress = "test.user@example.com";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.NormalizedRecipient, Is.EqualTo("test_dot_user_at_example_dot_com"));
- }
- [Test]
- public void NormalizedRecipient_WithComplexEmail_ShouldHandleMultipleSpecialCharacters()
- {
- // Arrange
- _testMetadata.EmailAddress = "test.user.name@sub.domain.example.com";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.NormalizedRecipient, Is.EqualTo("test_dot_user_dot_name_at_sub_dot_domain_dot_example_dot_com"));
- }
- #endregion
- #region Method Tests
- [Test]
- public void GenerateZipFileName_WithDefaultTimestamp_ShouldIncludeCurrentTime()
- {
- // Arrange
- _testMetadata.EmailAddress = "test.user@example.com";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var fileName = emailItem.GenerateZipFileName();
- // Assert
- Assert.That(fileName, Does.StartWith("studioufoto_test_dot_user_at_example_dot_com_"));
- Assert.That(fileName, Does.EndWith(".zip"));
-
- // Check that it contains a timestamp pattern (YYYYMMDD_HHMMSS)
- var timestampPattern = @"\d{8}_\d{6}";
- Assert.That(fileName, Does.Match($@"studioufoto_test_dot_user_at_example_dot_com_{timestampPattern}\.zip"));
- }
- [Test]
- public void GenerateZipFileName_WithSpecificTimestamp_ShouldUseProvidedTimestamp()
- {
- // Arrange
- _testMetadata.EmailAddress = "test.user@example.com";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- var timestamp = new DateTime(2024, 5, 30, 14, 30, 45);
- // Act
- var fileName = emailItem.GenerateZipFileName(timestamp);
- // Assert
- Assert.That(fileName, Is.EqualTo("studioufoto_test_dot_user_at_example_dot_com_20240530_143045.zip"));
- }
- [Test]
- public void Validate_WithAllValidData_ShouldReturnValid()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
-
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.Subject = "Valid Subject";
- _testMetadata.Body = "Valid Body";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.True);
- Assert.That(issues, Is.Empty);
- }
- [Test]
- public void Validate_WithMissingEmailAddress_ShouldReturnInvalid()
- {
- // Arrange
- _testMetadata.EmailAddress = "";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues, Contains.Item("Email address is required"));
- }
- [Test]
- public void Validate_WithNullEmailAddress_ShouldReturnInvalid()
- {
- // Arrange
- _testMetadata.EmailAddress = null;
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues, Contains.Item("Email address is required"));
- }
- [Test]
- public void Validate_WithNonExistentDirectory_ShouldReturnInvalid()
- {
- // Arrange
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.Subject = "Valid Subject";
- _testMetadata.Body = "Valid Body";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues, Contains.Item($"Directory does not exist: {emailItem.DirectoryPath}"));
- }
- [Test]
- public void Validate_WithDirectoryButNoJpgFiles_ShouldReturnInvalid()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
-
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.Subject = "Valid Subject";
- _testMetadata.Body = "Valid Body";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues, Contains.Item("No JPG files found in directory"));
- }
- [Test]
- public void Validate_WithMissingSubject_ShouldReturnInvalid()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
-
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.Subject = "";
- _testMetadata.Body = "Valid Body";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues, Contains.Item("Email subject is required"));
- }
- [Test]
- public void Validate_WithMissingBody_ShouldReturnInvalid()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
-
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.Subject = "Valid Subject";
- _testMetadata.Body = "";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues, Contains.Item("Email body is required"));
- }
- [Test]
- public void Validate_WithMultipleIssues_ShouldReturnAllIssues()
- {
- // Arrange
- _testMetadata.EmailAddress = "";
- _testMetadata.Subject = "";
- _testMetadata.Body = "";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var (isValid, issues) = emailItem.Validate();
- // Assert
- Assert.That(isValid, Is.False);
- Assert.That(issues.Count, Is.EqualTo(4)); // Email, Directory, Subject, Body
- Assert.That(issues, Contains.Item("Email address is required"));
- Assert.That(issues, Contains.Item($"Directory does not exist: {emailItem.DirectoryPath}"));
- Assert.That(issues, Contains.Item("Email subject is required"));
- Assert.That(issues, Contains.Item("Email body is required"));
- }
- [Test]
- public void GetSummary_ShouldReturnFormattedSummary()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image2.jpg"), new MockFileData("image2"));
-
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.State = EmailStateEnum.Ready;
- _testMetadata.Orders = "1001,1002";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var summary = emailItem.GetSummary();
- // Assert
- Assert.That(summary, Is.EqualTo("test.user@example.com - 2 files, Ready, Orders: 1001,1002"));
- }
- [Test]
- public void GetSummary_WithNoFiles_ShouldShowZeroFiles()
- {
- // Arrange
- _testMetadata.EmailAddress = "test.user@example.com";
- _testMetadata.State = EmailStateEnum.Error;
- _testMetadata.Orders = "1001";
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var summary = emailItem.GetSummary();
- // Assert
- Assert.That(summary, Is.EqualTo("test.user@example.com - 0 files, Error, Orders: 1001"));
- }
- #endregion
- #region Edge Cases and Boundary Tests
- [Test]
- public void NormalizedRecipient_WithEmptyEmail_ShouldReturnEmpty()
- {
- // Arrange
- _testMetadata.EmailAddress = "";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act & Assert
- Assert.That(emailItem.NormalizedRecipient, Is.EqualTo(""));
- }
- [Test]
- public void GenerateZipFileName_WithEmptyEmail_ShouldStillGenerateFileName()
- {
- // Arrange
- _testMetadata.EmailAddress = "";
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var fileName = emailItem.GenerateZipFileName();
- // Assert
- Assert.That(fileName, Does.StartWith("studioufoto__"));
- Assert.That(fileName, Does.EndWith(".zip"));
- }
- [Test]
- public void JpgFiles_WithMixedCaseExtensions_ShouldReturnJpgFilesOnly()
- {
- // Arrange
- var directoryPath = Path.Combine(_basePath, _testMetadata.DirectoryName);
- _mockFileSystem.AddDirectory(directoryPath);
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image1.jpg"), new MockFileData("image1"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image2.JPG"), new MockFileData("image2"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "image3.jpeg"), new MockFileData("image3"));
- _mockFileSystem.AddFile(Path.Combine(directoryPath, "document.txt"), new MockFileData("text"));
-
- var emailItem = new EmailItem(_testMetadata, _basePath, _mockFileSystem);
- // Act
- var jpgFiles = emailItem.JpgFiles.ToList();
- // Assert
- // Note: MockFileSystem's GetFiles with "*.jpg" pattern is case-sensitive
- // This test verifies the current behavior - adjust if case-insensitive matching is needed
- Assert.That(jpgFiles.Count, Is.EqualTo(2)); // Only lowercase .jpg
- Assert.That(jpgFiles.Any(f => f.EndsWith("image1.jpg")), Is.True);
- }
- #endregion
- }
- }
|