From 534040b6d743056aab72a906073ce6d3b56428cd Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 25 Nov 2023 17:02:50 +0100 Subject: [PATCH] UserContext fixes, UserDal tests, create TransferDestination --- TIAM.Database.Test/DatabaseTest.cs | 10 ++ TIAM.Database.Test/TIAM.Database.Test.csproj | 4 +- TIAM.Database.Test/UserDalTests.cs | 130 ++++++++++++++++++ TIAM.Database/DataLayers/Users/UserDal.cs | 6 +- TIAM.Database/DbContexts/UserDbContext.cs | 7 +- .../TransferDestination.cs | 20 ++- TIAMMobileApp/Services/TransferDataService.cs | 11 +- .../Client/Services/TransferDataService.cs | 25 +++- .../Controllers/TransferDataAPIController.cs | 22 ++- .../Server/Controllers/UserAPIController.cs | 17 +-- TIAMWebApp/Server/Program.cs | 1 + TIAMWebApp/Shared/Models/APIUrls.cs | 4 +- 12 files changed, 216 insertions(+), 41 deletions(-) create mode 100644 TIAM.Database.Test/UserDalTests.cs diff --git a/TIAM.Database.Test/DatabaseTest.cs b/TIAM.Database.Test/DatabaseTest.cs index 49945667..ff408140 100644 --- a/TIAM.Database.Test/DatabaseTest.cs +++ b/TIAM.Database.Test/DatabaseTest.cs @@ -34,5 +34,15 @@ namespace TIAM.Database.Test var isConnected = ctx.Database.CanConnect(); Assert.IsTrue(isConnected); } + + + [TestMethod] + public void UserDalTest() + { + using var ctx = new UserDbContext(); + + var isConnected = ctx.Database.CanConnect(); + Assert.IsTrue(isConnected); + } } } \ No newline at end of file diff --git a/TIAM.Database.Test/TIAM.Database.Test.csproj b/TIAM.Database.Test/TIAM.Database.Test.csproj index 285d6b0a..fbc415e1 100644 --- a/TIAM.Database.Test/TIAM.Database.Test.csproj +++ b/TIAM.Database.Test/TIAM.Database.Test.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -11,9 +11,11 @@ + + diff --git a/TIAM.Database.Test/UserDalTests.cs b/TIAM.Database.Test/UserDalTests.cs new file mode 100644 index 00000000..570ebf1f --- /dev/null +++ b/TIAM.Database.Test/UserDalTests.cs @@ -0,0 +1,130 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using TIAM.Database.DataLayers.Users; +using TIAM.Database.DbContexts; +using TIAM.Entities.Users; +using System.Collections.Generic; +using System.Text; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using System.Net.Sockets; + +namespace TIAM.Database.Tests.DataLayers.Users +{ + [TestClass] + public class UserDalTests + { + 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); + } + } +} \ No newline at end of file diff --git a/TIAM.Database/DataLayers/Users/UserDal.cs b/TIAM.Database/DataLayers/Users/UserDal.cs index aebe62e5..2b848fc4 100644 --- a/TIAM.Database/DataLayers/Users/UserDal.cs +++ b/TIAM.Database/DataLayers/Users/UserDal.cs @@ -16,12 +16,16 @@ namespace TIAM.Database.DataLayers.Users { } + public UserDal(UserDbContext _object) + { + } + public Task> GetUsersAsync() { return Ctx.Users.ToListAsync(); } - public Task GetUserByEmailAsync(string email) + public virtual Task GetUserByEmailAsync(string email) { Console.WriteLine($"Getting user from db {email}"); var emailLower = email.ToLower(); diff --git a/TIAM.Database/DbContexts/UserDbContext.cs b/TIAM.Database/DbContexts/UserDbContext.cs index 23ee41de..68bd96b4 100644 --- a/TIAM.Database/DbContexts/UserDbContext.cs +++ b/TIAM.Database/DbContexts/UserDbContext.cs @@ -12,13 +12,18 @@ namespace TIAM.Database.DbContexts { public class UserDbContext : TiamDbContextBase { - public DbSet Users { get; set; } + public virtual DbSet Users { get; set; } public UserDbContext() //: this(string.Empty) { } + public UserDbContext(DbContextOptions options) //: this(string.Empty) + { + + } + public UserDbContext(string name) : base(name) { } diff --git a/TIAM.Entities/TransferDestinations/TransferDestination.cs b/TIAM.Entities/TransferDestinations/TransferDestination.cs index 50d2fbc0..6e112f30 100644 --- a/TIAM.Entities/TransferDestinations/TransferDestination.cs +++ b/TIAM.Entities/TransferDestinations/TransferDestination.cs @@ -9,22 +9,18 @@ namespace TIAM.Entities.TransferDestinations public class TransferDestination : LocationBase, ITimeStampInfo { public Guid Id { get; set; } - public double Longitude { get; set; } - public double Latitude { get; set; } - public string? Address { get; set; } public string? Name { get; set; } - + public string? Description { get; set; } + public double Latitude { get; set; } + public double Longitude { get; set; } + public string? Address { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } - public TransferDestination() { } - - public TransferDestination(double longitude, double latitude, string address) : this(Guid.NewGuid(), longitude, latitude, address) { } - - public TransferDestination(Guid id, double longitude, double latitude, string address) : base(Guid.NewGuid(), longitude, latitude, address) { } - - - public TransferDestination(Guid id, string name, double longitude, double latitude, string address) : base(id, longitude, latitude, address) { } + public TransferDestination(double latitude, double longitude, string address) : this(Guid.NewGuid(), latitude, longitude, address) { } + public TransferDestination(Guid id, double latitude, double longitude, string address) : base(Guid.NewGuid(), latitude, longitude, address) { } + public TransferDestination(Guid id, string name, double latitude, double longitude, string address) : base(id, latitude,longitude, address) { } + public TransferDestination(Guid id, string name, string description, double latitude, double longitude, string address) : base(id, latitude,longitude, address) { } } } diff --git a/TIAMMobileApp/Services/TransferDataService.cs b/TIAMMobileApp/Services/TransferDataService.cs index 2c0b4719..a896f8c2 100644 --- a/TIAMMobileApp/Services/TransferDataService.cs +++ b/TIAMMobileApp/Services/TransferDataService.cs @@ -2,6 +2,7 @@ using TIAM.Entities.TransferDestinations; using TIAMWebApp.Shared.Application.Interfaces; using TIAMWebApp.Shared.Application.Models; +using TIAMWebApp.Shared.Application.Models.ClientSide; namespace TIAMMobileApp.Services { @@ -17,14 +18,16 @@ namespace TIAMMobileApp.Services /// /// calls the TransferDataAPI to get the list of destinations - public Task GetDestinationsAsync() + public async Task GetDestinationsAsync() { - return http.GetFromJsonAsync("TransferDataAPI"); + var url = $"{Setting.BaseUrl}/{APIUrls.GetTransferDestinations}"; + return await http.GetFromJsonAsync(url); } - public Task GetDestinationAsync(string destinationId) + public async Task GetTransferDestinationbyCoordinatesAsync(string destinationId) { - return http.GetFromJsonAsync($"TransferDataAPI/{destinationId}"); + var url = $"{Setting.BaseUrl}/{APIUrls.GetTransferDestinationByCoordinates}"; + return await http.GetFromJsonAsync(url); } } } diff --git a/TIAMWebApp/Client/Services/TransferDataService.cs b/TIAMWebApp/Client/Services/TransferDataService.cs index fc8f40d7..02926678 100644 --- a/TIAMWebApp/Client/Services/TransferDataService.cs +++ b/TIAMWebApp/Client/Services/TransferDataService.cs @@ -2,21 +2,40 @@ using TIAM.Entities.TransferDestinations; using TIAMWebApp.Shared.Application.Interfaces; using TIAMWebApp.Shared.Application.Models; +using TIAMWebApp.Shared.Application.Models.ClientSide; +using TIAMWebApp.Shared.Application.Utility; namespace TIAMWebApp.Client.Services { public class TransferDataService : ITransferDataService { private readonly HttpClient http; + private readonly LogToBrowserConsole logToBrowserConsole; - public TransferDataService(HttpClient http) + public TransferDataService(HttpClient http, LogToBrowserConsole logToBrowserConsole) { this.http = http; + this.logToBrowserConsole = logToBrowserConsole; } - public Task GetDestinationsAsync() + public async Task GetDestinationsAsync() { - return http.GetFromJsonAsync("TransferDataAPI"); + + var url = $"{Setting.BaseUrl}/{APIUrls.GetTransferDestinations}"; + logToBrowserConsole.LogToBC(url); + return await http.GetFromJsonAsync(url); + } + + public async Task GetTransferDestinationbyCoordinatesAsync(string destinationId) + { + var url = $"{Setting.BaseUrl}/{APIUrls.GetTransferDestinationByCoordinates}"; + return await http.GetFromJsonAsync(url); + } + + public async Task GetTransferDestinationbyAddressAsync(string destinationId) + { + var url = $"{Setting.BaseUrl}/{APIUrls.GetTransferDestinationByAddress}"; + return await http.GetFromJsonAsync(url); } } } diff --git a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs index f4d9d577..8b8f012f 100644 --- a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs +++ b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs @@ -85,11 +85,13 @@ namespace TIAMWebApp.Server.Controllers if (transferDestination != null) { var Id = Guid.NewGuid(); - double Latitude = transferDestination.Latitude; - double Longitude = transferDestination.Longitude; - string Address = transferDestination.Address; + string? Name = transferDestination.Name; + string? Description = transferDestination.Description; + double? Latitude = transferDestination.Latitude; + double? Longitude = transferDestination.Longitude; + string? Address = transferDestination.Address; - if (Id == null || Latitude == null || Longitude == null || Address == null) + if (Id == Guid.Empty || Latitude == null || Longitude == null) { return BadRequest("Invalid request"); } @@ -100,11 +102,17 @@ namespace TIAMWebApp.Server.Controllers Console.WriteLine($"TransferDestination to be created: {Longitude}"); Console.WriteLine($"TransferDestination to be created: {Address}"); - await _transferDestinationDal.Ctx.TransferDestinations.AddRangeAsync(transferDestination); + //await _transferDestinationDal.Ctx.TransferDestinations.AddAsync(transferDestination); + await _transferDestinationDal.CreateTransferDestinationAsync(transferDestination); + return Ok("yes"); } - + } - return Ok("yes"); + else + { + return BadRequest("Invalid request"); + } + } diff --git a/TIAMWebApp/Server/Controllers/UserAPIController.cs b/TIAMWebApp/Server/Controllers/UserAPIController.cs index e3ada751..663e05f8 100644 --- a/TIAMWebApp/Server/Controllers/UserAPIController.cs +++ b/TIAMWebApp/Server/Controllers/UserAPIController.cs @@ -35,12 +35,12 @@ namespace TIAMWebApp.Server.Controllers PasswordHasher hasher = new PasswordHasher(); - private UserModel[] users = new UserModel[] + /*private UserModel[] users = new UserModel[] { new UserModel(new Guid("540271f6-c604-4c16-8160-d5a7cafedf00"), "test@tiam.hu", "+36701234567", "Asdasd123456"), new UserModel(new Guid("4cbaed43-2465-4d99-84f1-c8bc6b7025f7"), "adam@tiam.hu", "+36701234567", "Asdasd987654") - }; + };*/ private readonly ILogger _logger; @@ -97,8 +97,8 @@ namespace TIAMWebApp.Server.Controllers //if (userModel == null) return Unauthorized(); Console.WriteLine(authenticateUser.Email); - var dbUser = await GetUserByEmail(authenticateUser.Email); - + //var dbUser = await GetUserByEmail(authenticateUser.Email); + var dbUser = await _userDal.GetUserByEmailAsync(authenticateUser.Email); //check if password is valid //bool isValidUser = await _userManager.CheckPasswordAsync(userModel, authenticateUser.Password); @@ -293,8 +293,7 @@ namespace TIAMWebApp.Server.Controllers { RegistrationModel? user = JObject.Parse(SerializedRegistrationModel.GetRawText()).ToObject(); - if (users != null) - { + if(user != null) { //add userModel to users array @@ -322,11 +321,7 @@ namespace TIAMWebApp.Server.Controllers } } return Ok("yes"); - } - else - { - return NotFound("no"); - } + } diff --git a/TIAMWebApp/Server/Program.cs b/TIAMWebApp/Server/Program.cs index fcc214c5..8312340b 100644 --- a/TIAMWebApp/Server/Program.cs +++ b/TIAMWebApp/Server/Program.cs @@ -21,6 +21,7 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages(); //builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DeveloperDbConnection")));; +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/TIAMWebApp/Shared/Models/APIUrls.cs b/TIAMWebApp/Shared/Models/APIUrls.cs index 02269c41..e88af920 100644 --- a/TIAMWebApp/Shared/Models/APIUrls.cs +++ b/TIAMWebApp/Shared/Models/APIUrls.cs @@ -16,6 +16,8 @@ namespace TIAMWebApp.Shared.Application.Models public const string RefreshToken = "/api/UserAPI/RefreshToken"; public const string WeatherForecast = "api/WeatherForecastAPI"; public const string PopulationStructure = "PopulationStructureAPI"; - public const string GetTransferDestinations = "api/GetTransferDestinations"; + public const string GetTransferDestinations = "api/TransferDataAPI/GetTransferDestinations"; + public const string GetTransferDestinationByCoordinates = "api/TransferDataAPI/GetTransferDestinationByCoordinates"; + public const string GetTransferDestinationByAddress = "api/TransferDataAPI/GetTransferDestinationByAddress"; } }