diff --git a/server.tests/Helpers/AssertHelper.cs b/server.tests/Helpers/AssertHelper.cs new file mode 100644 index 0000000..bfa085a --- /dev/null +++ b/server.tests/Helpers/AssertHelper.cs @@ -0,0 +1,15 @@ +using FluentAssertions; +using System.Net.Http.Headers; + +namespace server.tests.Helpers +{ + internal static class AssertHelper + { + public static void CheckForRateLimitingHeaders(HttpResponseHeaders headers) + { + headers.Should().ContainKey("X-Rate-Limit-Limit"); + headers.Should().ContainKey("X-Rate-Limit-Remaining"); + headers.Should().ContainKey("X-Rate-Limit-Reset"); + } + } +} diff --git a/server.tests/integrationTests/CharactersControllerIntegrationTests.cs b/server.tests/integrationTests/CharactersControllerIntegrationTests.cs index 54280d0..d9e5be4 100644 --- a/server.tests/integrationTests/CharactersControllerIntegrationTests.cs +++ b/server.tests/integrationTests/CharactersControllerIntegrationTests.cs @@ -5,8 +5,9 @@ using MongoDB.Bson; using server.Models; using System.Net; using System.Text.Json; +using server.tests.Helpers; -namespace server.tests.integrationTests +namespace server.tests.IntegrationTests { public class CharactersControllerIntegrationTests { @@ -40,9 +41,7 @@ namespace server.tests.integrationTests var characters = 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); characters.Should().NotBeNull(); characters.Should().BeOfType>(); @@ -63,9 +62,7 @@ namespace server.tests.integrationTests var characters = 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); characters.Should().NotBeNull(); characters.Should().BeOfType>(); @@ -91,12 +88,11 @@ namespace server.tests.integrationTests 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); details.Should().NotBeNull(); details.Should().BeOfType(); + details.Errors.Should().NotBeNull(); } [Fact] @@ -113,9 +109,7 @@ namespace server.tests.integrationTests var characters = 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); characters.Should().NotBeNull(); characters.Should().BeOfType>(); @@ -141,9 +135,7 @@ namespace server.tests.integrationTests var characters = 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); characters.Should().NotBeNull(); characters.Should().BeOfType>(); @@ -175,9 +167,7 @@ namespace server.tests.integrationTests 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); character.Should().NotBeNull(); character.Should().BeOfType(); @@ -198,9 +188,7 @@ namespace server.tests.integrationTests 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); details.Should().NotBeNull(); details.Should().BeOfType(); @@ -222,9 +210,7 @@ namespace server.tests.integrationTests 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); details.Should().NotBeNull(); details.Should().BeOfType(); diff --git a/server.tests/integrationTests/EpisodesControllerIntegrationTests.cs b/server.tests/integrationTests/EpisodesControllerIntegrationTests.cs index 71794d4..211ccc9 100644 --- a/server.tests/integrationTests/EpisodesControllerIntegrationTests.cs +++ b/server.tests/integrationTests/EpisodesControllerIntegrationTests.cs @@ -1,10 +1,12 @@ using FluentAssertions; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Testing; using server.Models; using System.Net; using System.Text.Json; +using server.tests.Helpers; -namespace server.tests.integrationTests +namespace server.tests.IntegrationTests { public class EpisodesControllerIntegrationTests { @@ -38,13 +40,58 @@ namespace server.tests.integrationTests var episodes = 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"); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); episodes.Should().NotBeNull(); episodes.Should().BeOfType>(); episodes.Should().HaveCountGreaterThan(0); } + + [Fact] + public async Task GetEpisodesAsync_SeasonOneEpisodes_Returns200StatusCodeWithEpisodes() + { + var seasonValue = 1; + + var url = $"{_endpoint}?season={seasonValue}"; + + var response = await _client.GetAsync(url); + + var data = await response.Content.ReadAsStreamAsync(); + + var episodes = JsonSerializer.Deserialize>(data, _serializerOptions); + + response.StatusCode.Should().Be(HttpStatusCode.OK); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); + + episodes.Should().NotBeNull(); + episodes.Should().BeOfType>(); + 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(data, _serializerOptions); + + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + AssertHelper.CheckForRateLimitingHeaders(response.Headers); + + details.Should().NotBeNull(); + details.Should().BeOfType(); + details.Errors.Should().NotBeNull(); + } } } diff --git a/server.tests/unitTests/CharacterControllerUnitTests.cs b/server.tests/unitTests/CharacterControllerUnitTests.cs index e59cbaf..2e35a68 100644 --- a/server.tests/unitTests/CharacterControllerUnitTests.cs +++ b/server.tests/unitTests/CharacterControllerUnitTests.cs @@ -6,7 +6,7 @@ using server.Models; using server.Persistence.Repositories; using System.Net; -namespace server.tests.unitTests +namespace server.tests.UnitTests { public class CharacterControllerUnitTests { diff --git a/server.tests/unitTests/EpisodesControllerUnitTests.cs b/server.tests/unitTests/EpisodesControllerUnitTests.cs index 1a8341d..4e8e165 100644 --- a/server.tests/unitTests/EpisodesControllerUnitTests.cs +++ b/server.tests/unitTests/EpisodesControllerUnitTests.cs @@ -6,7 +6,7 @@ using server.Models; using server.Persistence.Repositories; using System.Net; -namespace server.tests.unitTests +namespace server.tests.UnitTests { public class EpisodesControllerUnitTests {