using Schaad.Accounting.Repositories; using Shouldly; namespace Schaad.Accounting.Tests; public class RepositoryCacheTestShould { [Fact] public async Task CallLoaderOnceWhenKeyIsRequestedRepeatedly() { var cache = new RepositoryCache(); var loaderCalls = 0; var first = await cache.GetOrLoadAsync("key", () => { loaderCalls++; return Task.FromResult(new List { 1, 2 }); }); var second = await cache.GetOrLoadAsync("key", () => { loaderCalls++; return Task.FromResult(new List { 99 }); }); loaderCalls.ShouldBe(1); second.ShouldBeSameAs(first); second.ShouldBe(new[] { 1, 2 }); } [Fact] public async Task KeepEntriesSeparateWhenKeysDiffer() { var cache = new RepositoryCache(); var a = await cache.GetOrLoadAsync("a", () => Task.FromResult(new List { 1 })); var b = await cache.GetOrLoadAsync("b", () => Task.FromResult(new List { 2 })); b.ShouldNotBeSameAs(a); a.ShouldBe(new[] { 1 }); b.ShouldBe(new[] { 2 }); } [Fact] public async Task ReloadFromLoaderWhenKeyIsInvalidated() { var cache = new RepositoryCache(); var loaderCalls = 0; await cache.GetOrLoadAsync("k", () => { loaderCalls++; return Task.FromResult(new List { 1 }); }); cache.Invalidate("k"); await cache.GetOrLoadAsync("k", () => { loaderCalls++; return Task.FromResult(new List { 2 }); }); loaderCalls.ShouldBe(2); } [Fact] public async Task MatchKeysCaseInsensitivelyWhenLookingUp() { var cache = new RepositoryCache(); await cache.GetOrLoadAsync("Path/To/File.xml", () => Task.FromResult(new List { 1 })); var upper = await cache.GetOrLoadAsync("PATH/TO/FILE.XML", () => Task.FromResult(new List { 99 })); upper.ShouldBe(new[] { 1 }); } }