finished tests for getcharactersasync

This commit is contained in:
StevanFreeborn
2022-07-06 09:41:28 -05:00
parent a9e4c628c9
commit 7ac3b16cb8
2 changed files with 169 additions and 9 deletions
@@ -1,15 +1,19 @@
using FluentAssertions; using FluentAssertions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.Mvc.Testing;
using server.Models; using server.Models;
using System.Collections;
using System.Collections.Generic;
using System.Net; using System.Net;
using System.Text.Json; using System.Text.Json;
namespace server.tests.integrationTests namespace server.tests.integrationTests
{ {
public class CharactersControllerIntegrationTests public class CharactersControllerIntegrationTests
{ {
private readonly HttpClient _client; private readonly HttpClient _client;
private readonly JsonSerializerOptions _serializerOptions; private readonly JsonSerializerOptions _serializerOptions;
private readonly string _endpoint;
public CharactersControllerIntegrationTests() public CharactersControllerIntegrationTests()
{ {
@@ -23,29 +27,133 @@ namespace server.tests.integrationTests
{ {
PropertyNameCaseInsensitive = true PropertyNameCaseInsensitive = true
}; };
_endpoint = "/api/characters";
} }
[Fact] [Fact]
public async Task GetCharacters_RetrieveAllCharacters_Returns200StatusCodeWithCharacters() public async Task GetCharactersAsync_AllCharacters_Returns200StatusCodeWithCharacters()
{ {
var response = await _client.GetAsync("/api/characters"); var response = await _client.GetAsync(_endpoint);
var data = await response.Content.ReadAsStreamAsync(); var data = await response.Content.ReadAsStreamAsync();
var characters = JsonSerializer.Deserialize<List<Character>>(data); var characters = JsonSerializer.Deserialize<List<Character>>(data);
response.StatusCode.Should().Be(HttpStatusCode.OK); response.StatusCode.Should().Be(HttpStatusCode.OK);
characters.Should().NotBeNull();
characters.Should().HaveCountGreaterThan(0);
response.Headers.Should().ContainKey("X-Rate-Limit-Limit"); response.Headers.Should().ContainKey("X-Rate-Limit-Limit");
response.Headers.Should().ContainKey("X-Rate-Limit-Remaining"); response.Headers.Should().ContainKey("X-Rate-Limit-Remaining");
response.Headers.Should().ContainKey("X-Rate-Limit-Reset"); response.Headers.Should().ContainKey("X-Rate-Limit-Reset");
characters.Should().NotBeNull();
characters.Should().BeOfType<List<Character>>();
characters.Should().HaveCountGreaterThan(0);
} }
[Fact] [Fact]
public async Task GetCharacters_RetrieveSeasonOneCharacters_Returns200StatusCodeWithCharacters() public async Task GetCharactersAsync_SeasonOneCharacters_Returns200StatusCodeWithCharacters()
{ {
return; var seasonValue = 1;
var url = $"{_endpoint}?season={seasonValue}";
var response = await _client.GetAsync(url);
var data = await response.Content.ReadAsStreamAsync();
var characters = JsonSerializer.Deserialize<List<Character>>(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");
characters.Should().NotBeNull();
characters.Should().BeOfType<List<Character>>();
characters.Should().HaveCountGreaterThan(0);
foreach (var character in characters)
{
character.Seasons.Should().Contain(seasonValue);
}
}
[Fact]
public async Task GetCharactersAsync_InvalidSeasonQueryParameter_Returns400StatusCodeWithValidationProblemDetails()
{
var seasonValue = "test";
var url = $"{_endpoint}?season={seasonValue}";
var response = await _client.GetAsync(url);
var data = await response.Content.ReadAsStreamAsync();
var details = JsonSerializer.Deserialize<ValidationProblemDetails>(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<ValidationProblemDetails>();
}
[Fact]
public async Task GetCharactersAsync_NameContainsJason_Returns200StatusCodeWithCharacters()
{
var nameValue = "jason";
var url = $"{_endpoint}?name={nameValue}";
var response = await _client.GetAsync(url);
var data = await response.Content.ReadAsStreamAsync();
var characters = JsonSerializer.Deserialize<List<Character>>(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");
characters.Should().NotBeNull();
characters.Should().BeOfType<List<Character>>();
characters.Should().HaveCountGreaterThan(0);
foreach (var character in characters)
{
character.FullName.ToLower().Should().Contain(nameValue);
}
}
[Fact]
public async Task GetCharactersAsync_ActorNameContainsMandy_Returns200StatusCodeWithCharacters()
{
var actorNameValue = "mandy";
var url = $"{_endpoint}?actorname={actorNameValue}";
var response = await _client.GetAsync(url);
var data = await response.Content.ReadAsStreamAsync();
var characters = JsonSerializer.Deserialize<List<Character>>(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");
characters.Should().NotBeNull();
characters.Should().BeOfType<List<Character>>();
characters.Should().HaveCountGreaterThan(0);
foreach (var character in characters)
{
character.ActorFullName.ToLower().Should().Contain(actorNameValue);
}
} }
} }
} }
@@ -1,6 +1,10 @@
using Moq; using FluentAssertions;
using Microsoft.AspNetCore.Mvc;
using Moq;
using server.Controllers.v1; using server.Controllers.v1;
using server.Models;
using server.Persistence.Repositories; using server.Persistence.Repositories;
using System.Net;
namespace server.tests.unitTests namespace server.tests.unitTests
{ {
@@ -14,5 +18,53 @@ namespace server.tests.unitTests
_mockRepo = new Mock<ICharacterRepository>(); _mockRepo = new Mock<ICharacterRepository>();
_controller = new CharactersController(_mockRepo.Object); _controller = new CharactersController(_mockRepo.Object);
} }
[Fact]
public async Task GetCharactersAsync_AllCharacters_Returns200StatusCodeWithCharactersCollection()
{
var filter = new CharacterFilter();
var characters = new List<Character> {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<Character>;
_mockRepo.Verify(repo => repo.GetCharactersAsync(It.IsAny<CharacterFilter>()), Times.Once());
response.Should().NotBeNull();
response.Should().BeOfType<OkObjectResult>();
response.StatusCode.Should().Be((int)HttpStatusCode.OK);
data.Should().NotBeNull();
data.Should().BeOfType<List<Character>>();
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<CharacterFilter>()), Times.Once());
response.Should().NotBeNull();
response.Should().BeOfType<ObjectResult>();
response.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError);
details.Should().NotBeNull();
details.Should().BeOfType<ProblemDetails>();
}
} }
} }