Skip to content

Commit 871f87d

Browse files
committed
Replace ISystemClock with TimeProvider
1 parent 5d8badf commit 871f87d

34 files changed

+181
-161
lines changed

src/Examples/DapperExample/Definitions/TodoItemDefinition.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ namespace DapperExample.Definitions;
1111
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
1212
public sealed class TodoItemDefinition : JsonApiResourceDefinition<TodoItem, long>
1313
{
14-
private readonly IClock _clock;
14+
private readonly TimeProvider _timeProvider;
1515

16-
public TodoItemDefinition(IResourceGraph resourceGraph, IClock clock)
16+
public TodoItemDefinition(IResourceGraph resourceGraph, TimeProvider timeProvider)
1717
: base(resourceGraph)
1818
{
19-
ArgumentNullException.ThrowIfNull(clock);
19+
ArgumentNullException.ThrowIfNull(timeProvider);
2020

21-
_clock = clock;
21+
_timeProvider = timeProvider;
2222
}
2323

2424
public override SortExpression OnApplySort(SortExpression? existingSort)
@@ -38,11 +38,11 @@ public override Task OnWritingAsync(TodoItem resource, WriteOperationKind writeO
3838
{
3939
if (writeOperation == WriteOperationKind.CreateResource)
4040
{
41-
resource.CreatedAt = _clock.UtcNow;
41+
resource.CreatedAt = _timeProvider.GetUtcNow();
4242
}
4343
else if (writeOperation == WriteOperationKind.UpdateResource)
4444
{
45-
resource.LastModifiedAt = _clock.UtcNow;
45+
resource.LastModifiedAt = _timeProvider.GetUtcNow();
4646
}
4747

4848
return Task.CompletedTask;

src/Examples/DapperExample/IClock.cs

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/Examples/DapperExample/Program.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@
1111
using JsonApiDotNetCore.Repositories;
1212
using Microsoft.EntityFrameworkCore;
1313
using Microsoft.EntityFrameworkCore.Diagnostics;
14-
using Microsoft.Extensions.DependencyInjection.Extensions;
1514

1615
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
1716

1817
// Add services to the container.
1918

20-
builder.Services.TryAddSingleton<IClock, SystemClock>();
19+
builder.Services.AddSingleton<TimeProvider>();
2120

2221
DatabaseProvider databaseProvider = GetDatabaseProvider(builder.Configuration);
2322
string? connectionString = builder.Configuration.GetConnectionString($"DapperExample{databaseProvider}");

src/Examples/DapperExample/SystemClock.cs

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/Examples/JsonApiDotNetCoreExample/Definitions/TodoItemDefinition.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace JsonApiDotNetCoreExample.Definitions;
1212
public sealed class TodoItemDefinition(IResourceGraph resourceGraph, TimeProvider timeProvider)
1313
: JsonApiResourceDefinition<TodoItem, long>(resourceGraph)
1414
{
15-
private readonly Func<DateTimeOffset> _getUtcNow = timeProvider.GetUtcNow;
15+
private readonly TimeProvider _timeProvider = timeProvider;
1616

1717
public override SortExpression OnApplySort(SortExpression? existingSort)
1818
{
@@ -31,11 +31,11 @@ public override Task OnWritingAsync(TodoItem resource, WriteOperationKind writeO
3131
{
3232
if (writeOperation == WriteOperationKind.CreateResource)
3333
{
34-
resource.CreatedAt = _getUtcNow();
34+
resource.CreatedAt = _timeProvider.GetUtcNow();
3535
}
3636
else if (writeOperation == WriteOperationKind.UpdateResource)
3737
{
38-
resource.LastModifiedAt = _getUtcNow();
38+
resource.LastModifiedAt = _timeProvider.GetUtcNow();
3939
}
4040

4141
return Task.CompletedTask;

test/DapperTests/IntegrationTests/DapperTestContext.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,17 @@
44
using DapperExample.Models;
55
using DapperExample.Repositories;
66
using DapperExample.TranslationToSql.DataModel;
7-
using FluentAssertions.Common;
8-
using FluentAssertions.Extensions;
97
using JetBrains.Annotations;
108
using JsonApiDotNetCore.Configuration;
119
using Microsoft.AspNetCore.Hosting;
1210
using Microsoft.AspNetCore.Mvc.Testing;
1311
using Microsoft.EntityFrameworkCore;
1412
using Microsoft.EntityFrameworkCore.Metadata;
1513
using Microsoft.Extensions.DependencyInjection;
14+
using Microsoft.Extensions.DependencyInjection.Extensions;
1615
using Microsoft.Extensions.Logging;
1716
using TestBuildingBlocks;
1817
using Xunit.Abstractions;
19-
using IClock = DapperExample.IClock;
2018

2119
namespace DapperTests.IntegrationTests;
2220

@@ -29,7 +27,7 @@ public sealed class DapperTestContext : IntegrationTest
2927
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL';
3028
""";
3129

32-
public static readonly DateTimeOffset FrozenTime = 29.September(2018).At(16, 41, 56).AsUtc().ToDateTimeOffset();
30+
public static readonly DateTimeOffset FrozenTime = DefaultDateTimeUtc;
3331

3432
private readonly Lazy<WebApplicationFactory<TodoItem>> _lazyFactory;
3533
private ITestOutputHelper? _testOutputHelper;
@@ -82,10 +80,7 @@ private WebApplicationFactory<TodoItem> CreateFactory()
8280

8381
builder.ConfigureServices(services =>
8482
{
85-
services.AddSingleton<IClock>(new FrozenClock
86-
{
87-
UtcNow = FrozenTime
88-
});
83+
services.Replace(ServiceDescriptor.Singleton<TimeProvider>(new FrozenTimeProvider(FrozenTime)));
8984

9085
ServiceDescriptor scopedCaptureStore = services.Single(descriptor => descriptor.ImplementationType == typeof(SqlCaptureStore));
9186
services.Remove(scopedCaptureStore);

test/DapperTests/IntegrationTests/FrozenClock.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ public AtomicCreateResourceTests(IntegrationTestContext<TestableStartup<Operatio
2626
testContext.UseController<MusicTracksController>();
2727
testContext.UseController<PlaylistsController>();
2828

29-
testContext.ConfigureServices(services => services.AddSingleton<ISystemClock, FrozenSystemClock>());
30-
3129
var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService<IJsonApiOptions>();
3230
options.AllowUnknownFieldsInRequestBody = false;
3331
}

test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public AtomicCreateResourceWithClientGeneratedIdTests(IntegrationTestContext<Tes
2828
services.AddResourceDefinition<AssignIdToTextLanguageDefinition>();
2929

3030
services.AddSingleton<ResourceDefinitionHitCounter>();
31-
services.AddSingleton<ISystemClock, FrozenSystemClock>();
3231
});
3332
}
3433

test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/DateMustBeInThePastAttribute.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Reflection;
33
using JsonApiDotNetCore.Resources;
44
using Microsoft.Extensions.DependencyInjection;
5-
using TestBuildingBlocks;
65

76
namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations;
87

@@ -20,9 +19,11 @@ internal sealed class DateMustBeInThePastAttribute : ValidationAttribute
2019
if (propertyInfo.PropertyType == typeof(DateTimeOffset) || propertyInfo.PropertyType == typeof(DateTimeOffset?))
2120
{
2221
var typedValue = (DateTimeOffset?)propertyInfo.GetValue(validationContext.ObjectInstance);
23-
var systemClock = validationContext.GetRequiredService<ISystemClock>();
2422

25-
if (typedValue >= systemClock.UtcNow)
23+
var timeProvider = validationContext.GetRequiredService<TimeProvider>();
24+
DateTimeOffset utcNow = timeProvider.GetUtcNow();
25+
26+
if (typedValue >= utcNow)
2627
{
2728
return new ValidationResult($"{validationContext.MemberName} must be in the past.");
2829
}

0 commit comments

Comments
 (0)