using Moq; using StackExchange.Redis; using StellaOps.TestKit; using Xunit; namespace StellaOps.ReachGraph.Cache.Tests; public sealed class ReachGraphValkeyCacheSetTests { [Fact] [Trait("Category", TestCategories.Unit)] public async Task SetAsyncStoresCompressedGraph() { var options = new ReachGraphCacheOptions { DefaultTtl = TimeSpan.FromMinutes(5) }; var harness = new ReachGraphValkeyCacheHarness("tenant-1", options); var graph = ReachGraphValkeyCacheTestData.CreateGraph("sha256:graph"); harness.Database .Setup(db => db.StringSetAsync( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(true); await harness.Cache.SetAsync("sha256:graph", graph, ttl: TimeSpan.FromMinutes(2)); var invocation = Assert.Single(harness.Database.Invocations, i => i.Method.Name == "StringSetAsync"); var key = (RedisKey)invocation.Arguments[0]!; var storedValue = (RedisValue)invocation.Arguments[1]!; var stored = (byte[]?)storedValue; var ttl = (Expiration)invocation.Arguments[2]!; var json = harness.Serializer.SerializeMinimal(graph); Assert.NotNull(stored); var decompressed = ReachGraphValkeyCacheTestData.Decompress(stored); Assert.Equal("reachgraph:tenant-1:sha256:graph", key.ToString()); Assert.Equal((Expiration)TimeSpan.FromMinutes(2), ttl); Assert.Equal(json, decompressed); } [Fact] [Trait("Category", TestCategories.Unit)] public async Task SetAsyncSkipsWhenGraphTooLarge() { var options = new ReachGraphCacheOptions { MaxGraphSizeBytes = 1 }; var harness = new ReachGraphValkeyCacheHarness("tenant-1", options); var graph = ReachGraphValkeyCacheTestData.CreateGraph("sha256:graph"); await harness.Cache.SetAsync("sha256:graph", graph); harness.Database.Verify( db => db.StringSetAsync( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } }