Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .codacy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ exclude_paths:
- "**/*Program.cs"
- "**/Data/**"
- "**/Enums/**"
- "**/Mappings/**"
- "**/Migrations/**"
- "**/Models/**"
- "**/Properties/**"
Expand Down
192 changes: 103 additions & 89 deletions Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerControllerTests.cs

Large diffs are not rendered by default.

186 changes: 136 additions & 50 deletions Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,20 @@

[Fact]
[Trait("Category", "Unit")]
public async Task GivenCreateAsync_WhenRepositoryAddAsync_ThenAddsPlayerToRepositoryAndRemovesMemoryCache()
public async Task GivenCreateAsync_WhenRepositoryAddAsync_ThenAddsPlayerToRepositoryAndRemovesCache()
{
// Arrange
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
await service.CreateAsync(It.IsAny<Player>());
await service.CreateAsync(It.IsAny<PlayerRequestModel>());

// Assert
repository.Verify(repository => repository.AddAsync(It.IsAny<Player>()), Times.Once);
Expand All @@ -46,12 +51,21 @@
public async Task GivenRetrieveAsync_WhenRepositoryGetAllAsyncReturnsPlayers_ThenCacheCreateEntryAndResultShouldBeListOfPlayers()
{
// Arrange
var players = PlayerFakes.CreateStarting11();
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
var players = PlayerFakes.GetStarting11();
var response = PlayerFakes.CreateStarting11ResponseModels();
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
mapper
.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(It.IsAny<List<Player>>()))
.Returns(response);
var value = It.IsAny<object>();

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
var result = await service.RetrieveAsync();
Expand All @@ -60,20 +74,33 @@
repository.Verify(repository => repository.GetAllAsync(), Times.Once);
memoryCache.Verify(cache => cache.TryGetValue(It.IsAny<object>(), out value), Times.Once);
memoryCache.Verify(cache => cache.CreateEntry(It.IsAny<object>()), Times.Once);
result.Should().BeEquivalentTo(players);
mapper.Verify(
mapper => mapper.Map<List<PlayerResponseModel>>(It.IsAny<List<Player>>()),
Times.Once
);
result.Should().BeEquivalentTo(response);
}

[Fact]
[Trait("Category", "Unit")]
public async Task GivenRetrieveAsync_WhenExecutedForTheSecondTime_ThenSecondExecutionTimeShouldBeLessThanFirst()
{
// Arrange
var players = PlayerFakes.CreateStarting11();
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks(cacheValue: players);
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository
.Setup(repository => repository.GetAllAsync())
.ReturnsAsync(PlayerFakes.GetStarting11());
mapper
.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(It.IsAny<List<Player>>()))
.Returns(PlayerFakes.CreateStarting11ResponseModels());
var value = It.IsAny<object>();

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
var first = await ExecutionTimeAsync(() => service.RetrieveAsync());
Expand All @@ -84,6 +111,10 @@
cache => cache.TryGetValue(It.IsAny<object>(), out value),
Times.Exactly(2) // first + second
);
mapper.Verify(
mapper => mapper.Map<List<PlayerResponseModel>>(It.IsAny<List<Player>>()),
Times.Once // first only
);
second.Should().BeLessThan(first);
}

Expand All @@ -92,111 +123,158 @@
public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsNull_TheResultShouldBeNull()
{
// Arrange
var id = 999;
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(id)).ReturnsAsync((Player?)null);
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
.ReturnsAsync((Player?)null);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
var result = await service.RetrieveByIdAsync(id);
var result = await service.RetrieveByIdAsync(It.IsAny<long>());

// Assert
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
result.Should().BeNull();
}

Check warning on line 144 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 15 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:160

[Fact]
[Trait("Category", "Unit")]
public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_TheResultShouldBePlayer()
{
// Arrange
var player = PlayerFakes.CreateOneByIdFromStarting11(9);
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(player.Id)).ReturnsAsync(player);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var id = 9;
var player = PlayerFakes.GetOneExistingById(id);
var response = PlayerFakes.CreateResponseModelForOneExistingById(id);
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
.ReturnsAsync(player);

Check warning on line 157 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 9 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:209
mapper
.Setup(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<Player>()))
.Returns(response);

var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
var result = await service.RetrieveByIdAsync(player.Id);
var result = await service.RetrieveByIdAsync(It.IsAny<long>());

Check warning on line 171 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 15 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:217
// Assert
result.Should().BeOfType<Player>();
result.Should().BeEquivalentTo(player);
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
mapper.Verify(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<Player>()), Times.Once);
result.Should().BeOfType<PlayerResponseModel>();

Check warning on line 175 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 15 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:129
result.Should().BeEquivalentTo(response);
}

[Fact]
[Trait("Category", "Unit")]
public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumberAsyncReturnsNull_ThenResultShouldBeNull()
{
// Arrange
var squadNumber = 999;
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();

Check warning on line 184 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 11 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:235
repository
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
.Setup(repository => repository.FindBySquadNumberAsync(It.IsAny<int>()))
.ReturnsAsync((Player?)null);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
var result = await service.RetrieveBySquadNumberAsync(squadNumber);
var result = await service.RetrieveBySquadNumberAsync(It.IsAny<int>());

// Assert
repository.Verify(
repository => repository.FindBySquadNumberAsync(It.IsAny<int>()),
Times.Once
);
result.Should().BeNull();
}

Check warning on line 205 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 18 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:221

[Fact]
[Trait("Category", "Unit")]
public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumberAsyncReturnsPlayer_ThenResultShouldBePlayer()
{
// Arrange
var player = PlayerFakes.CreateOneByIdFromStarting11(9);
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
var id = 9;
var player = PlayerFakes.GetOneExistingById(id);
var response = PlayerFakes.CreateResponseModelForOneExistingById(id);
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository
.Setup(repository => repository.FindBySquadNumberAsync(player.SquadNumber))
.Setup(repository => repository.FindBySquadNumberAsync(It.IsAny<int>()))
.ReturnsAsync(player);

Check warning on line 218 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 9 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:148

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
mapper
.Setup(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<Player>()))
.Returns(response);

var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
var result = await service.RetrieveBySquadNumberAsync(player.SquadNumber);
var result = await service.RetrieveBySquadNumberAsync(It.IsAny<int>());

Check warning on line 232 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 15 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:156
// Assert
repository.Verify(
repository => repository.FindBySquadNumberAsync(It.IsAny<int>()),
Times.Once
);
result.Should().BeOfType<Player>();
result.Should().BeEquivalentTo(player);
mapper.Verify(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<Player>()), Times.Once);
result.Should().BeOfType<PlayerResponseModel>();

Check warning on line 239 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 18 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:187
result.Should().BeEquivalentTo(response);
}

/* -------------------------------------------------------------------------
* Update
* ---------------------------------------------------------------------- */

Check warning on line 246 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 11 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:173
[Fact]
[Trait("Category", "Unit")]
public async Task GivenUpdateAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_ThenRepositoryUpdateAsyncAndCacheRemove()
{
// Arrange
var player = PlayerFakes.CreateOneByIdFromStarting11(9);
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(player.Id)).ReturnsAsync(player);
var id = 9;
var player = PlayerFakes.GetOneExistingById(id);
var request = PlayerFakes.CreateRequestModelForOneExistingById(id);
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
.ReturnsAsync(player);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
await service.UpdateAsync(player);
await service.UpdateAsync(request);

Check warning on line 269 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 15 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:290
// Assert
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
repository.Verify(repository => repository.UpdateAsync(player), Times.Once);
repository.Verify(repository => repository.UpdateAsync(It.IsAny<Player>()), Times.Once);
memoryCache.Verify(cache => cache.Remove(It.IsAny<object>()), Times.Once);
mapper.Verify(
mapper => mapper.Map(It.IsAny<PlayerRequestModel>(), It.IsAny<Player>()),
Times.Once
);
}

/* -------------------------------------------------------------------------
Expand All @@ -208,22 +286,30 @@
public async Task GivenDeleteAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_ThenRepositoryDeleteAsyncAndCacheRemove()
{
// Arrange
var player = PlayerFakes.CreateOneNew();
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(player.Id)).ReturnsAsync(player);
var id = 9;
var player = PlayerFakes.GetOneExistingById(id);
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
repository
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
.ReturnsAsync(player);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);
var service = new PlayerService(
repository.Object,
logger.Object,
memoryCache.Object,
mapper.Object
);

// Act
await service.DeleteAsync(player.Id);
await service.DeleteAsync(It.IsAny<long>());

Check warning on line 305 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 15 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:254
// Assert
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
repository.Verify(repository => repository.RemoveAsync(It.IsAny<long>()), Times.Once);
memoryCache.Verify(cache => cache.Remove(It.IsAny<object>()), Times.Exactly(1));
}

private async Task<long> ExecutionTimeAsync(Func<Task> awaitable)
private static async Task<long> ExecutionTimeAsync(Func<Task> awaitable)
{
var stopwatch = new Stopwatch();

Expand All @@ -231,21 +317,21 @@
await awaitable();
stopwatch.Stop();

return stopwatch.ElapsedMilliseconds;
}

protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", null);
_disposed = true;
}
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ CREATE TABLE players (

public static void Seed(this PlayerDbContext context)
{
context.Players.AddRange(PlayerFakes.CreateStarting11());
context.Players.AddRange(PlayerFakes.GetStarting11());
context.SaveChanges();
}
}
Expand Down
Loading
Loading