public async Task InitializesTheCurrentObservableWithTheStoredValueFromTheStorage()
            {
                var storage     = Substitute.For <ISingleObjectStorage <IDatabaseTestModel> >();
                var storedValue = new TestModel(456, SyncStatus.InSync);

                storage.Single().Returns(Observable.Return(storedValue));

                var dataSource = new TestSingletonSource(storage, null);
                var value      = await dataSource.Current.FirstAsync();

                value.Id.Should().Be(storedValue.Id);
            }
            public async Task InitializesTheCurrentObservableWithTheDefaultValueIfTheStorageDoesNotContainTheObject()
            {
                var storage      = Substitute.For <ISingleObjectStorage <IDatabaseTestModel> >();
                var defaultValue = new TestModel(123, SyncStatus.InSync);

                storage.Single().Returns(Observable.Throw <IDatabaseTestModel>(new Exception()));

                var dataSource = new TestSingletonSource(storage, defaultValue);
                var value      = await dataSource.Current.FirstAsync();

                value.Id.Should().Be(defaultValue.Id);
            }
            public async Task IgnoresTheDefaultValueWhenTheStorageContainsSomeValue()
            {
                var storage      = Substitute.For <ISingleObjectStorage <IDatabaseTestModel> >();
                var defaultValue = new TestModel(123, SyncStatus.InSync);
                var storedValue  = new TestModel(456, SyncStatus.InSync);

                storage.Single().Returns(Observable.Return(storedValue));

                var dataSource = new TestSingletonSource(storage, defaultValue);
                var value      = await dataSource.Current.FirstAsync();

                value.Id.Should().Be(storedValue.Id);
            }
            public async Task UpdatesTheCurrentObservableValueWhenTheStoredValueIsCreated()
            {
                var storage      = Substitute.For <ISingleObjectStorage <IDatabaseTestModel> >();
                var createdValue = new TestModel(123, SyncStatus.InSync);

                storage.Single().Returns(Observable.Throw <IDatabaseTestModel>(new Exception()));
                storage.BatchUpdate(null, null, null)
                .ReturnsForAnyArgs(Observable.Return(new[] { new CreateResult <IDatabaseTestModel>(createdValue) }));

                var dataSource = new TestSingletonSource(storage, null);
                await dataSource.UpdateWithConflictResolution(createdValue);

                var value = await dataSource.Current.FirstAsync();

                value.Id.Should().Be(createdValue.Id);
            }
            public async Task UpdatesTheCurrentObservableValue()
            {
                var storage      = Substitute.For <ISingleObjectStorage <IDatabaseTestModel> >();
                var updatedValue = new TestModel(123, SyncStatus.InSync);
                var storedValue  = new TestModel(456, SyncStatus.InSync);

                storage.Single().Returns(Observable.Return(storedValue));
                storage.Update(storedValue.Id, updatedValue).Returns(Observable.Return(updatedValue));

                var dataSource = new TestSingletonSource(storage, null);
                await dataSource.Overwrite(storedValue, updatedValue);

                var value = await dataSource.Current.FirstAsync();

                value.Id.Should().Be(updatedValue.Id);
            }
            public async Task UpdatesTheCurrentObservableValue()
            {
                var storage      = Substitute.For <ISingleObjectStorage <IDatabaseTestModel> >();
                var updatedValue = new TestModel(123, SyncStatus.InSync);
                var storedValue  = new TestModel(456, SyncStatus.InSync);

                storage.Single().Returns(Observable.Return(storedValue));
                storage.BatchUpdate(null, null, null)
                .ReturnsForAnyArgs(Observable.Return(new[] { new UpdateResult <IDatabaseTestModel>(storedValue.Id, updatedValue) }));

                var dataSource = new TestSingletonSource(storage, null);
                await dataSource.OverwriteIfOriginalDidNotChange(storedValue, updatedValue);

                var value = await dataSource.Current.FirstAsync();

                value.Id.Should().Be(updatedValue.Id);
            }