2022-07-06 13:02:57 -05:00
|
|
|
using FluentAssertions;
|
2022-07-06 19:46:19 -05:00
|
|
|
using Microsoft.AspNetCore.Mvc;
|
2022-07-06 13:02:57 -05:00
|
|
|
using Microsoft.AspNetCore.Mvc.Testing;
|
|
|
|
|
using server.Models;
|
|
|
|
|
using System.Net;
|
2022-07-06 11:13:57 -05:00
|
|
|
using System.Text.Json;
|
2022-07-06 19:46:19 -05:00
|
|
|
using server.tests.Helpers;
|
2022-07-06 11:13:57 -05:00
|
|
|
|
2022-07-06 19:46:19 -05:00
|
|
|
namespace server.tests.IntegrationTests
|
2022-07-06 11:13:57 -05:00
|
|
|
{
|
|
|
|
|
public class EpisodesControllerIntegrationTests
|
|
|
|
|
{
|
|
|
|
|
private readonly HttpClient _client;
|
|
|
|
|
private readonly JsonSerializerOptions _serializerOptions;
|
|
|
|
|
private readonly string _endpoint;
|
|
|
|
|
|
|
|
|
|
public EpisodesControllerIntegrationTests()
|
|
|
|
|
{
|
|
|
|
|
var webAppFactory = new WebApplicationFactory<Program>();
|
|
|
|
|
|
|
|
|
|
_client = webAppFactory.CreateDefaultClient();
|
|
|
|
|
|
|
|
|
|
_client.DefaultRequestHeaders.Add("x-api-version", "1");
|
|
|
|
|
|
|
|
|
|
_serializerOptions = new JsonSerializerOptions
|
|
|
|
|
{
|
|
|
|
|
PropertyNameCaseInsensitive = true
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_endpoint = "/api/episodes";
|
|
|
|
|
}
|
2022-07-06 13:02:57 -05:00
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_AllEpisodes_Returns200StatusCodeWithEpisodes()
|
|
|
|
|
{
|
|
|
|
|
var response = await _client.GetAsync(_endpoint);
|
|
|
|
|
|
|
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
|
|
|
|
var episodes = JsonSerializer.Deserialize<List<Episode>>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
2022-07-06 19:46:19 -05:00
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
2022-07-06 13:02:57 -05:00
|
|
|
|
|
|
|
|
episodes.Should().NotBeNull();
|
|
|
|
|
episodes.Should().BeOfType<List<Episode>>();
|
|
|
|
|
episodes.Should().HaveCountGreaterThan(0);
|
|
|
|
|
}
|
2022-07-06 19:46:19 -05:00
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_SeasonOneEpisodes_Returns200StatusCodeWithEpisodes()
|
|
|
|
|
{
|
|
|
|
|
var seasonValue = 1;
|
2022-07-08 12:51:01 -05:00
|
|
|
|
2022-07-06 19:46:19 -05:00
|
|
|
var url = $"{_endpoint}?season={seasonValue}";
|
|
|
|
|
|
|
|
|
|
var response = await _client.GetAsync(url);
|
|
|
|
|
|
|
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
|
|
|
|
var episodes = JsonSerializer.Deserialize<List<Episode>>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
episodes.Should().NotBeNull();
|
|
|
|
|
episodes.Should().BeOfType<List<Episode>>();
|
|
|
|
|
episodes.Should().HaveCountGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
foreach (var episode in episodes)
|
|
|
|
|
{
|
|
|
|
|
episode.Season.Should().Be(seasonValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_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);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
details.Should().NotBeNull();
|
|
|
|
|
details.Should().BeOfType<ValidationProblemDetails>();
|
|
|
|
|
details.Errors.Should().NotBeNull();
|
|
|
|
|
}
|
2022-07-08 12:51:01 -05:00
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_EpisodesAfterJanuary2020_Returns200StatusCodeWithEpisodes()
|
|
|
|
|
{
|
|
|
|
|
var startDateValue = new DateTime(2020, 1, 1);
|
|
|
|
|
|
|
|
|
|
var url = $"{_endpoint}?startdate={startDateValue}";
|
|
|
|
|
|
|
|
|
|
var response = await _client.GetAsync(url);
|
|
|
|
|
|
|
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
|
|
|
|
var episodes = JsonSerializer.Deserialize<List<Episode>>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
episodes.Should().NotBeNull();
|
|
|
|
|
episodes.Should().BeOfType<List<Episode>>();
|
|
|
|
|
episodes.Should().HaveCountGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
foreach (var episode in episodes)
|
|
|
|
|
{
|
|
|
|
|
episode.AirDate.Should().BeOnOrAfter(startDateValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_InvalidStartDateQueryParam_Returns400StatusCodeWithValidationProblemDetails()
|
|
|
|
|
{
|
|
|
|
|
var startDateValue = "test";
|
|
|
|
|
|
|
|
|
|
var url = $"{_endpoint}?startdate={startDateValue}";
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
details.Should().NotBeNull();
|
|
|
|
|
details.Should().BeOfType<ValidationProblemDetails>();
|
|
|
|
|
details.Errors.Should().NotBeNull();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_EpisodesBeforeJanuary2020_Returns200StatusCodeWithEpisodes()
|
|
|
|
|
{
|
|
|
|
|
var endDateValue = new DateTime(2020, 1, 1);
|
|
|
|
|
|
|
|
|
|
var url = $"{_endpoint}?enddate={endDateValue}";
|
|
|
|
|
|
|
|
|
|
var response = await _client.GetAsync(url);
|
|
|
|
|
|
|
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
|
|
|
|
var episodes = JsonSerializer.Deserialize<List<Episode>>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
episodes.Should().NotBeNull();
|
|
|
|
|
episodes.Should().BeOfType<List<Episode>>();
|
|
|
|
|
episodes.Should().HaveCountGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
foreach (var episode in episodes)
|
|
|
|
|
{
|
|
|
|
|
episode.AirDate.Should().BeOnOrBefore(endDateValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_InvalidEndDateQueryParam_Returns400StatusCodeWithValidationProblemDetails()
|
|
|
|
|
{
|
|
|
|
|
var startDateValue = "test";
|
|
|
|
|
|
|
|
|
|
var url = $"{_endpoint}?startdate={startDateValue}";
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
details.Should().NotBeNull();
|
|
|
|
|
details.Should().BeOfType<ValidationProblemDetails>();
|
|
|
|
|
details.Errors.Should().NotBeNull();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetEpisodesAsync_EpisodeTitlesThatContainThe_Returns200StatusCodeWithEpisodes()
|
|
|
|
|
{
|
|
|
|
|
var titleValue = "the";
|
|
|
|
|
|
|
|
|
|
var url = $"{_endpoint}?title={titleValue}";
|
|
|
|
|
|
|
|
|
|
var response = await _client.GetAsync(url);
|
|
|
|
|
|
|
|
|
|
var data = await response.Content.ReadAsStreamAsync();
|
|
|
|
|
|
|
|
|
|
var episodes = JsonSerializer.Deserialize<List<Episode>>(data, _serializerOptions);
|
|
|
|
|
|
|
|
|
|
response.StatusCode.Should().Be(HttpStatusCode.OK);
|
|
|
|
|
AssertHelper.CheckForRateLimitingHeaders(response.Headers);
|
|
|
|
|
|
|
|
|
|
episodes.Should().NotBeNull();
|
|
|
|
|
episodes.Should().BeOfType<List<Episode>>();
|
|
|
|
|
episodes.Should().HaveCountGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
foreach (var episode in episodes)
|
|
|
|
|
{
|
|
|
|
|
episode.Title.ToLower().Should().Contain(titleValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-06 11:13:57 -05:00
|
|
|
}
|
|
|
|
|
}
|