public async Task TakeSnapshot_sets_blob_properties_correctly_if_snapshot_blob_exists( Guid streamId, State state, IStateRehydrator <State> rehydrator) { // Arrange Mock.Get(rehydrator) .Setup(x => x.TryRehydrateState(streamId)) .ReturnsAsync(state); BlobSnapshotter <State> sut = GenerateSut(rehydrator); await sut.TakeSnapshot(streamId); ICloudBlob blob = await GetBlob(streamId); blob.Properties.ContentType = "application/text"; blob.Properties.ContentEncoding = Encoding.ASCII.WebName; await blob.SetPropertiesAsync(); // Act await sut.TakeSnapshot(streamId); // Assert ICloudBlob actual = await GetBlob(streamId); actual.Properties.ContentType.Should().Be("application/json"); actual.Properties.ContentEncoding.Should().BeEquivalentTo("UTF-8"); }
public async Task TakeSnapshot_updates_snapshot_blob_if_exists( Guid streamId, State pastState, State newState, IStateRehydrator <State> rehydrator) { // Arrange Mock.Get(rehydrator) .Setup(x => x.TryRehydrateState(streamId)) .ReturnsAsync(pastState); BlobSnapshotter <State> sut = GenerateSut(rehydrator); await sut.TakeSnapshot(streamId); Mock.Get(rehydrator) .Setup(x => x.TryRehydrateState(streamId)) .ReturnsAsync(newState); // Act await sut.TakeSnapshot(streamId); // Assert ICloudBlob blob = await GetBlob(streamId); string content = await DownloadContent(blob); State snapshot = JsonConvert.DeserializeObject <State>(content); snapshot.Should().BeEquivalentTo(newState); }
public async Task TryRestoreSnapshot_restores_snapshot_correctly_if_it_exists() { // Arrange BlobSnapshotReader <State> sut = GenerateSut(); var streamId = Guid.NewGuid(); State state = new Fixture().Create <State>(); IStateRehydrator <State> rehydrator = Mock.Of <IStateRehydrator <State> >(); Mock.Get(rehydrator) .Setup(x => x.TryRehydrateState(streamId)) .ReturnsAsync(state); var snapshotter = new BlobSnapshotter <State>( rehydrator, JsonProcessor, SnapshotContainer); await snapshotter.TakeSnapshot(streamId); // Act State actual = await sut.TryRestoreSnapshot(streamId); // Assert actual.Should().BeEquivalentTo(state); }
public async Task RehydrateState_fails_if_state_not_exists( IStateRehydrator <State1> rehydrator, Guid streamId) { Mock.Get(rehydrator).Setup(x => x.TryRehydrateState(streamId)).ReturnsAsync(default(State1)); Func <Task> action = () => rehydrator.RehydrateState(streamId); await action.Should().ThrowAsync <InvalidOperationException>(); }
public BlobSnapshotter(IStateRehydrator <T> rehydrator, IJsonProcessor jsonProcessor, CloudBlobContainer container) { _rehydrator = rehydrator; _jsonProcessor = jsonProcessor; _container = container; }
public async Task RehydrateState_returns_state_correctly( IStateRehydrator <State1> rehydrator, Guid streamId, State1 state) { Mock.Get(rehydrator).Setup(x => x.TryRehydrateState(streamId)).ReturnsAsync(state); State1 actual = await rehydrator.RehydrateState(streamId); actual.Should().BeSameAs(state); }
public static async Task <T> RehydrateState <T>( this IStateRehydrator <T> rehydrator, Guid streamId) where T : class { if (rehydrator is null) { throw new ArgumentNullException(nameof(rehydrator)); } return(await rehydrator.TryRehydrateState(streamId).ConfigureAwait(continueOnCapturedContext: false) switch { T state => state, _ => throw new InvalidOperationException($"Could not rehydrate state with stream id '{streamId}'.") });
public async Task TakeSnapshot_throws_exception_if_state_not_exists( Guid streamId, IStateRehydrator <State> rehydrator) { // Arrange Mock.Get(rehydrator) .Setup(x => x.TryRehydrateState(streamId)) .ReturnsAsync(default(State)); BlobSnapshotter <State> sut = GenerateSut(rehydrator); // Act Func <Task> action = () => sut.TakeSnapshot(streamId); // Assert await action.Should().ThrowAsync <InvalidOperationException>(); }
private static BlobSnapshotter <State> GenerateSut(IStateRehydrator <State> rehydrator) => new BlobSnapshotter <State>( rehydrator, jsonProcessor: new JsonProcessor(new JsonSerializer()), container: StorageEmulator.SnapshotContainer);