public void DeleteIfLatestWithCurrentData_Returns_IfConcurrentlyDeleted() { // Arrange IVersionMetadataMapper versionMapper = CreateMapper(); string id = "Id"; DateTimeOffset existingVersion = DateTimeOffset.Now; ConcurrentInnerStore innerStore = new ConcurrentInnerStore(id, new ConcurrentMetadataText("2", CreateMetadata(existingVersion, versionMapper, "ExistingKey", "ExistingValue"), "ExistingText")); innerStore.OnReadingMetadata += (calls) => { if (calls == 0) { Assert.True(innerStore.TryDelete(id, "2")); } }; IVersionedMetadataTextStore product = CreateProductUnderTest(innerStore, versionMapper); // Act bool isLatest = product.DeleteIfLatest(id, DateTimeOffset.MaxValue, "1", existingVersion); // Assert Assert.True(isLatest); ConcurrentMetadataText storedItem = innerStore.Read(id); Assert.Null(storedItem); }
public void DeleteIfLatestWithoutCurrentData_Deletes_IfOlderConcurrentlyExists() { // Arrange IVersionMetadataMapper versionMapper = CreateMapper(); string id = "Id"; ConcurrentInnerStore innerStore = new ConcurrentInnerStore(id, new ConcurrentMetadataText("1", CreateMetadata(DateTimeOffset.MinValue, versionMapper, "ExistingKey", "ExistingValue"), "ExistingText")); IDictionary<string, string> updatedMetadata = CreateMetadata(DateTimeOffset.Now, versionMapper, "UpdatedKey", "UpdatedValue"); string updatedText = "UpdatedText"; innerStore.OnReadingMetadata += (calls) => { if (calls == 0) { Assert.True(innerStore.TryUpdate(id, "1", updatedMetadata, updatedText)); } }; IVersionedMetadataTextStore product = CreateProductUnderTest(innerStore, versionMapper); // Act bool isLatest = product.DeleteIfLatest(id, DateTimeOffset.MaxValue); // Assert Assert.True(isLatest); ConcurrentMetadataText storedItem = innerStore.Read(id); Assert.Null(storedItem); }
public void CreateOrUpdateIfLatest_Updates_IfOlderConcurrentlyExists() { // Arrange IVersionMetadataMapper versionMapper = CreateMapper(); string id = "Id"; ConcurrentInnerStore innerStore = new ConcurrentInnerStore(id, new ConcurrentMetadataText("1", CreateMetadata(DateTimeOffset.Now, versionMapper, "ExistingKey", "ExistingValue"), "ExistingText")); IDictionary<string, string> updatedMetadata = CreateMetadata(DateTimeOffset.Now, versionMapper, "UpdatedKey", "UpdatedValue"); string updatedText = "UpdatedText"; innerStore.OnReadMetadata += (calls) => { if (calls == 0) { Assert.True(innerStore.TryUpdate(id, "1", updatedMetadata, updatedText)); } }; IVersionedMetadataTextStore product = CreateProductUnderTest(innerStore, versionMapper); DateTimeOffset newVersion = DateTimeOffset.MaxValue; IDictionary<string, string> newOtherMetadata = CreateMetadata("NewKey", "NewValue"); string newText = "NewText"; // Act bool isLatest = product.CreateOrUpdateIfLatest(id, newVersion, newOtherMetadata, newText); // Assert Assert.True(isLatest); ConcurrentMetadataText storedItem = innerStore.Read(id); IDictionary<string, string> expectedMetadata = CreateMetadata(newVersion, versionMapper, newOtherMetadata); ConcurrentMetadataText expectedItem = new ConcurrentMetadataText("3", expectedMetadata, newText); AssertEqual(expectedItem, storedItem); }