public async ThreadingTask RemovesCurrentlyRunningTimeEntryWhenItIsDeleted()
            {
                DataSource.TimeEntries.Returns(TimeEntriesSource);
                var runningTimeEntriesHistory = new List <IThreadSafeTimeEntry>();
                var user = Substitute.For <IThreadSafeUser>();

                user.Id.Returns(10);
                DataSource.User.Current.Returns(Observable.Return(user));
                TimeEntriesSource.CurrentlyRunningTimeEntry
                .Subscribe(te => runningTimeEntriesHistory.Add(te));
                var prototype = new MockTimeEntryPrototype
                {
                    WorkspaceId = WorkspaceId,
                    StartTime   = Now,
                    Description = "Some description",
                    IsBillable  = true,
                    ProjectId   = ProjectId
                };

                prepareBatchUpdate();
                var timeEntry = Models.TimeEntry.From(await InteractorFactory.CreateTimeEntry(prototype).Execute());

                Repository.Update(Arg.Is(timeEntry.Id), Arg.Is(timeEntry)).Returns(Observable.Return(timeEntry));

                TimeEntriesSource.SoftDelete(timeEntry).Wait();

                runningTimeEntriesHistory.Should().HaveCount(3);
                runningTimeEntriesHistory[0].Should().Be(null); // originally there is no running time entry (in the repository)
                runningTimeEntriesHistory[1].Id.Should().Be(timeEntry.Id);
                runningTimeEntriesHistory[2].Should().Be(null);
            }
            public void EmitsSingleElementBeforeCompleting()
            {
                var observer = Substitute.For <IObserver <Unit> >();

                TimeEntriesSource.SoftDelete(TimeEntry).Subscribe(observer);

                observer.Received(1).OnNext(Arg.Any <Unit>());
                observer.Received(1).OnCompleted();
            }
            public void PropagatesErrorIfTimeEntryIsNotInRepository()
            {
                var otherTimeEntry = Substitute.For <IThreadSafeTimeEntry>();

                otherTimeEntry.Id.Returns(12);
                var observer = Substitute.For <IObserver <Unit> >();

                Repository.Update(Arg.Any <long>(), Arg.Any <IThreadSafeTimeEntry>())
                .Returns(Observable.Throw <IDatabaseTimeEntry>(new DatabaseOperationException <IDatabaseTimeEntry>(new Exception())));

                TimeEntriesSource.SoftDelete(otherTimeEntry).Subscribe(observer);

                observer.Received().OnError(Arg.Any <DatabaseOperationException <IDatabaseTimeEntry> >());
            }
            public void PropagatesErrorIfUpdateFails()
            {
                var timeEntry = Models.TimeEntry.Builder.Create(12)
                                .SetStart(Now)
                                .SetSyncStatus(SyncStatus.InSync)
                                .SetDescription("")
                                .SetUserId(11)
                                .SetWorkspaceId(10)
                                .SetAt(Now)
                                .Build();

                var timeEntryObservable = Observable.Return(timeEntry);
                var errorObservable     = Observable.Throw <IDatabaseTimeEntry>(new DatabaseOperationException <IDatabaseTimeEntry>(new Exception()));

                Repository.GetById(Arg.Is(timeEntry.Id)).Returns(timeEntryObservable);
                Repository.Update(Arg.Any <long>(), Arg.Any <IDatabaseTimeEntry>()).Returns(errorObservable);
                var observer = Substitute.For <IObserver <Unit> >();

                TimeEntriesSource.SoftDelete(timeEntry).Subscribe(observer);

                observer.Received().OnError(Arg.Any <DatabaseOperationException <IDatabaseTimeEntry> >());
            }
            public async ThreadingTask UpdatesTheCorrectTimeEntry()
            {
                await TimeEntriesSource.SoftDelete(TimeEntry).LastOrDefaultAsync();

                await Repository.Received().Update(Arg.Is(TimeEntry.Id), Arg.Is <IDatabaseTimeEntry>(te => te.Id == TimeEntry.Id));
            }
            public async ThreadingTask SetsTheSyncNeededStatus()
            {
                await TimeEntriesSource.SoftDelete(TimeEntry).LastOrDefaultAsync();

                await Repository.Received().Update(Arg.Is(TimeEntry.Id), Arg.Is <IDatabaseTimeEntry>(te => te.SyncStatus == SyncStatus.SyncNeeded));
            }
            public async ThreadingTask SetsTheDeletedFlag()
            {
                await TimeEntriesSource.SoftDelete(TimeEntry).LastOrDefaultAsync();

                await Repository.Received().Update(Arg.Is(TimeEntry.Id), Arg.Is <IDatabaseTimeEntry>(te => te.IsDeleted == true));
            }