Skip to content

Commit

Permalink
MediatR tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jchannon committed Jan 7, 2018
1 parent face3c4 commit 7c70fed
Show file tree
Hide file tree
Showing 7 changed files with 257 additions and 17 deletions.
18 changes: 18 additions & 0 deletions DDDScot.sln
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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}
Expand All @@ -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
223 changes: 223 additions & 0 deletions MediatRWebAPI.Tests/FilmControllerTests.cs
Original file line number Diff line number Diff line change
@@ -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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<ListFilmsMessage>.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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<ListFilmsByIdMessage>.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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<ListFilmsByIdMessage>.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<IMediator>();
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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<CreateFilmMessage>.Ignored)).Throws<InvalidOperationException>();

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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<CreateFilmMessage>.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<IMediator>();
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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<UpdateFilmMessage>.Ignored)).Throws<InvalidOperationException>();

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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<UpdateFilmMessage>.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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<DeleteFilmMessage>.Ignored)).Throws<InvalidOperationException>();

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<IMediator>();
A.CallTo(() => fakeMediatR.Send(A<DeleteFilmMessage>.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<IMediator>(fakeMediatR);

services.AddTransient<IValidator<Film>, FilmValidator>();

services.AddMvc().AddFluentValidation();
})
);

return server.CreateClient();
}
}
}
15 changes: 15 additions & 0 deletions MediatRWebAPI.Tests/MediatRWebAPI.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FakeItEasy" Version="4.3.0" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MediatRWebAPI\MediatRWebAPI.csproj" />
</ItemGroup>
</Project>
7 changes: 1 addition & 6 deletions TraditionalWebAPI/Services/CastMemberService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,9 @@ public CastMemberService(ICastMemberRepository castMemberRepository)
this.castMemberRepository = castMemberRepository;
}

public IEnumerable<CastMember> ListAllCastMembers()
{
throw new System.NotImplementedException();
}

public IEnumerable<CastMember> ListCastMembersByFilmId(int filmId)
{
return this.castMemberRepository.ListCastMembersByFilmId(filmId);
}
}
}
}
6 changes: 0 additions & 6 deletions TraditionalWebAPI/Services/DirectorService.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
namespace TraditionalWebAPI.Services
{
using System.Collections.Generic;
using Models;
using TraditionalWebAPI.Repositories;

Expand All @@ -13,11 +12,6 @@ public DirectorService(IDirectorRepository directorRepository)
this.directorRepository = directorRepository;
}

public IEnumerable<Director> ListAllDirectors()
{
return this.directorRepository.ListAllDirectors();
}

public Director ListDirectorById(int id)
{
return this.directorRepository.ListDirectorById(id);
Expand Down
2 changes: 0 additions & 2 deletions TraditionalWebAPI/Services/ICastMemberService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

public interface ICastMemberService
{
IEnumerable<CastMember> ListAllCastMembers();

IEnumerable<CastMember> ListCastMembersByFilmId(int filmId);

//Lots of other methods
Expand Down
3 changes: 0 additions & 3 deletions TraditionalWebAPI/Services/IDirectorService.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
namespace TraditionalWebAPI.Services
{
using System.Collections.Generic;
using Models;

public interface IDirectorService
{
IEnumerable<Director> ListAllDirectors();

Director ListDirectorById(int id);

//Lots of other methods
Expand Down

0 comments on commit 7c70fed

Please sign in to comment.