Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
6 changes: 3 additions & 3 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup .NET 7
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
- name: Restore dependencies
Expand All @@ -28,6 +28,6 @@ jobs:
- name: Run unit tests and collect coverage
run: dotnet test --no-build --collect:"XPlat Code Coverage"
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
62 changes: 43 additions & 19 deletions Dotnet.AspNetCore.Samples.WebApi.Tests/PlayerServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ public async Task GivenRetrieveAsync_WhenInvoked_ThenShouldReturnAllPlayers()
// Arrange
var players = PlayerDataBuilder.SeedWithDeserializedJson();
var context = CreatePlayerContext();
var logger = new Mock<ILogger<PlayerService>>();
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var logger = CreateLoggerMock();
var memoryCache = CreateMemoryCacheMock(It.IsAny<object>());

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

// Act
var result = await service.RetrieveAsync();
Expand All @@ -84,11 +84,12 @@ public async Task GivenRetrieveAsync_WhenInvoked_ThenShouldReturnAllPlayers()
public async Task GivenRetrieveAsync_WhenInvokedTwice_ThenSecondExecutionTimeShouldBeLessThanFirst()
{
// Arrange
var players = PlayerDataBuilder.SeedWithDeserializedJson();
var context = CreatePlayerContext();
var logger = new Mock<ILogger<PlayerService>>();
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var logger = CreateLoggerMock();
var memoryCache = CreateMemoryCacheMock(players);

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

// Act
var first = await ExecutionTimeAsync(() => service.RetrieveAsync());
Expand All @@ -98,27 +99,17 @@ public async Task GivenRetrieveAsync_WhenInvokedTwice_ThenSecondExecutionTimeSho
second.Should().BeLessThan(first);
}

private async Task<long> ExecutionTimeAsync(Func<Task> awaitable)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
await awaitable();
stopwatch.Stop();

return stopwatch.ElapsedMilliseconds;
}

[Fact]
[Trait("Category", "Retrieve")]
public async Task GivenRetrieveByIdAsync_WhenInvokedWithPlayerId_ThenShouldReturnThePlayer()
{
// Arrange
var player = PlayerDataBuilder.SeedOneById(10);
var context = CreatePlayerContext();
var logger = new Mock<ILogger<PlayerService>>();
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var logger = CreateLoggerMock();
var memoryCache = CreateMemoryCacheMock(It.IsAny<object>());

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

// Act
var result = await service.RetrieveByIdAsync(10);
Expand All @@ -127,4 +118,37 @@ public async Task GivenRetrieveByIdAsync_WhenInvokedWithPlayerId_ThenShouldRetur
result.Should().BeOfType<Player>();
result.Should().BeEquivalentTo(player);
}

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

stopwatch.Start();
await awaitable();
stopwatch.Stop();

return stopwatch.ElapsedMilliseconds;
}

private static ILogger<PlayerService> CreateLoggerMock()
{
var mock = new Mock<ILogger<PlayerService>>();

return mock.Object;
}

private static IMemoryCache CreateMemoryCacheMock(object? value)
{
var mock = new Mock<IMemoryCache>();

mock
.Setup(x => x.TryGetValue(It.IsAny<object>(), out value))
.Returns(true);

mock
.Setup(x => x.CreateEntry(It.IsAny<object>()))
.Returns(Mock.Of<ICacheEntry>);

return mock.Object;
}
}