using System; using System.Reflection; using System.Net; using System.Net.Http; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.Extensions.Configuration; using Moq; using Newtonsoft.Json; using BasicDotnetTemplate.MainProject; using BasicDotnetTemplate.MainProject.Controllers; using BasicDotnetTemplate.MainProject.Services; using BasicDotnetTemplate.MainProject.Models.Api.Response; using BasicDotnetTemplate.MainProject.Models.Settings; using BasicDotnetTemplate.MainProject.Models.Api.Request.Auth; using BasicDotnetTemplate.MainProject.Models.Api.Data.Auth; using BasicDotnetTemplate.MainProject.Models.Api.Common.User; using BasicDotnetTemplate.MainProject.Models.Api.Common.Role; using DatabaseSqlServer = BasicDotnetTemplate.MainProject.Models.Database.SqlServer; using BasicDotnetTemplate.MainProject.Models.Api.Response.Auth; using Microsoft.AspNetCore.Http; namespace BasicDotnetTemplate.MainProject.Tests; [TestClass] public class AuthController_Tests { [TestMethod] public void AuthController_NullConfiguration() { Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); var exception = true; try { var authServiceMock = new Mock(); _ = new AuthController(null, authServiceMock.Object); exception = false; Assert.Fail($"This test should not pass as configuration is null"); } catch (Exception) { Assert.IsTrue(exception); } } [TestMethod] public async Task AuthenticateAsync_Should_Return_200_When_Successful() { IConfiguration configuration = TestUtils.CreateConfiguration(); var authServiceMock = new Mock(); var controller = new AuthController(configuration, authServiceMock.Object); DatabaseSqlServer.User user = ModelsInit.CreateUser(); AuthenticatedUser authenticatedUser = new AuthenticatedUser(user); var request = new AuthenticateRequest { Data = new AuthenticateRequestData { Email = "user", Password = "pass" } }; authServiceMock.Setup(s => s.AuthenticateAsync(It.IsAny())).ReturnsAsync(authenticatedUser); ObjectResult response = (ObjectResult)(await controller.AuthenticateAsync(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(AuthenticatedUser)); } else { Assert.Fail($"Result value is null"); } } else { Assert.Fail($"Response value is null"); } } [TestMethod] public async Task AuthenticateAsync_AuthenticateRequestDataNull() { IConfiguration configuration = TestUtils.CreateConfiguration(); var authServiceMock = new Mock(); var controller = new AuthController(configuration, authServiceMock.Object); var request = new AuthenticateRequest { Data = null }; AuthenticatedUser? authenticatedUser = null; authServiceMock.Setup(s => s.AuthenticateAsync(It.IsAny())).ReturnsAsync(authenticatedUser); ObjectResult response = (ObjectResult)(await controller.AuthenticateAsync(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 AuthenticateAsync_NotFound() { IConfiguration configuration = TestUtils.CreateConfiguration(); var authServiceMock = new Mock(); var controller = new AuthController(configuration, authServiceMock.Object); var request = new AuthenticateRequest { Data = new AuthenticateRequestData() { Email = "d2ejdI1f4GYpq2kTB1nmeQkZXqR3QSxH8Yqkl7iv7zgfQ13qG/0dUUsreG/WGHWRBE5mVWaV43A=", Password = "d2ejdI1f4GYpq2kTB1nmeQkZXqR3QSxH8Yqkl7iv7zgfQ13qG/0dUUsreG/WGHWRBE5mVWaV43A=" } }; AuthenticatedUser? authenticatedUser = null; authServiceMock.Setup(s => s.AuthenticateAsync(It.IsAny())).ReturnsAsync(authenticatedUser); NotFoundResult response = (NotFoundResult)(await controller.AuthenticateAsync(request)); Assert.IsInstanceOfType(response, typeof(NotFoundResult)); if (response != null) { Assert.IsTrue(response.StatusCode == StatusCodes.Status404NotFound); } else { Assert.Fail($"Response is null"); } } [TestMethod] public async Task AuthenticateAsync_ModelInvalid() { IConfiguration configuration = TestUtils.CreateConfiguration(); var authServiceMock = new Mock(); var controller = new AuthController(configuration, authServiceMock.Object); var request = new AuthenticateRequest { Data = null }; AuthenticatedUser? authenticatedUser = null; authServiceMock.Setup(s => s.AuthenticateAsync(It.IsAny())).ReturnsAsync(authenticatedUser); controller.ModelState.AddModelError("Data", "Invalid data"); ObjectResult response = (ObjectResult)(await controller.AuthenticateAsync(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 AuthenticateAsync_Exception() { IConfiguration configuration = TestUtils.CreateConfiguration(); var authServiceMock = new Mock(); var controller = new AuthController(configuration, authServiceMock.Object); var request = new AuthenticateRequest { Data = new AuthenticateRequestData { Email = "user", Password = "pass" } }; authServiceMock.Setup(s => s.AuthenticateAsync(It.IsAny())).ThrowsAsync(new Exception("Unexpected error")); ObjectResult response = (ObjectResult)(await controller.AuthenticateAsync(request)); 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"); } } }