using FluentAssertions; using Microsoft.AspNetCore.Mvc; using Moq; using server.Controllers.v1; using server.Models; using server.Persistence.Repositories; using System.Net; namespace server.tests.v1.UnitTests { public class CharactersControllerUnitTests { private readonly Mock _mockRepo; private readonly CharactersController _controller; public CharactersControllerUnitTests() { _mockRepo = new Mock(); _controller = new CharactersController(_mockRepo.Object); } [Fact] public async Task GetCharactersAsync_AllCharacters_Returns200StatusCodeWithCharactersCollection() { var filter = new CharacterFilter(); var characters = new List { new Character(), new Character() }; _mockRepo .Setup(repo => repo.GetCharactersAsync(filter)) .ReturnsAsync(characters); var response = await _controller.GetCharactersAsync(filter) as ObjectResult; var data = response.Value as List; _mockRepo.Verify(repo => repo.GetCharactersAsync(It.IsAny()), Times.Once()); response.Should().NotBeNull(); response.Should().BeOfType(); response.StatusCode.Should().Be((int)HttpStatusCode.OK); data.Should().NotBeNull(); data.Should().BeOfType>(); data.Should().HaveCount(2); } [Fact] public async Task GetCharactersAsync_RepoThrowsException_Returns500StatusCodeWithProblemDetails() { var filter = new CharacterFilter(); _mockRepo .Setup(repo => repo.GetCharactersAsync(filter)) .Throws(new Exception()); var response = await _controller.GetCharactersAsync(filter) as ObjectResult; var details = response.Value; _mockRepo.Verify(repo => repo.GetCharactersAsync(It.IsAny()), Times.Once()); response.Should().NotBeNull(); response.Should().BeOfType(); response.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError); details.Should().NotBeNull(); details.Should().BeOfType(); } [Fact] public async Task GetCharacterByIdAsync_ValidCharacterId_Returns200StatusCodeWithCharacter() { var characterId = "62b7d5506c1b407771829926"; _mockRepo .Setup(repo => repo.GetCharacterByIdAsync(characterId)) .ReturnsAsync(new Character()); var response = await _controller.GetCharacterByIdAsync(characterId) as ObjectResult; var character = response.Value; _mockRepo.Verify(repo => repo.GetCharacterByIdAsync(It.IsAny()), Times.Once()); response.Should().NotBeNull(); response.Should().BeOfType(); response.StatusCode.Should().Be((int)HttpStatusCode.OK); character.Should().NotBeNull(); character.Should().BeOfType(); } [Fact] public async Task GetCharacterByIdAsync_RepoThrowsException_Returns500StatusCodeWithProblemDetails() { var characterId = "62b7d5506c1b407771829926"; _mockRepo .Setup(repo => repo.GetCharacterByIdAsync(characterId)) .Throws(new Exception()); var response = await _controller.GetCharacterByIdAsync(characterId) as ObjectResult; var details = response.Value; _mockRepo.Verify(repo => repo.GetCharacterByIdAsync(It.IsAny()), Times.Once()); response.Should().NotBeNull(); response.Should().BeOfType(); response.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError); details.Should().NotBeNull(); details.Should().BeOfType(); } } }