RefreshControllerTests

This commit is contained in:
Artemy
2025-07-21 18:05:30 +07:00
parent 10b4e5207f
commit 1fc13000b1
3 changed files with 126 additions and 8 deletions
@@ -0,0 +1,117 @@
using AutoFixture;
using Govor.API.Controllers.Authentication;
using Govor.Application.Interfaces.UserSession;
using Govor.Contracts.Requests;
using Govor.Contracts.Responses;
using Microsoft.AspNetCore.Identity.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Moq;
namespace Govor.API.Tests.IntegrationTests.Controllers;
[TestFixture]
public class RefreshControllerTests
{
private Fixture _fixture;
private Mock<ILogger<RefreshController>> _mockLogger;
private Mock<IUserSessionRefresher> _mockSessionRefresher;
private RefreshController _controller;
private RefreshTokenRequest _request;
private RefreshResult _result;
[SetUp]
public void SetUp()
{
_fixture = new Fixture();
_mockLogger = new Mock<ILogger<RefreshController>>();
_mockSessionRefresher = new Mock<IUserSessionRefresher>();
_request = _fixture.Create<RefreshTokenRequest>();
_result = _fixture.Create<RefreshResult>();
_controller = new RefreshController(_mockLogger.Object, _mockSessionRefresher.Object);
}
// Tests for Refresh action
[Test]
public async Task Refresh_ValidRequest_ReturnsOkResult()
{
// Arrange
_mockSessionRefresher.Setup(f => f.RefreshTokenAsync(_request.RefreshToken))
.ReturnsAsync(_result);
// Act
var result = await _controller.Refresh(_request);
//Assert
Assert.That(result, Is.InstanceOf<OkObjectResult>());
var okResult = result as OkObjectResult;
var response = okResult?.Value as RefreshTokenResponse;
Assert.That(response, Is.Not.Null);
Assert.That(response.AccessToken, Is.EqualTo(_result.accessToken));
Assert.That(response.RefreshToken, Is.EqualTo(_result.refreshToken));
}
[Test]
public async Task Refresh_InvalidModelState_ReturnsBadRequest()
{
// Arrange
_controller.ModelState.AddModelError("Error", "Sample error");
// Act
var result = await _controller.Refresh(_request);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
}
[Test]
public async Task Refresh_InvalidRefreshToken_ReturnsBadRequest()
{
// Arrange
_request.RefreshToken = string.Empty;
// Act
var result = await _controller.Refresh(_request);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
var badRequestResult = result as BadRequestObjectResult;
var response = badRequestResult?.Value;
Assert.That(response, Is.EqualTo("Refresh token cant be empty."));
}
[Test]
public async Task Refresh_UnauthorizedAccessException_ReturnsUnauthorizedRequest()
{
// Arrange
_mockSessionRefresher.Setup(f => f.RefreshTokenAsync(_request.RefreshToken))
.ThrowsAsync(new UnauthorizedAccessException());
// Act
var result = await _controller.Refresh(_request);
// Assert
Assert.That(result, Is.InstanceOf<UnauthorizedObjectResult>());
var unauthorized = result as UnauthorizedObjectResult;
var response = unauthorized?.Value;
Assert.That(response, Is.EqualTo("Invalid refresh token"));
}
[Test]
public async Task Refresh_InvalidOperationException_ReturnsBadRequest()
{
// Arrange
_mockSessionRefresher.Setup(f => f.RefreshTokenAsync(_request.RefreshToken))
.ThrowsAsync(new InvalidOperationException());
// Act
var result = await _controller.Refresh(_request);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
}
}
@@ -46,11 +46,11 @@ public class AuthController : Controller
_logger.LogInformation($"Register request for {user.Username} with id {user.Id} processed successfully"); _logger.LogInformation($"Register request for {user.Username} with id {user.Id} processed successfully");
var token = await _userSession.OpenSessionAsync(user, registrationRequest.DeviceInfo); var tokens = await _userSession.OpenSessionAsync(user, registrationRequest.DeviceInfo);
_logger.LogInformation($"Session for user {user.Username} with id {user.Id} has been opened"); _logger.LogInformation($"Session for user {user.Username} with id {user.Id} has been opened");
return Ok(token); return Ok(tokens);
} }
catch (UserAlreadyExistException ex) catch (UserAlreadyExistException ex)
{ {
@@ -86,11 +86,11 @@ public class AuthController : Controller
var user = await _accountService.LoginAsync(loginRequest.Name, loginRequest.Password); var user = await _accountService.LoginAsync(loginRequest.Name, loginRequest.Password);
_logger.LogInformation($"Login request for {user.Username} with id {user.Id} processed successfully"); _logger.LogInformation($"Login request for {user.Username} with id {user.Id} processed successfully");
var token = await _userSession.OpenSessionAsync(user, loginRequest.DeviceInfo); var tokens = await _userSession.OpenSessionAsync(user, loginRequest.DeviceInfo);
_logger.LogInformation($"Session for user {user.Username} with id {user.Id} has been opened"); _logger.LogInformation($"Session for user {user.Username} with id {user.Id} has been opened");
return Ok(token); return Ok(tokens);
} }
catch (UserNotRegisteredException ex) catch (UserNotRegisteredException ex)
{ {
@@ -6,6 +6,8 @@ using Microsoft.AspNetCore.Mvc;
namespace Govor.API.Controllers.Authentication; namespace Govor.API.Controllers.Authentication;
[ApiController]
[AllowAnonymous]
[Route("api/auth/token")] [Route("api/auth/token")]
public class RefreshController : Controller public class RefreshController : Controller
{ {
@@ -19,8 +21,7 @@ public class RefreshController : Controller
} }
[RequireHttps] [RequireHttps]
[AllowAnonymous] [HttpPost("refresh")] // api/auth/token/refresh
[HttpPost("refresh")]
public async Task<IActionResult> Refresh([FromBody] RefreshTokenRequest refreshRequest) public async Task<IActionResult> Refresh([FromBody] RefreshTokenRequest refreshRequest)
{ {
try try
@@ -41,12 +42,12 @@ public class RefreshController : Controller
} }
catch (InvalidOperationException ex) catch (InvalidOperationException ex)
{ {
_logger.LogWarning(ex, "Invalid refresh token"); _logger.LogWarning(ex, "Invalid refresh token.");
return BadRequest(ex.Message); return BadRequest(ex.Message);
} }
catch (UnauthorizedAccessException ex) catch (UnauthorizedAccessException ex)
{ {
_logger.LogWarning(ex, "Refresh token failed"); _logger.LogWarning(ex, "Refresh token failed.");
return Unauthorized("Invalid refresh token"); return Unauthorized("Invalid refresh token");
} }
catch (Exception ex) catch (Exception ex)