diff --git a/server.tests/integrationTests/CharactersControllerIntegrationTests.cs b/server.tests/integrationTests/CharactersControllerIntegrationTests.cs index 9afc85a..9e1acd9 100644 --- a/server.tests/integrationTests/CharactersControllerIntegrationTests.cs +++ b/server.tests/integrationTests/CharactersControllerIntegrationTests.cs @@ -1,6 +1,7 @@ using FluentAssertions; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Testing; +using MongoDB.Bson; using server.Models; using System.Collections; using System.Collections.Generic; @@ -38,7 +39,7 @@ namespace server.tests.integrationTests var data = await response.Content.ReadAsStreamAsync(); - var characters = JsonSerializer.Deserialize>(data); + var characters = JsonSerializer.Deserialize>(data, _serializerOptions); response.StatusCode.Should().Be(HttpStatusCode.OK); response.Headers.Should().ContainKey("X-Rate-Limit-Limit"); @@ -155,5 +156,81 @@ namespace server.tests.integrationTests character.ActorFullName.ToLower().Should().Contain(actorNameValue); } } + + [Fact] + public async Task GetCharacterByIdAsync_ValidCharacterId_Returns200StatusCodeWithCharacter() + { + var response = await _client.GetAsync(_endpoint); + + var data = await response.Content.ReadAsStreamAsync(); + + var characters = JsonSerializer.Deserialize>(data, _serializerOptions); + + var characterId = characters[0].Id; + + var url = $"{_endpoint}/{characterId}"; + + response = await _client.GetAsync(url); + + data = await response.Content.ReadAsStreamAsync(); + + var character = JsonSerializer.Deserialize(data, _serializerOptions); + + response.StatusCode.Should().Be(HttpStatusCode.OK); + response.Headers.Should().ContainKey("X-Rate-Limit-Limit"); + response.Headers.Should().ContainKey("X-Rate-Limit-Remaining"); + response.Headers.Should().ContainKey("X-Rate-Limit-Reset"); + + character.Should().NotBeNull(); + character.Should().BeOfType(); + character.Id.Should().Be(characterId); + } + + [Fact] + public async Task GetCharacterByIdAsync_InvalidCharacterId_Returns400StatusCodeWithValidationProblemDetails() + { + var characterId = "1"; + + var url = $"{_endpoint}/{characterId}"; + + var response = await _client.GetAsync(url); + + var data = await response.Content.ReadAsStreamAsync(); + + var details = JsonSerializer.Deserialize(data, _serializerOptions); + + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + response.Headers.Should().ContainKey("X-Rate-Limit-Limit"); + response.Headers.Should().ContainKey("X-Rate-Limit-Remaining"); + response.Headers.Should().ContainKey("X-Rate-Limit-Reset"); + + details.Should().NotBeNull(); + details.Should().BeOfType(); + details.Detail.Should().NotBeNull(); + details.Errors.Should().NotBeNull(); + } + + [Fact] + public async Task GetCharacterByIdAsync_ValidCharacterIdForNonExistentCharacter_Returns404StatusCodeWithProblemDetails() + { + var characterId = ObjectId.GenerateNewId(); + + var url = $"{_endpoint}/{characterId}"; + + var response = await _client.GetAsync(url); + + var data = await response.Content.ReadAsStreamAsync(); + + var details = JsonSerializer.Deserialize(data, _serializerOptions); + + response.StatusCode.Should().Be(HttpStatusCode.NotFound); + response.Headers.Should().ContainKey("X-Rate-Limit-Limit"); + response.Headers.Should().ContainKey("X-Rate-Limit-Remaining"); + response.Headers.Should().ContainKey("X-Rate-Limit-Reset"); + + details.Should().NotBeNull(); + details.Should().BeOfType(); + details.Detail.Should().NotBeNull(); + } } } diff --git a/server.tests/unitTests/CharacterControllerUnitTests.cs b/server.tests/unitTests/CharacterControllerUnitTests.cs index 929857c..e59cbaf 100644 --- a/server.tests/unitTests/CharacterControllerUnitTests.cs +++ b/server.tests/unitTests/CharacterControllerUnitTests.cs @@ -24,7 +24,7 @@ namespace server.tests.unitTests { var filter = new CharacterFilter(); - var characters = new List {new Character(), new Character()}; + var characters = new List { new Character(), new Character() }; _mockRepo .Setup(repo => repo.GetCharactersAsync(filter)) @@ -32,9 +32,9 @@ namespace server.tests.unitTests 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); @@ -66,5 +66,51 @@ namespace server.tests.unitTests details.Should().NotBeNull(); details.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(); + } + + [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(); + } } } diff --git a/server/Controllers/v1/CharactersController.cs b/server/Controllers/v1/CharactersController.cs index ddc3fdf..0cf465a 100644 --- a/server/Controllers/v1/CharactersController.cs +++ b/server/Controllers/v1/CharactersController.cs @@ -66,7 +66,7 @@ namespace server.Controllers.v1 if (!ObjectId.TryParse(id, out _)) { ModelState.AddModelError(nameof(id), $"{id} is not a valid id"); - return ValidationProblem(); + return ValidationProblem(detail: "Invalid request"); } try