From 10ba98cca05c1d2e9099ddf24481dfbd38f42599 Mon Sep 17 00:00:00 2001 From: Damian Hickey Date: Fri, 20 Feb 2026 20:35:29 +0100 Subject: [PATCH] Make CT required in IMessageStore, IConsentMessageStore, IAuthorizationParametersMessageStore, flow through implementations and tests --- .../Endpoints/AuthorizeEndpointBase.cs | 8 ++++---- .../Results/AuthorizeInteractionPageResult.cs | 2 +- .../Endpoints/Results/AuthorizeResult.cs | 2 +- .../Endpoints/Results/EndSessionResult.cs | 2 +- .../Extensions/HttpContextExtensions.cs | 2 +- .../DefaultIdentityServerInteractionService.cs | 8 ++++---- .../Services/Default/OidcReturnUrlParser.cs | 2 +- .../Stores/Default/ConsentMessageStore.cs | 6 +++--- ...ibutedCacheAuthorizationParametersMessageStore.cs | 12 ++++++------ .../Stores/Default/ProtectedDataMessageStore.cs | 4 ++-- ...QueryStringAuthorizationParametersMessageStore.cs | 6 +++--- .../Stores/IAuthorizationParametersMessageStore.cs | 9 ++++++--- .../IdentityServer/Stores/IConsentMessageStore.cs | 9 ++++++--- .../src/IdentityServer/Stores/IMessageStore.cs | 6 ++++-- .../Validation/Default/EndSessionRequestValidator.cs | 2 +- .../Common/MockConsentMessageStore.cs | 6 +++--- .../Common/MockMessageStore.cs | 4 ++-- .../Endpoints/Results/AuthorizeResultTests.cs | 3 ++- ...dCacheAuthorizationParametersMessageStoreTests.cs | 5 +++-- 19 files changed, 54 insertions(+), 44 deletions(-) diff --git a/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs b/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs index 55e7361a4..93347644e 100644 --- a/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs +++ b/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs @@ -77,10 +77,10 @@ internal abstract class AuthorizeEndpointBase : IEndpointHandler if (checkConsentResponse && _authorizationParametersMessageStore != null) { var messageStoreId = parameters[Constants.AuthorizationParamsStore.MessageStoreIdParameterName]; - var entry = await _authorizationParametersMessageStore.ReadAsync(messageStoreId); + var entry = await _authorizationParametersMessageStore.ReadAsync(messageStoreId, ct); parameters = entry?.Data.FromFullDictionary() ?? new NameValueCollection(); - await _authorizationParametersMessageStore.DeleteAsync(messageStoreId); + await _authorizationParametersMessageStore.DeleteAsync(messageStoreId, ct); } // validate request @@ -105,7 +105,7 @@ internal abstract class AuthorizeEndpointBase : IEndpointHandler { var consentRequest = new ConsentRequest(result.ValidatedRequest.Raw, user?.GetSubjectId()); consentRequestId = consentRequest.Id; - consent = await _consentResponseStore.ReadAsync(consentRequestId); + consent = await _consentResponseStore.ReadAsync(consentRequestId, ct); if (consent != null && consent.Data == null) { @@ -155,7 +155,7 @@ internal abstract class AuthorizeEndpointBase : IEndpointHandler { if (consentRequestId != null) { - await _consentResponseStore.DeleteAsync(consentRequestId); + await _consentResponseStore.DeleteAsync(consentRequestId, ct); } } } diff --git a/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeInteractionPageResult.cs b/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeInteractionPageResult.cs index 4b3757250..d3c4249cb 100644 --- a/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeInteractionPageResult.cs +++ b/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeInteractionPageResult.cs @@ -84,7 +84,7 @@ internal class AuthorizeInteractionPageHttpWriter : IHttpResponseWriter>(result.Request.ToOptimizedFullDictionary()); #pragma warning restore CS0618 // Type or member is obsolete - var id = await _authorizationParametersMessageStore.WriteAsync(msg); + var id = await _authorizationParametersMessageStore.WriteAsync(msg, context.RequestAborted); returnUrl = returnUrl.AddQueryString(Constants.AuthorizationParamsStore.MessageStoreIdParameterName, id); } else diff --git a/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeResult.cs b/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeResult.cs index 7e778bdee..67ccb7b9c 100644 --- a/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeResult.cs +++ b/identity-server/src/IdentityServer/Endpoints/Results/AuthorizeResult.cs @@ -227,7 +227,7 @@ public class AuthorizeHttpWriter : IHttpResponseWriter var errorModel = await CreateErrorMessage(response, context); var message = new Message(errorModel, _timeProvider.GetUtcNow().UtcDateTime); - var id = await _errorMessageStore.WriteAsync(message); + var id = await _errorMessageStore.WriteAsync(message, context.RequestAborted); var errorUrl = _options.UserInteraction.ErrorUrl; diff --git a/identity-server/src/IdentityServer/Endpoints/Results/EndSessionResult.cs b/identity-server/src/IdentityServer/Endpoints/Results/EndSessionResult.cs index 2a98f5132..404df80bd 100644 --- a/identity-server/src/IdentityServer/Endpoints/Results/EndSessionResult.cs +++ b/identity-server/src/IdentityServer/Endpoints/Results/EndSessionResult.cs @@ -66,7 +66,7 @@ internal class EndSessionHttpWriter : IHttpResponseWriter if (logoutMessage.ContainsPayload) { var msg = new Message(logoutMessage, _timeProvider.GetUtcNow().UtcDateTime); - id = await _logoutMessageStore.WriteAsync(msg); + id = await _logoutMessageStore.WriteAsync(msg, context.RequestAborted); } } diff --git a/identity-server/src/IdentityServer/Extensions/HttpContextExtensions.cs b/identity-server/src/IdentityServer/Extensions/HttpContextExtensions.cs index 644c4f4f1..b463cdd69 100644 --- a/identity-server/src/IdentityServer/Extensions/HttpContextExtensions.cs +++ b/identity-server/src/IdentityServer/Extensions/HttpContextExtensions.cs @@ -98,7 +98,7 @@ public static class HttpContextExtensions var msg = new Message(endSessionMsg, timeProvider.GetUtcNow().UtcDateTime); var endSessionMessageStore = context.RequestServices.GetRequiredService>(); - var id = await endSessionMessageStore.WriteAsync(msg); + var id = await endSessionMessageStore.WriteAsync(msg, context.RequestAborted); var urls = context.RequestServices.GetRequiredService(); var signoutIframeUrl = urls.BaseUrl.EnsureTrailingSlash() + ProtocolRoutePaths.EndSessionCallback; diff --git a/identity-server/src/IdentityServer/Services/Default/DefaultIdentityServerInteractionService.cs b/identity-server/src/IdentityServer/Services/Default/DefaultIdentityServerInteractionService.cs index 0dd496da6..07b594061 100644 --- a/identity-server/src/IdentityServer/Services/Default/DefaultIdentityServerInteractionService.cs +++ b/identity-server/src/IdentityServer/Services/Default/DefaultIdentityServerInteractionService.cs @@ -66,7 +66,7 @@ internal class DefaultIdentityServerInteractionService : IIdentityServerInteract { using var activity = Tracing.ServiceActivitySource.StartActivity("DefaultIdentityServerInteractionService.GetLogoutContext"); - var msg = await _logoutMessageStore.ReadAsync(logoutId); + var msg = await _logoutMessageStore.ReadAsync(logoutId, default); var iframeUrl = await _context.HttpContext.GetIdentityServerSignoutFrameCallbackUrlAsync(msg?.Data); return new LogoutRequest(iframeUrl, msg?.Data); } @@ -88,7 +88,7 @@ internal class DefaultIdentityServerInteractionService : IIdentityServerInteract SessionId = sid, ClientIds = clientIds }, _timeProvider.GetUtcNow().UtcDateTime); - var id = await _logoutMessageStore.WriteAsync(msg); + var id = await _logoutMessageStore.WriteAsync(msg, default); return id; } } @@ -102,7 +102,7 @@ internal class DefaultIdentityServerInteractionService : IIdentityServerInteract if (errorId != null) { - var result = await _errorMessageStore.ReadAsync(errorId); + var result = await _errorMessageStore.ReadAsync(errorId, default); var data = result?.Data; if (data != null) { @@ -136,7 +136,7 @@ internal class DefaultIdentityServerInteractionService : IIdentityServerInteract } var consentRequest = new ConsentRequest(request, subject); - await _consentMessageStore.WriteAsync(consentRequest.Id, new Message(consent, _timeProvider.GetUtcNow().UtcDateTime)); + await _consentMessageStore.WriteAsync(consentRequest.Id, new Message(consent, _timeProvider.GetUtcNow().UtcDateTime), default); } public Task DenyAuthorizationAsync(AuthorizationRequest request, AuthorizationError error, string errorDescription = null) diff --git a/identity-server/src/IdentityServer/Services/Default/OidcReturnUrlParser.cs b/identity-server/src/IdentityServer/Services/Default/OidcReturnUrlParser.cs index f888aeba3..3174b0c01 100644 --- a/identity-server/src/IdentityServer/Services/Default/OidcReturnUrlParser.cs +++ b/identity-server/src/IdentityServer/Services/Default/OidcReturnUrlParser.cs @@ -48,7 +48,7 @@ internal class OidcReturnUrlParser : IReturnUrlParser if (_authorizationParametersMessageStore != null) { var messageStoreId = parameters[Constants.AuthorizationParamsStore.MessageStoreIdParameterName]; - var entry = await _authorizationParametersMessageStore.ReadAsync(messageStoreId); + var entry = await _authorizationParametersMessageStore.ReadAsync(messageStoreId, default); parameters = entry?.Data.FromFullDictionary() ?? new NameValueCollection(); } diff --git a/identity-server/src/IdentityServer/Stores/Default/ConsentMessageStore.cs b/identity-server/src/IdentityServer/Stores/Default/ConsentMessageStore.cs index f8b840e6b..963908d00 100644 --- a/identity-server/src/IdentityServer/Stores/Default/ConsentMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/Default/ConsentMessageStore.cs @@ -12,7 +12,7 @@ internal class ConsentMessageStore : IConsentMessageStore public ConsentMessageStore(MessageCookie cookie) => Cookie = cookie; - public virtual Task DeleteAsync(string id) + public virtual Task DeleteAsync(string id, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("ConsentMessageStore.Delete"); @@ -20,14 +20,14 @@ internal class ConsentMessageStore : IConsentMessageStore return Task.CompletedTask; } - public virtual Task> ReadAsync(string id) + public virtual Task> ReadAsync(string id, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("ConsentMessageStore.Read"); return Task.FromResult(Cookie.Read(id)); } - public virtual Task WriteAsync(string id, Message message) + public virtual Task WriteAsync(string id, Message message, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("ConsentMessageStore.Write"); diff --git a/identity-server/src/IdentityServer/Stores/Default/DistributedCacheAuthorizationParametersMessageStore.cs b/identity-server/src/IdentityServer/Stores/Default/DistributedCacheAuthorizationParametersMessageStore.cs index ca90eaeef..7187d9841 100644 --- a/identity-server/src/IdentityServer/Stores/Default/DistributedCacheAuthorizationParametersMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/Default/DistributedCacheAuthorizationParametersMessageStore.cs @@ -31,7 +31,7 @@ public class DistributedCacheAuthorizationParametersMessageStore : IAuthorizatio private static string CacheKeyPrefix => "DistributedCacheAuthorizationParametersMessageStore"; /// - public virtual async Task WriteAsync(Message> message) + public virtual async Task WriteAsync(Message> message, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("DistributedCacheAuthorizationParametersMessageStore.Write"); @@ -49,18 +49,18 @@ public class DistributedCacheAuthorizationParametersMessageStore : IAuthorizatio var options = new DistributedCacheEntryOptions(); options.SetSlidingExpiration(Constants.DefaultCacheDuration); - await _distributedCache.SetStringAsync(cacheKey, json, options); + await _distributedCache.SetStringAsync(cacheKey, json, options, ct); return key; } /// - public virtual async Task>> ReadAsync(string id) + public virtual async Task>> ReadAsync(string id, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("DistributedCacheAuthorizationParametersMessageStore.Read"); var cacheKey = $"{CacheKeyPrefix}-{id}"; - var json = await _distributedCache.GetStringAsync(cacheKey); + var json = await _distributedCache.GetStringAsync(cacheKey, ct); if (json == null) { @@ -71,11 +71,11 @@ public class DistributedCacheAuthorizationParametersMessageStore : IAuthorizatio } /// - public virtual Task DeleteAsync(string id) + public virtual Task DeleteAsync(string id, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("DistributedCacheAuthorizationParametersMessageStore.Delete"); var cacheKey = $"{CacheKeyPrefix}-{id}"; - return _distributedCache.RemoveAsync(cacheKey); + return _distributedCache.RemoveAsync(cacheKey, ct); } } diff --git a/identity-server/src/IdentityServer/Stores/Default/ProtectedDataMessageStore.cs b/identity-server/src/IdentityServer/Stores/Default/ProtectedDataMessageStore.cs index 86e73b3b3..7c03f776e 100644 --- a/identity-server/src/IdentityServer/Stores/Default/ProtectedDataMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/Default/ProtectedDataMessageStore.cs @@ -40,7 +40,7 @@ public class ProtectedDataMessageStore : IMessageStore } /// - public virtual Task> ReadAsync(string value) + public virtual Task> ReadAsync(string value, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("ProtectedDataMessageStore.Read"); @@ -65,7 +65,7 @@ public class ProtectedDataMessageStore : IMessageStore } /// - public virtual Task WriteAsync(Message message) + public virtual Task WriteAsync(Message message, CT ct) { using var activity = Tracing.StoreActivitySource.StartActivity("ProtectedDataMessageStore.Write"); diff --git a/identity-server/src/IdentityServer/Stores/Default/QueryStringAuthorizationParametersMessageStore.cs b/identity-server/src/IdentityServer/Stores/Default/QueryStringAuthorizationParametersMessageStore.cs index 9178b759e..95205d446 100644 --- a/identity-server/src/IdentityServer/Stores/Default/QueryStringAuthorizationParametersMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/Default/QueryStringAuthorizationParametersMessageStore.cs @@ -10,18 +10,18 @@ namespace Duende.IdentityServer.Stores; // internal just for testing internal class QueryStringAuthorizationParametersMessageStore : IAuthorizationParametersMessageStore { - public Task WriteAsync(Message> message) + public Task WriteAsync(Message> message, CT ct) { var queryString = message.Data.FromFullDictionary().ToQueryString(); return Task.FromResult(queryString); } - public Task>> ReadAsync(string id) + public Task>> ReadAsync(string id, CT ct) { var values = id.ReadQueryStringAsNameValueCollection(); var msg = new Message>(values.ToFullDictionary()); return Task.FromResult(msg); } - public Task DeleteAsync(string id) => Task.CompletedTask; + public Task DeleteAsync(string id, CT ct) => Task.CompletedTask; } diff --git a/identity-server/src/IdentityServer/Stores/IAuthorizationParametersMessageStore.cs b/identity-server/src/IdentityServer/Stores/IAuthorizationParametersMessageStore.cs index 8147ccdc7..f5ed6213e 100644 --- a/identity-server/src/IdentityServer/Stores/IAuthorizationParametersMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/IAuthorizationParametersMessageStore.cs @@ -15,20 +15,23 @@ public interface IAuthorizationParametersMessageStore /// Writes the authorization parameters. /// /// The message. + /// The cancellation token. /// The identifier for the stored message. - Task WriteAsync(Message> message); + Task WriteAsync(Message> message, CT ct); /// /// Reads the authorization parameters. /// /// The identifier. + /// The cancellation token. /// - Task>> ReadAsync(string id); + Task>> ReadAsync(string id, CT ct); /// /// Deletes the authorization parameters. /// /// The identifier. + /// The cancellation token. /// - Task DeleteAsync(string id); + Task DeleteAsync(string id, CT ct); } diff --git a/identity-server/src/IdentityServer/Stores/IConsentMessageStore.cs b/identity-server/src/IdentityServer/Stores/IConsentMessageStore.cs index 56050967a..c9928371c 100644 --- a/identity-server/src/IdentityServer/Stores/IConsentMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/IConsentMessageStore.cs @@ -16,19 +16,22 @@ public interface IConsentMessageStore /// /// The id for the message. /// The message. - Task WriteAsync(string id, Message message); + /// The cancellation token. + Task WriteAsync(string id, Message message, CT ct); /// /// Reads the consent response message. /// /// The identifier. + /// The cancellation token. /// - Task> ReadAsync(string id); + Task> ReadAsync(string id, CT ct); /// /// Deletes the consent response message. /// /// The identifier. + /// The cancellation token. /// - Task DeleteAsync(string id); + Task DeleteAsync(string id, CT ct); } diff --git a/identity-server/src/IdentityServer/Stores/IMessageStore.cs b/identity-server/src/IdentityServer/Stores/IMessageStore.cs index bc93974f4..ccb6c14c7 100644 --- a/identity-server/src/IdentityServer/Stores/IMessageStore.cs +++ b/identity-server/src/IdentityServer/Stores/IMessageStore.cs @@ -16,13 +16,15 @@ public interface IMessageStore /// Writes the message. /// /// The message. + /// The cancellation token. /// An identifier for the message - Task WriteAsync(Message message); + Task WriteAsync(Message message, CT ct); /// /// Reads the message. /// /// The identifier. + /// The cancellation token. /// - Task> ReadAsync(string id); + Task> ReadAsync(string id, CT ct); } diff --git a/identity-server/src/IdentityServer/Validation/Default/EndSessionRequestValidator.cs b/identity-server/src/IdentityServer/Validation/Default/EndSessionRequestValidator.cs index 419e3b9e7..d9c67c56e 100644 --- a/identity-server/src/IdentityServer/Validation/Default/EndSessionRequestValidator.cs +++ b/identity-server/src/IdentityServer/Validation/Default/EndSessionRequestValidator.cs @@ -230,7 +230,7 @@ public class EndSessionRequestValidator : IEndSessionRequestValidator }; var endSessionId = parameters[Constants.UIConstants.DefaultRoutePathParams.EndSessionCallback]; - var endSessionMessage = await EndSessionMessageStore.ReadAsync(endSessionId); + var endSessionMessage = await EndSessionMessageStore.ReadAsync(endSessionId, ct); if (endSessionMessage?.Data?.ClientIds?.Any() == true) { result.IsError = false; diff --git a/identity-server/test/IdentityServer.UnitTests/Common/MockConsentMessageStore.cs b/identity-server/test/IdentityServer.UnitTests/Common/MockConsentMessageStore.cs index f0bf555e0..6735892a6 100644 --- a/identity-server/test/IdentityServer.UnitTests/Common/MockConsentMessageStore.cs +++ b/identity-server/test/IdentityServer.UnitTests/Common/MockConsentMessageStore.cs @@ -11,7 +11,7 @@ public class MockConsentMessageStore : IConsentMessageStore { public Dictionary> Messages { get; set; } = new Dictionary>(); - public Task DeleteAsync(string id) + public Task DeleteAsync(string id, CT ct) { if (id != null && Messages.ContainsKey(id)) { @@ -20,7 +20,7 @@ public class MockConsentMessageStore : IConsentMessageStore return Task.CompletedTask; } - public Task> ReadAsync(string id) + public Task> ReadAsync(string id, CT ct) { Message val = null; if (id != null) @@ -30,7 +30,7 @@ public class MockConsentMessageStore : IConsentMessageStore return Task.FromResult(val); } - public Task WriteAsync(string id, Message message) + public Task WriteAsync(string id, Message message, CT ct) { Messages[id] = message; return Task.CompletedTask; diff --git a/identity-server/test/IdentityServer.UnitTests/Common/MockMessageStore.cs b/identity-server/test/IdentityServer.UnitTests/Common/MockMessageStore.cs index 63fcc0367..9a3f5c1cd 100644 --- a/identity-server/test/IdentityServer.UnitTests/Common/MockMessageStore.cs +++ b/identity-server/test/IdentityServer.UnitTests/Common/MockMessageStore.cs @@ -11,7 +11,7 @@ public class MockMessageStore : IMessageStore { public Dictionary> Messages { get; set; } = new Dictionary>(); - public Task> ReadAsync(string id) + public Task> ReadAsync(string id, CT ct) { Message val = null; if (id != null) @@ -21,7 +21,7 @@ public class MockMessageStore : IMessageStore return Task.FromResult(val); } - public Task WriteAsync(Message message) + public Task WriteAsync(Message message, CT ct) { var id = Guid.NewGuid().ToString(); Messages[id] = message; diff --git a/identity-server/test/IdentityServer.UnitTests/Endpoints/Results/AuthorizeResultTests.cs b/identity-server/test/IdentityServer.UnitTests/Endpoints/Results/AuthorizeResultTests.cs index 3b0520d76..a3e1262fd 100644 --- a/identity-server/test/IdentityServer.UnitTests/Endpoints/Results/AuthorizeResultTests.cs +++ b/identity-server/test/IdentityServer.UnitTests/Endpoints/Results/AuthorizeResultTests.cs @@ -23,6 +23,7 @@ namespace UnitTests.Endpoints.Results; public class AuthorizeResultTests { private AuthorizeHttpWriter _subject; + private readonly CT _ct = TestContext.Current.CancellationToken; private AuthorizeResponse _response = new AuthorizeResponse(); private IdentityServerOptions _options = new IdentityServerOptions(); @@ -351,7 +352,7 @@ public class AuthorizeResultTests var queryString = new Uri(location).Query; var queryParams = QueryHelpers.ParseQuery(queryString); var errorId = queryParams.First(kvp => kvp.Key == _options.UserInteraction.ErrorIdParameter).Value; - var errorMessage = await _mockErrorMessageStore.ReadAsync(errorId); + var errorMessage = await _mockErrorMessageStore.ReadAsync(errorId, _ct); errorMessage.Data.RedirectUri.ShouldBeNull(); errorMessage.Data.ResponseMode.ShouldBeNull(); } diff --git a/identity-server/test/IdentityServer.UnitTests/Stores/Default/DistributedCacheAuthorizationParametersMessageStoreTests.cs b/identity-server/test/IdentityServer.UnitTests/Stores/Default/DistributedCacheAuthorizationParametersMessageStoreTests.cs index 8af0b232e..38c8ae2ed 100644 --- a/identity-server/test/IdentityServer.UnitTests/Stores/Default/DistributedCacheAuthorizationParametersMessageStoreTests.cs +++ b/identity-server/test/IdentityServer.UnitTests/Stores/Default/DistributedCacheAuthorizationParametersMessageStoreTests.cs @@ -13,6 +13,7 @@ public class DistributedCacheAuthorizationParametersMessageStoreTests { private MockDistributedCache _mockCache = new MockDistributedCache(); private DistributedCacheAuthorizationParametersMessageStore _subject; + private readonly CT _ct = TestContext.Current.CancellationToken; public DistributedCacheAuthorizationParametersMessageStoreTests() => _subject = new DistributedCacheAuthorizationParametersMessageStore(_mockCache, new DefaultHandleGenerationService()); [Fact] @@ -21,11 +22,11 @@ public class DistributedCacheAuthorizationParametersMessageStoreTests _mockCache.Items.Count.ShouldBe(0); var msg = new Message>(new Dictionary()); - var id = await _subject.WriteAsync(msg); + var id = await _subject.WriteAsync(msg, _ct); _mockCache.Items.Count.ShouldBe(1); - await _subject.DeleteAsync(id); + await _subject.DeleteAsync(id, _ct); _mockCache.Items.Count.ShouldBe(0); }