diff --git a/Evand-Backend/tests/DTOs/Evand.DTO.Tests.csproj b/Evand-Backend/tests/DTOs/Evand.DTO.Tests.csproj
new file mode 100644
index 00000000..8ef79469
--- /dev/null
+++ b/Evand-Backend/tests/DTOs/Evand.DTO.Tests.csproj
@@ -0,0 +1,22 @@
+
+
+
+ net10.0
+ false
+ enable
+ NU1605
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Evand-Backend/tests/DTOs/UserMapperTests.cs b/Evand-Backend/tests/DTOs/UserMapperTests.cs
new file mode 100644
index 00000000..6e7dc342
--- /dev/null
+++ b/Evand-Backend/tests/DTOs/UserMapperTests.cs
@@ -0,0 +1,126 @@
+using System;
+using Evand.Application.DTOs.User;
+using FluentAssertions;
+using NUnit.Framework;
+using DomainUser = Evand.Domain.Entities.User;
+
+namespace Evand.DTO.Tests
+{
+ [TestFixture]
+ public class UserMapperTests
+ {
+ [Test]
+ public void ToDto_ShouldMapAllFields_FromDomainEntity()
+ {
+ // Arrange
+ var entity = new DomainUser
+ {
+ Guid = Guid.NewGuid(),
+ FullName = "Test User",
+ Email = "test@example.com",
+ HashPassword = "hashed-pw",
+ PhoneNumber = "09120000000",
+ City = "Tehran",
+ Province = "TehranProv",
+ Avatar = "avatar.png"
+ };
+
+ // Act
+ var dto = entity.ToDto(entity.Guid);
+
+ // Assert
+ dto.Should().NotBeNull();
+ dto.Guid.Should().Be(entity.Guid);
+ dto.FullName.Should().Be(entity.FullName);
+ dto.Email.Should().Be(entity.Email);
+ dto.HashPassword.Should().Be(entity.HashPassword);
+ dto.PhoneNumber.Should().Be(entity.PhoneNumber);
+ dto.City.Should().Be(entity.City);
+ dto.Province.Should().Be(entity.Province);
+ dto.Avatar.Should().Be(entity.Avatar);
+ }
+
+ [Test]
+ public void ToDto_ShouldPreserveNullables_FromDomainEntity()
+ {
+ // Arrange
+ var entity = new DomainUser
+ {
+ Guid = Guid.NewGuid(),
+ FullName = "Nullable User",
+ Email = "nullable@example.com",
+ HashPassword = "h",
+ PhoneNumber = null,
+ City = null,
+ Province = null,
+ Avatar = null
+ };
+
+ // Act
+ var dto = entity.ToDto(entity.Guid);
+
+ // Assert
+ dto.PhoneNumber.Should().BeNull();
+ dto.City.Should().BeNull();
+ dto.Province.Should().BeNull();
+ dto.Avatar.Should().BeNull();
+ }
+
+ [Test]
+ public void ToEntity_ShouldMapAllFields_FromAddOrUpdateDto()
+ {
+ // Arrange
+ var dto = new UserAddOrUpdateDto
+ {
+ Guid = Guid.NewGuid(),
+ FullName = "DTO User",
+ Email = "dto@example.com",
+ HashPassword = "dto-hash",
+ PhoneNumber = "09870000000",
+ City = "CityX",
+ Province = "ProvX",
+ Avatar = "dto-avatar.png"
+ };
+
+ // Act
+ var entity = dto.ToEntity();
+
+ // Assert
+ entity.Should().NotBeNull();
+ entity.Guid.Should().Be(dto.Guid);
+ entity.FullName.Should().Be(dto.FullName);
+ entity.Email.Should().Be(dto.Email);
+ entity.HashPassword.Should().Be(dto.HashPassword);
+ entity.PhoneNumber.Should().Be(dto.PhoneNumber);
+ entity.City.Should().Be(dto.City);
+ entity.Province.Should().Be(dto.Province);
+ entity.Avatar.Should().Be(dto.Avatar);
+ }
+
+ [Test]
+ public void ToEntity_ShouldPreserveNullables_FromAddOrUpdateDto()
+ {
+ // Arrange
+ var dto = new UserAddOrUpdateDto
+ {
+ Guid = Guid.NewGuid(),
+ FullName = "DTO Nulls",
+ Email = "nulls@example.com",
+ HashPassword = "h",
+ PhoneNumber = null,
+ City = null,
+ Province = null,
+ Avatar = null
+ };
+
+ // Act
+ var entity = dto.ToEntity();
+
+ // Assert
+ entity.PhoneNumber.Should().BeNull();
+ entity.City.Should().BeNull();
+ entity.Province.Should().BeNull();
+ entity.Avatar.Should().BeNull();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Evand-Backend/tests/Evand.Application.Tests/EventServiceTests.cs b/Evand-Backend/tests/Evand.Application.Tests/EventServiceTests.cs
index 12abcad0..0b17725f 100644
--- a/Evand-Backend/tests/Evand.Application.Tests/EventServiceTests.cs
+++ b/Evand-Backend/tests/Evand.Application.Tests/EventServiceTests.cs
@@ -82,5 +82,25 @@ public async Task ListAsync_ShouldReturnDtos()
result.Should().HaveCount(2);
result.Select(r => r.Name).Should().Contain("Event1", "Event2");
}
+
+ [Test]
+ public void AddAsync_NullDto_ShouldThrow()
+ {
+ Assert.ThrowsAsync(() => _service.AddAsync(null!));
+ }
+
+ [Test]
+ public void AddAsync_InvalidDates_ShouldThrow()
+ {
+ var dto = new EventAddOrUpdateDto
+ {
+ StartDate = DateTime.UtcNow.AddHours(1),
+ EndDate = DateTime.UtcNow,
+ Name = "Test",
+ Category = "Test"
+ };
+
+ Assert.ThrowsAsync(() => _service.AddAsync(dto));
+ }
}
}
\ No newline at end of file
diff --git a/Evand-Backend/tests/Evand.Application.Tests/UserServiceTests.cs b/Evand-Backend/tests/Evand.Application.Tests/UserServiceTests.cs
index 330cbaf8..0fdada2e 100644
--- a/Evand-Backend/tests/Evand.Application.Tests/UserServiceTests.cs
+++ b/Evand-Backend/tests/Evand.Application.Tests/UserServiceTests.cs
@@ -67,5 +67,27 @@ public async Task AddAsync_ValidDto_ShouldCallRepoAndSave()
await _uow.Received(1).SaveChangesAsync(default);
}
+ [Test]
+ public void AddAsync_NullDto_ShouldThrow()
+ {
+ Assert.ThrowsAsync(() => _service.AddAsync(null!));
+ }
+
+ [Test]
+ public async Task ListAsync_ShouldReturnUserDtos()
+ {
+ var users = new List
+ {
+ new User { Guid = Guid.NewGuid(), FullName = "U1", Email = "u1@x" },
+ new User { Guid = Guid.NewGuid(), FullName = "U2", Email = "u2@x" }
+ };
+
+ _queryRepo.GetQueryable().Returns(users.AsQueryable());
+
+ var result = await _service.ListAsync();
+
+ result.Should().HaveCount(2);
+ result.Select(u => u.Email).Should().Contain("u1@x","u2@x");
+ }
}
}
\ No newline at end of file