using AyCode.Database.Tests; using Microsoft.EntityFrameworkCore; using Moq; using TIAM.Database.DataLayers.Users; using TIAM.Database.DbContexts; using TIAM.Entities.Users; namespace TIAM.Database.Test { [TestClass] public class UserDalTests : DatabaseTestModelBase { private Mock _mockContext; private UserDal _userDal; [TestInitialize] public void TestInitialize() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(databaseName: "UserDatabase") .Options; _mockContext = new Mock(options); var mockSet = new Mock>(); _mockContext.Setup(c => c.Users).Returns(mockSet.Object); _userDal = new UserDal(_mockContext.Object); } [TestMethod] public async Task GetUserByEmailAsync_ReturnsUser_WhenUserExists() { // Arrange var email = "test@tiam.hu"; var user = new User { Email = email }; var users = new[] { user }.AsQueryable(); var mockSet = new Mock>(); mockSet.As>().Setup(m => m.Provider).Returns(users.Provider); mockSet.As>().Setup(m => m.Expression).Returns(users.Expression); mockSet.As>().Setup(m => m.ElementType).Returns(users.ElementType); mockSet.As>().Setup(m => m.GetEnumerator()).Returns(users.GetEnumerator()); _mockContext.Setup(c => c.Users).Returns(mockSet.Object); // Act var result = await _userDal.GetUserByEmailAsync(email); // Assert Assert.IsNotNull(result); Assert.AreEqual(email, result.Email); } [TestMethod] public async Task GetUserByEmailAsync_ReturnsNull_WhenUserDoesNotExist() { // Arrange var email = "test@test.hu"; var users = new User[0].AsQueryable(); var mockSet = new Mock>(); mockSet.As>().Setup(m => m.Provider).Returns(users.Provider); mockSet.As>().Setup(m => m.Expression).Returns(users.Expression); mockSet.As>().Setup(m => m.ElementType).Returns(users.ElementType); mockSet.As>().Setup(m => m.GetEnumerator()).Returns(users.GetEnumerator()); _mockContext.Setup(c => c.Users).Returns(mockSet.Object); // Act var result = await _userDal.GetUserByEmailAsync(email); // Assert Assert.IsNull(result); } [TestMethod] public async Task CreateUserAsync_ShouldReturnTrue_WhenUserIsCreated() { // Arrange var user = new User { Id = Guid.NewGuid(), Email = "test@test.com", PhoneNumber = "+1234567890", Password = "password" }; var mockSet = new Mock>(); _mockContext.Setup(x => x.Users).Returns(mockSet.Object); _mockContext.Setup(x => x.Users.Add(user)).Returns(() => null); _mockContext.Setup(x => x.SaveChangesAsync(It.IsAny())) .ReturnsAsync(1) .Verifiable(); // Act var result = await _userDal.CreateUserAsync(user); // Assert Assert.IsTrue(result); } [TestMethod] public async Task UpdateUserAsync_ShouldUpdateUser() { // Arrange var user = new User { Email = "test@test.com", PhoneNumber = "+1234567890", Password = "password" }; _mockContext.Object.Users.Add(user); await _mockContext.Object.SaveChangesAsync(); // Act user.Email = "updated@test.com"; var result = await _userDal.UpdateUserAsync(user); // Assert Assert.IsTrue(result); var updatedUser = _mockContext.Object.Users.Single(u => u.Email == user.Email); Assert.AreEqual("updated@test.com", updatedUser.Email); } } }