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 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 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 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>();
        }