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
22 changes: 22 additions & 0 deletions Evand-Backend/tests/DTOs/Evand.DTO.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<IsPackable>false</IsPackable>
<Nullable>enable</Nullable>
<NoWarn>NU1605</NoWarn>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="NUnit" Version="4.5.0" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" />
<PackageReference Include="FluentAssertions" Version="8.8.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Evand.Application\Evand.Application.csproj" />
<ProjectReference Include="..\..\Evand.Domain\Evand.Domain.csproj" />
</ItemGroup>

</Project>
126 changes: 126 additions & 0 deletions Evand-Backend/tests/DTOs/UserMapperTests.cs
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
20 changes: 20 additions & 0 deletions Evand-Backend/tests/Evand.Application.Tests/EventServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<ArgumentNullException>(() => _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<ArgumentException>(() => _service.AddAsync(dto));
}
}
}
22 changes: 22 additions & 0 deletions Evand-Backend/tests/Evand.Application.Tests/UserServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,27 @@ public async Task AddAsync_ValidDto_ShouldCallRepoAndSave()
await _uow.Received(1).SaveChangesAsync(default);
}

[Test]
public void AddAsync_NullDto_ShouldThrow()
{
Assert.ThrowsAsync<ArgumentNullException>(() => _service.AddAsync(null!));
}

[Test]
public async Task ListAsync_ShouldReturnUserDtos()
{
var users = new List<User>
{
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");
}
}
}