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