From 7c70fedd1295218d3e80dd0bb75800d0723d3b56 Mon Sep 17 00:00:00 2001 From: Jonathan Channon Date: Sun, 7 Jan 2018 19:40:39 +0000 Subject: [PATCH] MediatR tests --- DDDScot.sln | 18 ++ MediatRWebAPI.Tests/FilmControllerTests.cs | 223 ++++++++++++++++++ .../MediatRWebAPI.Tests.csproj | 15 ++ .../Services/CastMemberService.cs | 7 +- TraditionalWebAPI/Services/DirectorService.cs | 6 - .../Services/ICastMemberService.cs | 2 - .../Services/IDirectorService.cs | 3 - 7 files changed, 257 insertions(+), 17 deletions(-) create mode 100644 MediatRWebAPI.Tests/FilmControllerTests.cs create mode 100644 MediatRWebAPI.Tests/MediatRWebAPI.Tests.csproj diff --git a/DDDScot.sln b/DDDScot.sln index 70e00a1..51bc8e0 100644 --- a/DDDScot.sln +++ b/DDDScot.sln @@ -27,6 +27,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1. Tradtional Project Tests EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TradtionalWebAPI.Tests", "TradtionalWebAPI.Tests\TradtionalWebAPI.Tests.csproj", "{2974A21D-76F8-4248-BF01-E7B5BDA6A6FF}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2. MediatR Project Tests", "2. MediatR Project Tests", "{694570A7-D60F-4058-A86F-B146204891B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediatRWebAPI.Tests", "MediatRWebAPI.Tests\MediatRWebAPI.Tests.csproj", "{E9EA372B-B08D-4C2E-B78A-948810D79F02}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -85,6 +89,18 @@ Global {2974A21D-76F8-4248-BF01-E7B5BDA6A6FF}.Release|x64.Build.0 = Release|Any CPU {2974A21D-76F8-4248-BF01-E7B5BDA6A6FF}.Release|x86.ActiveCfg = Release|Any CPU {2974A21D-76F8-4248-BF01-E7B5BDA6A6FF}.Release|x86.Build.0 = Release|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Release|Any CPU.Build.0 = Release|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Debug|x64.ActiveCfg = Debug|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Debug|x64.Build.0 = Debug|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Debug|x86.Build.0 = Debug|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Release|x64.ActiveCfg = Release|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Release|x64.Build.0 = Release|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Release|x86.ActiveCfg = Release|Any CPU + {E9EA372B-B08D-4C2E-B78A-948810D79F02}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {626AD192-F5D0-4AE1-AEEC-7B8FE40E927F} = {66D3DCED-78BD-4DB8-8C8D-3A5FA09543C6} @@ -97,5 +113,7 @@ Global {66D3DCED-78BD-4DB8-8C8D-3A5FA09543C6} = {E2EE7155-DAB9-4A7F-9D2E-2A38ECCCC566} {DD7F5385-6594-4AF5-ADE9-ABC65C2A29BC} = {44C1DD68-1371-456C-9541-BCC3CEE8A2BE} {2974A21D-76F8-4248-BF01-E7B5BDA6A6FF} = {DD7F5385-6594-4AF5-ADE9-ABC65C2A29BC} + {694570A7-D60F-4058-A86F-B146204891B7} = {44C1DD68-1371-456C-9541-BCC3CEE8A2BE} + {E9EA372B-B08D-4C2E-B78A-948810D79F02} = {694570A7-D60F-4058-A86F-B146204891B7} EndGlobalSection EndGlobal diff --git a/MediatRWebAPI.Tests/FilmControllerTests.cs b/MediatRWebAPI.Tests/FilmControllerTests.cs new file mode 100644 index 0000000..6482730 --- /dev/null +++ b/MediatRWebAPI.Tests/FilmControllerTests.cs @@ -0,0 +1,223 @@ +namespace MediatRWebAPI.Tests +{ + using System; + using System.Net.Http; + using System.Text; + using System.Threading.Tasks; + using FakeItEasy; + using FluentValidation; + using FluentValidation.AspNetCore; + using MediatR; + using MediatRWebAPI.Features.Films.CreateFilm; + using MediatRWebAPI.Features.Films.DeleteFilm; + using MediatRWebAPI.Features.Films.ListFilmById; + using MediatRWebAPI.Features.Films.ListFilms; + using MediatRWebAPI.Features.Films.UpdateFilm; + using Microsoft.AspNetCore; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Hosting; + using Microsoft.AspNetCore.TestHost; + using Microsoft.Extensions.DependencyInjection; + using Models; + using Newtonsoft.Json; + using Xunit; + + public class FilmControllerTests + { + [Fact] + public async Task Should_get_list_of_films() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Returns(new[] { new Film { Name = "Goodfellas" } }); + var client = this.GetClient(fakeMediatR); + + //When + var response = await client.GetAsync("/api/films"); + var contents = await response.Content.ReadAsStringAsync(); + + //Then + Assert.Contains("Goodfellas", contents, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public async Task Should_get_film_by_id() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Returns(new Film { Name = "Blade Runner" }); + var client = this.GetClient(fakeMediatR); + + //When + var response = await client.GetAsync("/api/films/1"); + var contents = await response.Content.ReadAsStringAsync(); + + //Then + Assert.Contains("Blade Runner", contents, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public async Task Should_return_404_when_no_film_found_via_get_film_by_id() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Returns(null); + + var client = this.GetClient(fakeMediatR); + + //When + var response = await client.GetAsync("/api/films/1"); + + //Then + Assert.Equal(404, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_400_on_invalid_data_when_creating_film() + { + //Given + var fakeMediatR = A.Fake(); + var client = this.GetClient(fakeMediatR); + var film = new Film { Name = "" }; + + //When + var response = await client.PostAsync("/api/films", new StringContent(JsonConvert.SerializeObject(film), Encoding.UTF8, "application/json")); + + //Then + Assert.Equal(400, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_403_on_invalid_user_when_creating_film() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Throws(); + + var client = this.GetClient(fakeMediatR); + + var film = new Film { Name = "Shrek" }; + + //When + var response = await client.PostAsync("/api/films", new StringContent(JsonConvert.SerializeObject(film), Encoding.UTF8, "application/json")); + + //Then + Assert.Equal(403, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_201_when_creating_film() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Returns(new Unit()); + var client = this.GetClient(fakeMediatR); + + var film = new Film { Name = "Shrek" }; + + //When + var response = await client.PostAsync("/api/films", new StringContent(JsonConvert.SerializeObject(film), Encoding.UTF8, "application/json")); + + //Then + Assert.Equal(201, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_400_on_invalid_data_when_updating_film() + { + //Given + var fakeMediatR = A.Fake(); + var client = this.GetClient(fakeMediatR); + var film = new Film { Name = "" }; + + //When + var response = await client.PutAsync("/api/films/1", new StringContent(JsonConvert.SerializeObject(film), Encoding.UTF8, "application/json")); + + //Then + Assert.Equal(400, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_403_on_invalid_user_when_updating_film() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Throws(); + + var client = this.GetClient(fakeMediatR); + + var film = new Film { Name = "Shrek" }; + + //When + var response = await client.PutAsync("/api/films/1", new StringContent(JsonConvert.SerializeObject(film), Encoding.UTF8, "application/json")); + + //Then + Assert.Equal(403, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_204_when_deleting_film() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Returns(new Unit()); + var client = this.GetClient(fakeMediatR); + + //When + var response = await client.DeleteAsync("/api/films/1"); + + //Then + Assert.Equal(204, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_403_on_invalid_user_when_deleting_film() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Throws(); + + var client = this.GetClient(fakeMediatR); + + //When + var response = await client.DeleteAsync("/api/films/1"); + + //Then + Assert.Equal(403, (int)response.StatusCode); + } + + [Fact] + public async Task Should_return_204_when_updating_film() + { + //Given + var fakeMediatR = A.Fake(); + A.CallTo(() => fakeMediatR.Send(A.Ignored)).Returns(new Unit()); + var client = this.GetClient(fakeMediatR); + + var film = new Film { Name = "Shrek" }; + + //When + var response = await client.PutAsync("/api/films/1", new StringContent(JsonConvert.SerializeObject(film), Encoding.UTF8, "application/json")); + + //Then + Assert.Equal(204, (int)response.StatusCode); + } + + private HttpClient GetClient(IMediator fakeMediatR) + { + var server = new TestServer(WebHost.CreateDefaultBuilder() + .Configure(app => { app.UseMvc(); }) + .ConfigureServices(services => + { + services.AddSingleton(fakeMediatR); + + services.AddTransient, FilmValidator>(); + + services.AddMvc().AddFluentValidation(); + }) + ); + + return server.CreateClient(); + } + } +} diff --git a/MediatRWebAPI.Tests/MediatRWebAPI.Tests.csproj b/MediatRWebAPI.Tests/MediatRWebAPI.Tests.csproj new file mode 100644 index 0000000..23fd7ca --- /dev/null +++ b/MediatRWebAPI.Tests/MediatRWebAPI.Tests.csproj @@ -0,0 +1,15 @@ + + + netcoreapp2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/TraditionalWebAPI/Services/CastMemberService.cs b/TraditionalWebAPI/Services/CastMemberService.cs index 3a46040..598be36 100644 --- a/TraditionalWebAPI/Services/CastMemberService.cs +++ b/TraditionalWebAPI/Services/CastMemberService.cs @@ -13,14 +13,9 @@ public CastMemberService(ICastMemberRepository castMemberRepository) this.castMemberRepository = castMemberRepository; } - public IEnumerable ListAllCastMembers() - { - throw new System.NotImplementedException(); - } - public IEnumerable ListCastMembersByFilmId(int filmId) { return this.castMemberRepository.ListCastMembersByFilmId(filmId); } } -} \ No newline at end of file +} diff --git a/TraditionalWebAPI/Services/DirectorService.cs b/TraditionalWebAPI/Services/DirectorService.cs index 594f9b7..84cff9d 100644 --- a/TraditionalWebAPI/Services/DirectorService.cs +++ b/TraditionalWebAPI/Services/DirectorService.cs @@ -1,6 +1,5 @@ namespace TraditionalWebAPI.Services { - using System.Collections.Generic; using Models; using TraditionalWebAPI.Repositories; @@ -13,11 +12,6 @@ public DirectorService(IDirectorRepository directorRepository) this.directorRepository = directorRepository; } - public IEnumerable ListAllDirectors() - { - return this.directorRepository.ListAllDirectors(); - } - public Director ListDirectorById(int id) { return this.directorRepository.ListDirectorById(id); diff --git a/TraditionalWebAPI/Services/ICastMemberService.cs b/TraditionalWebAPI/Services/ICastMemberService.cs index f62faf3..f66dc43 100644 --- a/TraditionalWebAPI/Services/ICastMemberService.cs +++ b/TraditionalWebAPI/Services/ICastMemberService.cs @@ -5,8 +5,6 @@ public interface ICastMemberService { - IEnumerable ListAllCastMembers(); - IEnumerable ListCastMembersByFilmId(int filmId); //Lots of other methods diff --git a/TraditionalWebAPI/Services/IDirectorService.cs b/TraditionalWebAPI/Services/IDirectorService.cs index 3b9d70b..19f9cd3 100644 --- a/TraditionalWebAPI/Services/IDirectorService.cs +++ b/TraditionalWebAPI/Services/IDirectorService.cs @@ -1,12 +1,9 @@ namespace TraditionalWebAPI.Services { - using System.Collections.Generic; using Models; public interface IDirectorService { - IEnumerable ListAllDirectors(); - Director ListDirectorById(int id); //Lots of other methods