From 3ea42884f1dd64d32aaacc0db425e92b29dbc143 Mon Sep 17 00:00:00 2001 From: mahdiyebahmani Date: Sat, 21 Feb 2026 10:54:48 +0330 Subject: [PATCH 1/6] Add unit tests for UserService AddAsync null check and ListAsync return mapping --- .../UserServiceTests.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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 From 2368fbe3b6f921aedc3420d8755d3c74fac2e649 Mon Sep 17 00:00:00 2001 From: mahdiyebahmani Date: Sat, 21 Feb 2026 10:59:00 +0330 Subject: [PATCH 2/6] validation for Event(handling null values) --- .../EventServiceTests.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 From d47d9faf143af6bed5a34b0350174857790f4740 Mon Sep 17 00:00:00 2001 From: mahdiyebahmani Date: Sat, 21 Feb 2026 12:56:39 +0330 Subject: [PATCH 3/6] Add unit test for mapping Domain User to DTO --- .../tests/DTOs/Evand.DTO.Tests.csproj | 22 +++++++++ Evand-Backend/tests/DTOs/UserMapperTests.cs | 46 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 Evand-Backend/tests/DTOs/Evand.DTO.Tests.csproj create mode 100644 Evand-Backend/tests/DTOs/UserMapperTests.cs 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..90c5ea0d --- /dev/null +++ b/Evand-Backend/tests/DTOs/UserMapperTests.cs @@ -0,0 +1,46 @@ +using System; +using Evand.Application.DTOs.User; +using FluentAssertions; +using NUnit.Framework; + +// alias to avoid name clashes between DTO namespaces and Domain entity names +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); + } + + +} \ No newline at end of file From c20e57364f17e860652d0a606993fa6576a0cd2f Mon Sep 17 00:00:00 2001 From: mahdiyebahmani Date: Sat, 21 Feb 2026 12:59:10 +0330 Subject: [PATCH 4/6] Ensure User.ToDto preserves null values for optional fields --- Evand-Backend/tests/DTOs/UserMapperTests.cs | 28 ++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Evand-Backend/tests/DTOs/UserMapperTests.cs b/Evand-Backend/tests/DTOs/UserMapperTests.cs index 90c5ea0d..8c9a51d8 100644 --- a/Evand-Backend/tests/DTOs/UserMapperTests.cs +++ b/Evand-Backend/tests/DTOs/UserMapperTests.cs @@ -3,7 +3,6 @@ using FluentAssertions; using NUnit.Framework; -// alias to avoid name clashes between DTO namespaces and Domain entity names using DomainUser = Evand.Domain.Entities.User; namespace Evand.DTO.Tests @@ -42,5 +41,32 @@ public void ToDto_ShouldMapAllFields_FromDomainEntity() 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(); + } + + } } \ No newline at end of file From cce72bca41c3cc567e8250e15ed23a56c8cb5866 Mon Sep 17 00:00:00 2001 From: mahdiyebahmani Date: Sat, 21 Feb 2026 13:00:36 +0330 Subject: [PATCH 5/6] Ensure ToEntity maps all properties correctly --- Evand-Backend/tests/DTOs/UserMapperTests.cs | 32 ++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Evand-Backend/tests/DTOs/UserMapperTests.cs b/Evand-Backend/tests/DTOs/UserMapperTests.cs index 8c9a51d8..07940f48 100644 --- a/Evand-Backend/tests/DTOs/UserMapperTests.cs +++ b/Evand-Backend/tests/DTOs/UserMapperTests.cs @@ -2,7 +2,6 @@ using Evand.Application.DTOs.User; using FluentAssertions; using NUnit.Framework; - using DomainUser = Evand.Domain.Entities.User; namespace Evand.DTO.Tests @@ -67,6 +66,37 @@ public void ToDto_ShouldPreserveNullables_FromDomainEntity() 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); + } + } } \ No newline at end of file From 2627dd008d223346fa4369a85947eaac87385a4b Mon Sep 17 00:00:00 2001 From: mahdiyebahmani Date: Sat, 21 Feb 2026 13:01:21 +0330 Subject: [PATCH 6/6] Add unit test to ensure nullables are preserved in ToEntity mapping --- Evand-Backend/tests/DTOs/UserMapperTests.cs | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Evand-Backend/tests/DTOs/UserMapperTests.cs b/Evand-Backend/tests/DTOs/UserMapperTests.cs index 07940f48..6e7dc342 100644 --- a/Evand-Backend/tests/DTOs/UserMapperTests.cs +++ b/Evand-Backend/tests/DTOs/UserMapperTests.cs @@ -97,6 +97,30 @@ public void ToEntity_ShouldMapAllFields_FromAddOrUpdateDto() 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