From 8453381fe09f5598489a249cb5eb21f3e192f26b Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sun, 29 Mar 2026 21:14:37 -0500 Subject: [PATCH] feat: implement delete async method on json storage provider --- .../Storage/JsonFileStorageProvider.cs | 32 +++++++++++++------ .../Storage/JsonFileStorageProviderTests.cs | 14 +++++++- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/StevanFreeborn.Extensions.Configuration.Secure/Storage/JsonFileStorageProvider.cs b/src/StevanFreeborn.Extensions.Configuration.Secure/Storage/JsonFileStorageProvider.cs index 8caf22a..9fcb45f 100644 --- a/src/StevanFreeborn.Extensions.Configuration.Secure/Storage/JsonFileStorageProvider.cs +++ b/src/StevanFreeborn.Extensions.Configuration.Secure/Storage/JsonFileStorageProvider.cs @@ -30,19 +30,17 @@ public sealed class JsonFileStorageProvider(JsonStorageOptions options) public async Task WriteAsync(string key, string encryptedData, CancellationToken ct = default) { - Directory.CreateDirectory(_options.DirectoryPath); - var data = await LoadAsync(ct); data[key] = encryptedData; + await SaveAsync(data, ct); + } - using var stream = new FileStream( - _options.FullPath, - FileMode.Create, - FileAccess.Write, - FileShare.None - ); - - await JsonSerializer.SerializeAsync(stream, data, JsonOptions, ct); + public async Task DeleteAsync(string key, CancellationToken ct = default) + { + var data = await LoadAsync(ct); + var result = data.Remove(key); + await SaveAsync(data, ct); + return result; } private async Task> LoadAsync(CancellationToken ct) @@ -63,4 +61,18 @@ public sealed class JsonFileStorageProvider(JsonStorageOptions options) return data ?? []; } + + private async Task SaveAsync(Dictionary data, CancellationToken ct) + { + Directory.CreateDirectory(_options.DirectoryPath); + + using var stream = new FileStream( + _options.FullPath, + FileMode.Create, + FileAccess.Write, + FileShare.None + ); + + await JsonSerializer.SerializeAsync(stream, data, JsonOptions, ct); + } } \ No newline at end of file diff --git a/tests/StevanFreeborn.Extensions.Configuration.Secure.Tests/Unit/Storage/JsonFileStorageProviderTests.cs b/tests/StevanFreeborn.Extensions.Configuration.Secure.Tests/Unit/Storage/JsonFileStorageProviderTests.cs index ed35f14..69eac9f 100644 --- a/tests/StevanFreeborn.Extensions.Configuration.Secure.Tests/Unit/Storage/JsonFileStorageProviderTests.cs +++ b/tests/StevanFreeborn.Extensions.Configuration.Secure.Tests/Unit/Storage/JsonFileStorageProviderTests.cs @@ -58,6 +58,18 @@ public class JsonFileStorageProviderTests : IDisposable }); } + [Fact] + public async Task DeleteAsync_WhenCalled_ItShouldRemoveKey() + { + await _sut.WriteAsync("KeyToDelete", "SomeValue"); + + var deleteResult = await _sut.DeleteAsync("KeyToDelete"); + var readResult = await _sut.ReadAsync("KeyToDelete"); + + deleteResult.Should().BeTrue(); + readResult.Should().BeEmpty(); + } + public void Dispose() { if (Directory.Exists(_tmpDirectory)) @@ -67,4 +79,4 @@ public class JsonFileStorageProviderTests : IDisposable GC.SuppressFinalize(this); } -} +} \ No newline at end of file