From 5bc75de87c32767ae2ba9689123b174cfdf550d4 Mon Sep 17 00:00:00 2001 From: csimonapastore Date: Mon, 17 Mar 2025 00:33:19 +0100 Subject: [PATCH] Adding tests for UserController --- .../Controllers/UserController_Tests.cs | 322 ++++++++++++++++-- MainProject/Controllers/UserController.cs | 4 +- 2 files changed, 288 insertions(+), 38 deletions(-) diff --git a/MainProject.Tests/Controllers/UserController_Tests.cs b/MainProject.Tests/Controllers/UserController_Tests.cs index aa1135d..be67d0b 100644 --- a/MainProject.Tests/Controllers/UserController_Tests.cs +++ b/MainProject.Tests/Controllers/UserController_Tests.cs @@ -23,6 +23,9 @@ using BasicDotnetTemplate.MainProject.Models.Api.Response.Auth; using AutoMapper; using BasicDotnetTemplate.MainProject.Core.Middlewares; using Microsoft.AspNetCore.Http; +using BasicDotnetTemplate.MainProject.Models.Api.Request.User; +using BasicDotnetTemplate.MainProject.Models.Api.Data.User; +using BasicDotnetTemplate.MainProject.Models.Database.SqlServer; namespace BasicDotnetTemplate.MainProject.Tests; @@ -31,6 +34,9 @@ namespace BasicDotnetTemplate.MainProject.Tests; public class UserControllerTests { private IMapper? _mapper; + private Mock _userServiceMock; + private Mock _roleServiceMock; + private UserController _userController; [TestInitialize] public void Setup() @@ -41,6 +47,10 @@ public class UserControllerTests }); _mapper = config.CreateMapper(); + IConfiguration configuration = TestUtils.CreateConfiguration(); + _userServiceMock = new Mock(); + _roleServiceMock = new Mock(); + _userController = new UserController(configuration, _userServiceMock.Object, _roleServiceMock.Object); } [TestMethod] @@ -66,15 +76,11 @@ public class UserControllerTests [TestMethod] public async Task GetUserByGuidAsync_Should_Return_200_When_Successful() { - IConfiguration configuration = TestUtils.CreateConfiguration(); - var userServiceMock = new Mock(); - var roleServiceMock = new Mock(); - var controller = new UserController(configuration, userServiceMock.Object, roleServiceMock.Object); var guid = Guid.NewGuid().ToString(); DatabaseSqlServer.User user = ModelsInit.CreateUser(); - userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); - ObjectResult response = (ObjectResult)(await controller.GetUserByGuidAsync(guid)); + _userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); + ObjectResult response = (ObjectResult)(await _userController.GetUserByGuidAsync(guid)); if (response != null && response.Value != null) { Assert.IsTrue(response.StatusCode == StatusCodes.Status200OK); @@ -83,7 +89,7 @@ public class UserControllerTests if (result != null) { Assert.IsTrue(result.Status == StatusCodes.Status200OK); - Assert.IsInstanceOfType(result.Data, typeof(DatabaseSqlServer.User)); + Assert.IsInstanceOfType(result.Data, typeof(UserDto)); } else { @@ -99,16 +105,11 @@ public class UserControllerTests [TestMethod] public async Task GetUserByGuidAsync_AuthenticateRequestDataNull() { - IConfiguration configuration = TestUtils.CreateConfiguration(); - var userServiceMock = new Mock(); - var roleServiceMock = new Mock(); - var controller = new UserController(configuration, userServiceMock.Object, roleServiceMock.Object); - var guid = String.Empty; DatabaseSqlServer.User? user = null; - userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); - ObjectResult response = (ObjectResult)(await controller.GetUserByGuidAsync(guid)); + _userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); + ObjectResult response = (ObjectResult)(await _userController.GetUserByGuidAsync(guid)); if (response != null && response.Value != null) { @@ -134,15 +135,10 @@ public class UserControllerTests [TestMethod] public async Task GetUserByGuidAsync_NotFound() { - IConfiguration configuration = TestUtils.CreateConfiguration(); - var userServiceMock = new Mock(); - var roleServiceMock = new Mock(); - var controller = new UserController(configuration, userServiceMock.Object, roleServiceMock.Object); - var guid = Guid.NewGuid().ToString(); DatabaseSqlServer.User? user = null; - userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); - NotFoundResult response = (NotFoundResult)(await controller.GetUserByGuidAsync(guid)); + _userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); + NotFoundResult response = (NotFoundResult)(await _userController.GetUserByGuidAsync(guid)); Assert.IsInstanceOfType(response, typeof(NotFoundResult)); @@ -159,16 +155,11 @@ public class UserControllerTests [TestMethod] public async Task GetUserByGuidAsync_ModelInvalid() { - IConfiguration configuration = TestUtils.CreateConfiguration(); - var userServiceMock = new Mock(); - var roleServiceMock = new Mock(); - var controller = new UserController(configuration, userServiceMock.Object, roleServiceMock.Object); - var guid = Guid.NewGuid().ToString(); DatabaseSqlServer.User? user = null; - userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); - controller.ModelState.AddModelError("Data", "Invalid data"); - ObjectResult response = (ObjectResult)(await controller.GetUserByGuidAsync(guid)); + _userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ReturnsAsync(user); + _userController.ModelState.AddModelError("Data", "Invalid data"); + ObjectResult response = (ObjectResult)(await _userController.GetUserByGuidAsync(guid)); Assert.IsInstanceOfType(response, typeof(ObjectResult)); @@ -196,14 +187,9 @@ public class UserControllerTests [TestMethod] public async Task GetUserByGuidAsync_Exception() { - IConfiguration configuration = TestUtils.CreateConfiguration(); - var userServiceMock = new Mock(); - var roleServiceMock = new Mock(); - var controller = new UserController(configuration, userServiceMock.Object, roleServiceMock.Object); - var guid = Guid.NewGuid().ToString(); - userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ThrowsAsync(new Exception("Unexpected error")); - ObjectResult response = (ObjectResult)(await controller.GetUserByGuidAsync(guid)); + _userServiceMock.Setup(s => s.GetUserByGuidAsync(It.IsAny())).ThrowsAsync(new Exception("Unexpected error")); + ObjectResult response = (ObjectResult)(await _userController.GetUserByGuidAsync(guid)); Assert.IsInstanceOfType(response, typeof(ObjectResult)); @@ -228,4 +214,268 @@ public class UserControllerTests } } + [TestMethod] + public async Task CreateUserAsync_Should_Return_200_When_Successful() + { + DatabaseSqlServer.User user = ModelsInit.CreateUser(); + DatabaseSqlServer.Role role = ModelsInit.CreateRole(); + + CreateUserRequest request = new CreateUserRequest() + { + Data = new CreateUserRequestData() + { + FirstName = user.FirstName, + LastName = user.LastName, + Email = user.Email, + Password = user.Password + } + }; + + _roleServiceMock.Setup(s => s.GetRoleForUser(null)).ReturnsAsync(role); + _userServiceMock.Setup(s => s.CreateUserAsync(request.Data, role)).ReturnsAsync(user); + + ObjectResult response = (ObjectResult)(await _userController.CreateUserAsync(request)); + if (response != null && response.Value != null) + { + Assert.IsTrue(response.StatusCode == StatusCodes.Status200OK); + + var result = (BaseResponse)response.Value; + if (result != null) + { + Assert.IsTrue(result.Status == StatusCodes.Status200OK); + Assert.IsInstanceOfType(result.Data, typeof(UserDto)); + } + else + { + Assert.Fail($"Result value is null"); + } + } + else + { + Assert.Fail($"Response value is null"); + } + } + + [TestMethod] + public async Task CreateUserAsync_RoleNull() + { + DatabaseSqlServer.User user = ModelsInit.CreateUser(); + + CreateUserRequest request = new CreateUserRequest() + { + Data = new CreateUserRequestData() + { + FirstName = user.FirstName, + LastName = user.LastName, + Email = user.Email, + Password = user.Password + } + }; + + _userServiceMock.Setup(s => s.CreateUserAsync( + It.IsAny(), + It.IsAny() + )).ReturnsAsync(user); + + ObjectResult response = (ObjectResult)(await _userController.CreateUserAsync(request)); + + if (response != null && response.Value != null) + { + Assert.IsTrue(response.StatusCode == StatusCodes.Status400BadRequest); + + var result = (BaseResponse)response.Value; + if (result != null) + { + Assert.IsTrue(result.Status == StatusCodes.Status400BadRequest); + Assert.IsTrue(result.Message == "Role not found"); + } + else + { + Assert.Fail($"Result value is null"); + } + } + else + { + Assert.Fail($"Response value is null"); + } + } + + [TestMethod] + public async Task CreateUserAsync_CreateUserRequestDataNull() + { + DatabaseSqlServer.User user = ModelsInit.CreateUser(); + + CreateUserRequest request = new CreateUserRequest() + { + Data = null + }; + + _userServiceMock.Setup(s => s.CreateUserAsync( + It.IsAny(), + It.IsAny() + )).ReturnsAsync(user); + + ObjectResult response = (ObjectResult)(await _userController.CreateUserAsync(request)); + + if (response != null && response.Value != null) + { + Assert.IsTrue(response.StatusCode == StatusCodes.Status400BadRequest); + + var result = (BaseResponse)response.Value; + if (result != null) + { + Assert.IsTrue(result.Status == StatusCodes.Status400BadRequest); + Assert.IsTrue(result.Message == "Request is not well formed"); + } + else + { + Assert.Fail($"Result value is null"); + } + } + else + { + Assert.Fail($"Response value is null"); + } + } + + [TestMethod] + public async Task CreateUserAsync_NotCreated() + { + DatabaseSqlServer.User user = ModelsInit.CreateUser(); + DatabaseSqlServer.Role role = ModelsInit.CreateRole(); + DatabaseSqlServer.User? expectedUser = null; + + CreateUserRequest request = new CreateUserRequest() + { + Data = new CreateUserRequestData() + { + FirstName = user.FirstName, + LastName = user.LastName, + Email = user.Email, + Password = user.Password + } + }; + + _roleServiceMock.Setup(s => s.GetRoleForUser(null)).ReturnsAsync(role); + _userServiceMock.Setup(s => s.CreateUserAsync(request.Data, role)).ReturnsAsync(expectedUser); + + ObjectResult response = (ObjectResult)(await _userController.CreateUserAsync(request)); + if (response != null && response.Value != null) + { + Console.WriteLine(JsonConvert.SerializeObject(response)); + Assert.IsTrue(response.StatusCode == StatusCodes.Status400BadRequest); + + var result = (BaseResponse)response.Value; + if (result != null) + { + Assert.IsTrue(result.Status == StatusCodes.Status400BadRequest); + Assert.IsTrue(result.Message == "Not created"); + } + else + { + Assert.Fail($"Result value is null"); + } + } + else + { + Assert.Fail($"Response value is null"); + } + } + + [TestMethod] + public async Task CreateUserAsync_ModelInvalid() + { + DatabaseSqlServer.User user = ModelsInit.CreateUser(); + + CreateUserRequest request = new CreateUserRequest() + { + Data = new CreateUserRequestData() + { + FirstName = user.FirstName, + LastName = user.LastName, + Email = user.Email, + Password = user.Password + } + }; + + _userServiceMock.Setup(s => s.CreateUserAsync( + It.IsAny(), + It.IsAny() + )).ReturnsAsync(user); + _userController.ModelState.AddModelError("Data", "Invalid data"); + ObjectResult response = (ObjectResult)(await _userController.CreateUserAsync(request)); + + Assert.IsInstanceOfType(response, typeof(ObjectResult)); + + if (response != null && response.Value != null) + { + Assert.IsTrue(response.StatusCode == StatusCodes.Status400BadRequest); + + var result = (BaseResponse)response.Value; + if (result != null) + { + Assert.IsTrue(result.Status == StatusCodes.Status400BadRequest); + Assert.IsTrue(result.Message == "Request is not well formed"); + } + else + { + Assert.Fail($"Result value is null"); + } + } + else + { + Assert.Fail($"Response is null"); + } + } + + [TestMethod] + public async Task CreateUserAsync_Exception() + { + DatabaseSqlServer.User user = ModelsInit.CreateUser(); + DatabaseSqlServer.Role role = ModelsInit.CreateRole(); + + CreateUserRequest request = new CreateUserRequest() + { + Data = new CreateUserRequestData() + { + FirstName = user.FirstName, + LastName = user.LastName, + Email = user.Email, + Password = user.Password + } + }; + + _roleServiceMock.Setup(s => s.GetRoleForUser(null)).ReturnsAsync(role); + _userServiceMock.Setup(s => s.CreateUserAsync(request.Data, role)).ReturnsAsync(user); + + _userServiceMock.Setup(s => s.CreateUserAsync( + It.IsAny(), + It.IsAny() + )).ThrowsAsync(new Exception("Unexpected error")); + + ObjectResult response = (ObjectResult)(await _userController.CreateUserAsync(request)); + Console.WriteLine(JsonConvert.SerializeObject(response)); + Assert.IsInstanceOfType(response, typeof(ObjectResult)); + + if (response != null && response.Value != null) + { + Assert.IsTrue(response.StatusCode == StatusCodes.Status500InternalServerError); + + var result = (BaseResponse)response.Value; + if (result != null) + { + Assert.IsTrue(result.Status == StatusCodes.Status500InternalServerError); + Assert.IsTrue(result.Message == "Something went wrong. Unexpected error"); + } + else + { + Assert.Fail($"Result value is null"); + } + } + else + { + Assert.Fail($"Response is null"); + } + } + } diff --git a/MainProject/Controllers/UserController.cs b/MainProject/Controllers/UserController.cs index c271fe0..bceaf7a 100644 --- a/MainProject/Controllers/UserController.cs +++ b/MainProject/Controllers/UserController.cs @@ -93,7 +93,7 @@ namespace BasicDotnetTemplate.MainProject.Controllers if (await this._userService.CheckIfEmailIsValid(request.Data.Email)) { - return BadRequest(); + return BadRequest("Invalid email"); } else { @@ -107,7 +107,7 @@ namespace BasicDotnetTemplate.MainProject.Controllers if (user == null || String.IsNullOrEmpty(user.Guid)) { - return BadRequest(); + return BadRequest("Not created"); } var userDto = _mapper?.Map(user);