2022-07-05 14:38:00 -05:00
|
|
|
using FluentAssertions;
|
2022-07-06 09:41:28 -05:00
|
|
|
using Microsoft.AspNetCore.Mvc;
|
2022-07-05 14:38:00 -05:00
|
|
|
using Microsoft.AspNetCore.Mvc.Testing;
|
2022-07-06 11:01:46 -05:00
|
|
|
using MongoDB.Bson;
|
2022-07-05 15:29:48 -05:00
|
|
|
using server.Models;
|
2022-07-05 14:38:00 -05:00
|
|
|
using System.Net;
|
2022-07-05 15:29:48 -05:00
|
|
|
using System.Text.Json;
|
2022-07-06 19:46:19 -05:00
|
|
|
using server.tests.Helpers;
|
2022-07-05 14:38:00 -05:00
|
|
|
|
2022-07-06 19:46:19 -05:00
|
|
|
namespace server.tests.IntegrationTests
|
2022-07-05 14:38:00 -05:00
|
|
|
{
|
2022-07-06 09:41:28 -05:00
|
|
|
public class CharactersControllerIntegrationTests
|
2022-07-05 14:38:00 -05:00
|
|
|
{
|
|
|
|
|
private readonly HttpClient _client;
|
2022-07-05 15:29:48 -05:00
|
|
|
private readonly JsonSerializerOptions _serializerOptions;
|
2022-07-06 09:41:28 -05:00
|
|
|
private readonly string _endpoint;
|
2022-07-05 14:38:00 -05:00
|
|
|
|
|
|
|
|
public CharactersControllerIntegrationTests()
|
|
|
|
|
{
|
|
|
|
|
var webAppFactory = new WebApplicationFactory<Program>();
|
2022-07-05 15:29:48 -05:00
|
|
|
|
2022-07-05 14:38:00 -05:00
|
|
|
_client = webAppFactory.CreateDefaultClient();
|
2022-07-05 15:29:48 -05:00
|
|
|
|
2022-07-05 14:55:50 -05:00
|
|
|
_client.DefaultRequestHeaders.Add("x-api-version", "1");
|
2022-07-05 15:29:48 -05:00
|
|
|
|
|
|
|
|
_serializerOptions = new JsonSerializerOptions
|
|
|
|
|
{
|
|
|
|
|
PropertyNameCaseInsensitive = true
|
|
|
|
|
};
|
2022-07-06 09:41:28 -05:00
|
|
|
|
|
|
|
|
_endpoint = "/api/characters";
|
2022-07-05 14:38:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
2022-07-06 09:41:28 -05:00
|
|
|
public async Task GetCharactersAsync_AllCharacters_Returns200StatusCodeWithCharacters()
|
2022-07-05 14:38:00 -05:00
|
|
|
{
|
2022-07-06 09:41:28 -05:00
|
|
|
var response = await _client.GetAsync(_endpoint);
|
2022-07-05 14:55:50 -05:00
|
|
|
|
2022-07-05 15:29:48 -05:00
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
2022-07-06 11:01:46 -05:00
|
|
|
var characters = JsonSerializer.Deserialize<List<Character>>(data, _serializerOptions);
|
2022-07-05 15:29:48 -05:00
|
|
|
|
2022-07-05 14:38:00 -05:00
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 09:41:28 -05:00
|
|
|
|
|
|
|
|
characters.Should().NotBeNull();
|
|
|
|
|
characters.Should().BeOfType<List<Character>>();
|
|
|
|
|
characters.Should().HaveCountGreaterThan(0);
|
2022-07-05 15:29:48 -05:00
|
|
|
}
|
2022-07-06 09:41:28 -05:00
|
|
|
|
2022-07-05 15:29:48 -05:00
|
|
|
[Fact]
|
2022-07-06 09:41:28 -05:00
|
|
|
public async Task GetCharactersAsync_SeasonOneCharacters_Returns200StatusCodeWithCharacters()
|
2022-07-05 15:29:48 -05:00
|
|
|
{
|
2022-07-06 09:41:28 -05:00
|
|
|
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);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 09:41:28 -05:00
|
|
|
|
|
|
|
|
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);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 09:41:28 -05:00
|
|
|
|
|
|
|
|
details.Should().NotBeNull();
|
|
|
|
|
details.Should().BeOfType<ValidationProblemDetails>();
|
2022-07-06 19:46:19 -05:00
|
|
|
details.Errors.Should().NotBeNull();
|
2022-07-06 09:41:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[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);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 09:41:28 -05:00
|
|
|
|
|
|
|
|
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);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 09:41:28 -05:00
|
|
|
|
|
|
|
|
characters.Should().NotBeNull();
|
|
|
|
|
characters.Should().BeOfType<List<Character>>();
|
|
|
|
|
characters.Should().HaveCountGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
foreach (var character in characters)
|
|
|
|
|
{
|
|
|
|
|
character.ActorFullName.ToLower().Should().Contain(actorNameValue);
|
|
|
|
|
}
|
2022-07-05 14:38:00 -05:00
|
|
|
}
|
2022-07-06 11:01:46 -05:00
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetCharacterByIdAsync_ValidCharacterId_Returns200StatusCodeWithCharacter()
|
|
|
|
|
{
|
|
|
|
|
var response = await _client.GetAsync(_endpoint);
|
|
|
|
|
|
|
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
|
|
|
|
var characters = JsonSerializer.Deserialize<List<Character>>(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<Character>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 11:01:46 -05:00
|
|
|
|
|
|
|
|
character.Should().NotBeNull();
|
|
|
|
|
character.Should().BeOfType<Character>();
|
|
|
|
|
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<ValidationProblemDetails>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 11:01:46 -05:00
|
|
|
|
|
|
|
|
details.Should().NotBeNull();
|
|
|
|
|
details.Should().BeOfType<ValidationProblemDetails>();
|
|
|
|
|
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<ProblemDetails>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 11:01:46 -05:00
|
|
|
|
|
|
|
|
details.Should().NotBeNull();
|
|
|
|
|
details.Should().BeOfType<ProblemDetails>();
|
|
|
|
|
details.Detail.Should().NotBeNull();
|
|
|
|
|
}
|
2022-07-05 14:38:00 -05:00
|
|
|
}
|
|
|
|
|
}
|