public IObservable <IThreadSafeTimeEntry> Execute()
 => dataSource.TimeEntries
 .GetAll(te => !te.IsDeleted)
 .Select(timeEntries => timeEntries.MaxBy(te => te.Start))
 .Select(newTimeEntry)
 .SelectMany(dataSource.TimeEntries.Create)
 .Do(_ => syncManager.InitiatePushSync())
 .Track(StartTimeEntryEvent.With(TimeEntryStartOrigin.ContinueMostRecent), analyticsService);
            public void ConvertNumberOfTagsToAString(int numberOfTags)
            {
                StartTimeEntryEvent startTimeEntryEvent = createTimeEntryEvent(numberOfTags: numberOfTags);

                var eventToDictionaryResult = startTimeEntryEvent.ToDictionary();

                eventToDictionaryResult[nameof(StartTimeEntryEvent.NumberOfTags)].Should().Be(numberOfTags.ToString());
            }
 public IObservable <IThreadSafeTimeEntry> Execute()
 => dataSource.User.Current
 .FirstAsync()
 .Select(userFromPrototype)
 .SelectMany(dataSource.TimeEntries.Create)
 .Do(notifyOfNewTimeEntryIfPossible)
 .Do(dataSource.SyncManager.InitiatePushSync)
 .Track(StartTimeEntryEvent.With(origin), analyticsService);
            public void ConvertsTheOriginToAString(TimeEntryStartOrigin origin)
            {
                StartTimeEntryEvent startTimeEntryEvent = createTimeEntryEvent(origin);

                var eventToDictionaryResult = startTimeEntryEvent.ToDictionary();

                eventToDictionaryResult[nameof(StartTimeEntryEvent.Origin)].Should().Be(origin.ToString());
            }
            public void SetsTheNumberTagsPropertyProperly(long[] tagIds)
            {
                TimeEntry.TagIds.Returns(tagIds.AsEnumerable());

                StartTimeEntryEvent startTimeEntryEvent = StartTimeEntryEvent.With(default(TimeEntryStartOrigin), TimeEntry);

                startTimeEntryEvent.NumberOfTags.Should().Be(tagIds.Length);
            }
            public void SetsTheIsRunningPropertyProperly(long?duration, bool isRunning)
            {
                TimeEntry.Duration.Returns(duration);

                StartTimeEntryEvent startTimeEntryEvent = StartTimeEntryEvent.With(default(TimeEntryStartOrigin), TimeEntry);

                startTimeEntryEvent.IsRunning.Should().Be(isRunning);
            }
            public void SetsTheIsBillablePropertyProperly(bool isBillable)
            {
                TimeEntry.Billable.Returns(isBillable);

                StartTimeEntryEvent startTimeEntryEvent = StartTimeEntryEvent.With(default(TimeEntryStartOrigin), TimeEntry);

                startTimeEntryEvent.IsBillable.Should().Be(isBillable);
            }
            public void SetsTheHasTaskPropertyProperly(long?projectId, bool hasTask)
            {
                TimeEntry.TaskId.Returns(projectId);

                StartTimeEntryEvent startTimeEntryEvent = StartTimeEntryEvent.With(default(TimeEntryStartOrigin), TimeEntry);

                startTimeEntryEvent.HasTask.Should().Be(hasTask);
            }
            public void SetsTheHasEmptyDescriptionPropertyProperly(string description, bool isEmptyDescription)
            {
                TimeEntry.Description.Returns(description);

                StartTimeEntryEvent startTimeEntryEvent = StartTimeEntryEvent.With(default(TimeEntryStartOrigin), TimeEntry);

                startTimeEntryEvent.HasEmptyDescription.Should().Be(isEmptyDescription);
            }
            public void ConvertsAllBooleansToStrings(bool value)
            {
                StartTimeEntryEvent startTimeEntryEvent = createTimeEntryEvent(valueForBooleans: value);

                var eventToDictionaryResult = startTimeEntryEvent.ToDictionary();

                eventToDictionaryResult[nameof(StartTimeEntryEvent.HasEmptyDescription)].Should().Be(value.ToString());
                eventToDictionaryResult[nameof(StartTimeEntryEvent.HasProject)].Should().Be(value.ToString());
                eventToDictionaryResult[nameof(StartTimeEntryEvent.HasTask)].Should().Be(value.ToString());
                eventToDictionaryResult[nameof(StartTimeEntryEvent.IsBillable)].Should().Be(value.ToString());
                eventToDictionaryResult[nameof(StartTimeEntryEvent.IsRunning)].Should().Be(value.ToString());
            }
            public void MapsTheSevenEventParameterKeys()
            {
                StartTimeEntryEvent startTimeEntryEvent = createTimeEntryEvent();

                var eventToDictionaryResult = startTimeEntryEvent.ToDictionary();

                eventToDictionaryResult.Keys.Count.Should().Be(7);
                eventToDictionaryResult.Keys.Should()
                .Contain(new[]
                {
                    nameof(StartTimeEntryEvent.Origin),
                    nameof(StartTimeEntryEvent.HasEmptyDescription),
                    nameof(StartTimeEntryEvent.HasProject),
                    nameof(StartTimeEntryEvent.HasTask),
                    nameof(StartTimeEntryEvent.IsBillable),
                    nameof(StartTimeEntryEvent.IsRunning),
                    nameof(StartTimeEntryEvent.NumberOfTags)
                });
            }
            public void SetsTheOriginPropertyProperly(TimeEntryStartOrigin origin)
            {
                StartTimeEntryEvent startTimeEntryEvent = StartTimeEntryEvent.With(origin, TimeEntry);

                startTimeEntryEvent.Origin.Should().Be(origin);
            }