public async Task ClosesTheViewModelAndReturnsSelectedCalendarIds()
            {
                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                false));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));

                await ViewModel.Initialize();

                var selectedIds = new[] { "0", "2", "4", "7" };

                var calendars = userCalendars
                                .Where(calendar => selectedIds.Contains(calendar.Id))
                                .Select(calendar => new SelectableUserCalendarViewModel(calendar, false));

                ViewModel.SelectCalendar.ExecuteSequentally(calendars)
                .PrependAction(ViewModel.Done)
                .Subscribe();

                TestScheduler.Start();

                await NavigationService.Received().Close(ViewModel, Arg.Is <string[]>(ids => ids.SequenceEqual(selectedIds)));
            }
            public async Task MarksTheCalendarAsNotSelectedIfItIsSelected()
            {
                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                true));
                var userCalendarsObservable = Observable.Return(userCalendars);

                InteractorFactory.GetUserCalendars().Execute().Returns(userCalendarsObservable);
                await ViewModel.Initialize();

                var viewModelCalendars = await ViewModel.Calendars.FirstAsync();

                var calendarToBeSelected = viewModelCalendars.First().Items.First();

                ViewModel.SelectCalendar.Execute(calendarToBeSelected); //Select the calendar
                TestScheduler.Start();
                ViewModel.SelectCalendar.Execute(calendarToBeSelected); //Deselect the calendar
                TestScheduler.Start();

                calendarToBeSelected.Selected.Should().BeFalse();
            }
            public async Task ClosesTheViewModelAndReturnsTheInitialCalendarIds()
            {
                var initialSelectedIds = new List <string> {
                    "0", "1", "2", "3"
                };

                UserPreferences.EnabledCalendarIds().Returns(initialSelectedIds);

                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                false));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));
                await ViewModel.Initialize(false);

                var selectedIds = new[] { "0", "2", "4", "7" };

                var calendars = userCalendars
                                .Where(calendar => selectedIds.Contains(calendar.Id))
                                .Select(calendar => new SelectableUserCalendarViewModel(calendar, false));

                ViewModel.SelectCalendar.ExecuteSequentally(calendars).Subscribe();
                ViewModel.CloseWithDefaultResult();

                TestScheduler.Start();

                (await ViewModel.Result).Should().BeSequenceEquivalentTo(initialSelectedIds);
            }
            public async Task ReturnsSuggestionsFromUserSelectedCalendars()
            {
                var now = new DateTimeOffset(2020, 1, 2, 3, 4, 5, TimeSpan.Zero);

                TimeService.CurrentDateTime.Returns(now);
                var tenMinutes = TimeSpan.FromMinutes(10);
                var events     = Enumerable.Range(1, 5)
                                 .Select(id => new CalendarItem(
                                             id.ToString(),
                                             CalendarItemSource.Calendar,
                                             now - tenMinutes * id,
                                             tenMinutes,
                                             id.ToString(),
                                             CalendarIconKind.None,
                                             calendarId: id.ToString()));

                var userCalendars = Enumerable.Range(2, 3)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                id.ToString(),
                                                "",
                                                true));

                CalendarService
                .GetEventsInRange(Arg.Any <DateTimeOffset>(), Arg.Any <DateTimeOffset>())
                .Returns(Observable.Return(events));
                InteractorFactory.GetUserCalendars().Execute().Returns(Observable.Return(userCalendars));

                var suggestions = await Provider.GetSuggestions().ToList();

                await CalendarService.Received().GetEventsInRange(now.AddHours(-1), now.AddHours(1));

                suggestions.Should().HaveCount(1)
                .And.OnlyContain(suggestion => events.Any(@event => userCalendars.Select(c => c.Id).Contains(@event.CalendarId)));
            }
            protected override void AdditionalSetup()
            {
                OnboardingStorage
                .CompletedCalendarOnboarding()
                .Returns(true);

                PermissionsService
                .CalendarPermissionGranted
                .Returns(Observable.Return(true));

                NavigationService
                .Navigate <SelectUserCalendarsViewModel, bool, string[]>(Arg.Any <bool>())
                .Returns(new string[0]);

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(new UserCalendar().Yield()));

                DialogService
                .Alert(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <string>())
                .Returns(Observable.Return(Unit.Default));

                TestScheduler.AdvanceBy(1);
            }
            public async Task TracksNumberOfLinkedCalendarsChanged()
            {
                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                false));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));

                await ViewModel.Initialize(false);

                var selectedIds = new[] { "0", "2", "4", "7" };

                var calendars = userCalendars
                                .Where(calendar => selectedIds.Contains(calendar.Id))
                                .Select(calendar => new SelectableUserCalendarViewModel(calendar, false));

                ViewModel.SelectCalendar.ExecuteSequentally(calendars)
                .PrependAction(ViewModel.Save)
                .Subscribe();

                TestScheduler.Start();

                AnalyticsService.NumberOfLinkedCalendarsChanged.Received().Track(4);
                AnalyticsService.NumberOfLinkedCalendarsNewUser.DidNotReceiveWithAnyArgs().Track(4);
            }
Example #7
0
            public void SetsProperCalendarsAsSelected(
                NonEmptySet <NonEmptyString> strings0,
                NonEmptySet <NonEmptyString> strings1)
            {
                var enabledCalendarIds   = strings0.Get.Select(str => str.Get).ToList();
                var unenabledCalendarIds = strings1.Get.Select(str => str.Get).ToList();
                var allCalendarIds       = enabledCalendarIds.Concat(unenabledCalendarIds).ToList();

                UserPreferences.EnabledCalendarIds().Returns(enabledCalendarIds);
                var userCalendars = allCalendarIds
                                    .Select(id => new UserCalendar(
                                                id,
                                                "Does not matter",
                                                "Does not matter, pt.2"
                                                ));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));
                var viewModel = CreateViewModel();

                viewModel.Initialize().Wait();

                foreach (var calendarGroup in viewModel.Calendars)
                {
                    foreach (var calendar in calendarGroup)
                    {
                        if (enabledCalendarIds.Contains(calendar.Id))
                        {
                            calendar.Selected.Should().BeTrue();
                        }
                    }
                }
            }
            public async Task ShowsADialogWhenThereAreNoCalendars()
            {
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[0])
                    );

                await ViewModel.SelectCalendars.Execute(Unit.Default);

                await NavigationService.DidNotReceive().Navigate <SelectUserCalendarsViewModel, string[]>();
            }
            public async Task DoesNotNavigateToTheSelectUserCalendarsViewModelWhenThereAreNoCalendars()
            {
                PermissionsService.RequestCalendarAuthorization().Returns(Observable.Return(true));
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[0])
                    );

                await ViewModel.GetStartedAction.Execute(Unit.Default);

                await NavigationService.DidNotReceive().Navigate <SelectUserCalendarsViewModel, string[]>();
            }
Example #10
0
            public async Task HandlesNotAuthorizedException()
            {
                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Throw <IEnumerable <UserCalendar> >(new NotAuthorizedException("")));

                await ViewModel.Initialize();

                ViewModel.Calendars.Should().HaveCount(0);
            }
            public async Task DoesNotNavigateToTheSelectUserCalendarsViewModelWhenThereAreNoCalendars()
            {
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[0])
                    );

                await ViewModel.SelectCalendars.Execute(Unit.Default);

                await DialogService
                .Received()
                .Alert(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <string>());
            }
Example #12
0
            public async Task DoesNotNavigateToTheSelectUserCalendarsViewModelWhenThereAreNoCalendars()
            {
                View.RequestCalendarAuthorization().Returns(Observable.Return(true));
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[0])
                    );

                Action.Execute();
                TestScheduler.Start();

                await NavigationService.DidNotReceive().Navigate <SelectUserCalendarsViewModel, bool, string[]>(Arg.Any <bool>(), ViewModel.View);
            }
Example #13
0
            public async Task ShowsADialogWhenThereAreNoCalendars()
            {
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[0])
                    );

                ViewModel.SelectCalendars.Execute();
                TestScheduler.Start();

                await NavigationService.DidNotReceive()
                .Navigate <SelectUserCalendarsViewModel, bool, string[]>(Arg.Any <bool>(), ViewModel.View);
            }
Example #14
0
            public async Task DoesNotNavigateToTheSelectUserCalendarsViewModelWhenThereAreNoCalendars()
            {
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[0])
                    );

                ViewModel.SelectCalendars.Execute();
                TestScheduler.Start();

                await View.Received()
                .Alert(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <string>());
            }
            public async Task NavigatesToTheSelectUserCalendarsViewModelWhenThereAreCalendars()
            {
                PermissionsService.RequestCalendarAuthorization().Returns(Observable.Return(true));
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[] { new UserCalendar() })
                    );

                await ViewModel.GetStartedAction.Execute(Unit.Default);

                await NavigationService
                .Received()
                .Navigate <SelectUserCalendarsViewModel, bool, string[]>(Arg.Any <bool>());
            }
        public override async Task Initialize()
        {
            await base.Initialize();

            SelectedCalendarIds.AddRange(userPreferences.EnabledCalendarIds());

            await InteractorFactory
            .GetUserCalendars()
            .Execute()
            .Catch((NotAuthorizedException _) => Observable.Return(new List <UserCalendar>()))
            .Select(calendars => calendars.Select(toSelectable))
            .Do(calendars => calendars.ForEach(calendar => Calendars.InsertItem(calendar)));
        }
            public async Task ReturnsSuggestionsSortedByABSOffsetFromNow()
            {
                var now = new DateTimeOffset(2020, 1, 2, 3, 4, 5, TimeSpan.Zero);

                TimeService.CurrentDateTime.Returns(now);
                var tenMinutes = TimeSpan.FromMinutes(10);
                var events     = Enumerable.Range(1, 5)
                                 .Select(id => new CalendarItem(
                                             id.ToString(),
                                             CalendarItemSource.Calendar,
                                             id % 2 == 0 ? now - tenMinutes * id : now + tenMinutes * id,
                                             tenMinutes,
                                             id.ToString(),
                                             CalendarIconKind.None));

                var expectedSuggestionIds = new List <string>
                {
                    "1",
                    "2",
                    "3",
                    "4",
                    "5"
                };

                var userCalendar = new UserCalendar(
                    "",
                    "",
                    "",
                    true);

                CalendarService
                .GetEventsInRange(Arg.Any <DateTimeOffset>(), Arg.Any <DateTimeOffset>())
                .Returns(Observable.Return(events));

                InteractorFactory.GetUserCalendars().Execute()
                .Returns(Observable.Return(new List <UserCalendar> {
                    userCalendar
                }));

                var suggestions = await Provider.GetSuggestions().ToList();

                await CalendarService.Received().GetEventsInRange(now.AddHours(-1), now.AddHours(1));

                suggestions.Should().HaveCount(1)
                .And.OnlyContain(suggestion => expectedSuggestionIds.Any(expectedId => expectedId == suggestion.Description));
            }
            public async Task DeselectsAllCalendarAfterDisablingIntegration()
            {
                var initialSelectedIds = new List <string> {
                    "0"
                };

                UserPreferences.EnabledCalendarIds().Returns(initialSelectedIds);
                PermissionsChecker.CalendarPermissionGranted.Returns(Observable.Return(true));

                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                false));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));

                await ViewModel.Initialize(false);

                var selectedIds = new[] { "2", "4", "7" };

                var calendars = userCalendars
                                .Where(calendar => selectedIds.Contains(calendar.Id))
                                .Select(calendar => new SelectableUserCalendarViewModel(calendar, false));

                ViewModel.SelectCalendar.ExecuteSequentally(calendars)
                .PrependAction(ViewModel.TogglCalendarIntegration)
                .PrependAction(ViewModel.Save)
                .Subscribe();

                TestScheduler.Start();

                Received.InOrder(() =>
                {
                    UserPreferences.SetEnabledCalendars(new[] { "0", "2" });
                    UserPreferences.SetEnabledCalendars(new[] { "0", "2", "4" });
                    UserPreferences.SetEnabledCalendars(new[] { "0", "2", "4", "7" });
                    UserPreferences.SetEnabledCalendars();
                });
            }
Example #19
0
            public async Task FillsTheCalendarList()
            {
                var userCalendarsObservable = Enumerable
                                              .Range(0, 9)
                                              .Select(id => new UserCalendar(
                                                          id.ToString(),
                                                          $"Calendar #{id}",
                                                          $"Source #{id % 3}",
                                                          false))
                                              .Apply(Observable.Return);

                InteractorFactory.GetUserCalendars().Execute().Returns(userCalendarsObservable);

                await ViewModel.Initialize();

                ViewModel.Calendars.Should().HaveCount(3);
                ViewModel.Calendars.ForEach(group => group.Should().HaveCount(3));
            }
Example #20
0
            public async Task MarksAllCalendarsAsNotSelected()
            {
                var userCalendarsObservable = Enumerable
                                              .Range(0, 9)
                                              .Select(id => new UserCalendar(
                                                          id.ToString(),
                                                          $"Calendar #{id}",
                                                          $"Source #{id % 3}",
                                                          false))
                                              .Apply(Observable.Return);

                InteractorFactory.GetUserCalendars().Execute().Returns(userCalendarsObservable);

                await ViewModel.Initialize();

                foreach (var calendarGroup in ViewModel.Calendars)
                {
                    calendarGroup.All(calendar => !calendar.Selected);
                }
            }
            public async Task TracksNumberOfLinkedCalendarsNewUser()
            {
                var initialSelectedIds = new List <string> {
                };

                UserPreferences.EnabledCalendarIds().Returns(initialSelectedIds);
                PermissionsChecker.CalendarPermissionGranted.Returns(Observable.Return(true));
                OnboardingStorage.IsFirstTimeConnectingCalendars().Returns(true);

                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                false));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));

                await ViewModel.Initialize(false);

                var selectedIds = new[] { "2", "4", "7" };

                var calendars = userCalendars
                                .Where(calendar => selectedIds.Contains(calendar.Id))
                                .Select(calendar => new SelectableUserCalendarViewModel(calendar, false));

                ViewModel.SelectCalendar.ExecuteSequentally(calendars)
                .PrependAction(ViewModel.Save)
                .Subscribe();

                TestScheduler.Start();

                ViewModel.ViewDisappeared();

                AnalyticsService.NumberOfLinkedCalendarsNewUser.Received().Track(3);
                AnalyticsService.NumberOfLinkedCalendarsChanged.DidNotReceiveWithAnyArgs().Track(3);
            }
            public void SetsTheEnabledCalendarsWhenThereAreCalendars(NonEmptyString[] nonEmptyStrings)
            {
                if (nonEmptyStrings == null)
                {
                    return;
                }

                InteractorFactory.ClearReceivedCalls();
                var viewModel = CreateViewModel();

                var calendarIds = nonEmptyStrings.Select(str => str.Get).ToArray();

                NavigationService.Navigate <SelectUserCalendarsViewModel, bool, string[]>(Arg.Any <bool>()).Returns(calendarIds);
                PermissionsService.RequestCalendarAuthorization().Returns(Observable.Return(true));
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[] { new UserCalendar() })
                    );

                viewModel.GetStartedAction.Execute(Unit.Default).Wait();

                InteractorFactory.Received().SetEnabledCalendars(calendarIds).Execute();
            }
            public async Task FillsTheCalendarList()
            {
                var userCalendarsObservable = Enumerable
                                              .Range(0, 9)
                                              .Select(id => new UserCalendar(
                                                          id.ToString(),
                                                          $"Calendar #{id}",
                                                          $"Source #{id % 3}",
                                                          false))
                                              .Apply(Observable.Return);

                InteractorFactory.GetUserCalendars().Execute().Returns(userCalendarsObservable);

                var viewModel = new MockSelectUserCalendarsViewModel(UserPreferences, InteractorFactory, NavigationService, RxActionFactory);

                await viewModel.Initialize();

                var calendars = await viewModel.Calendars.FirstAsync();

                calendars.Should().HaveCount(3);
                calendars.ForEach(group => group.Items.Should().HaveCount(3));
            }
            public async Task SavesThePreviouslySelectedCalendarIds()
            {
                var initialSelectedIds = new List <string> {
                    "0", "1", "2", "3"
                };

                UserPreferences.EnabledCalendarIds().Returns(initialSelectedIds);
                PermissionsService.CalendarPermissionGranted.Returns(Observable.Return(true));

                var userCalendars = Enumerable
                                    .Range(0, 9)
                                    .Select(id => new UserCalendar(
                                                id.ToString(),
                                                $"Calendar #{id}",
                                                $"Source #{id % 3}",
                                                false));

                InteractorFactory
                .GetUserCalendars()
                .Execute()
                .Returns(Observable.Return(userCalendars));
                await ViewModel.Initialize();

                var selectedIds = new[] { "0", "2", "4", "7" };

                var calendars = userCalendars
                                .Where(calendar => selectedIds.Contains(calendar.Id))
                                .Select(calendar => new SelectableUserCalendarViewModel(calendar, false));

                ViewModel.SelectCalendar.ExecuteSequentally(calendars)
                .PrependAction(ViewModel.Close)
                .Subscribe();

                TestScheduler.Start();

                UserPreferences.Received().SetEnabledCalendars(initialSelectedIds.ToArray());
            }
            public async Task ReturnsSuggestionsForTheDefaultWorkspace()
            {
                var defaultWorkspace = new MockWorkspace(10);
                var now = new DateTimeOffset(2020, 10, 9, 8, 7, 6, TimeSpan.Zero);

                InteractorFactory.GetDefaultWorkspace().Execute().Returns(Observable.Return(defaultWorkspace));
                TimeService.CurrentDateTime.Returns(now);
                var tenMinutes = TimeSpan.FromMinutes(10);
                var events     = Enumerable.Range(1, 5)
                                 .Select(id => new CalendarItem(
                                             id.ToString(),
                                             CalendarItemSource.Calendar,
                                             now - tenMinutes * id,
                                             tenMinutes,
                                             id.ToString(),
                                             CalendarIconKind.None));

                CalendarService
                .GetEventsInRange(Arg.Any <DateTimeOffset>(), Arg.Any <DateTimeOffset>())
                .Returns(Observable.Return(events));

                var userCalendar = new UserCalendar(
                    "",
                    "",
                    "",
                    true);

                InteractorFactory.GetUserCalendars().Execute()
                .Returns(Observable.Return(new List <UserCalendar> {
                    userCalendar
                }));

                var suggestions = await Provider.GetSuggestions().ToList();

                suggestions.Should().OnlyContain(suggestion => suggestion.WorkspaceId == defaultWorkspace.Id);
            }
                public void EmitsFalseAfterAllTheCalendarsHaveBeenDeselected()
                {
                    var observer = Substitute.For <IObserver <bool> >();

                    ViewModel.Done.Enabled.Subscribe(observer);

                    var userCalendars = Enumerable
                                        .Range(0, 3)
                                        .Select(id => new UserCalendar(id.ToString(), id.ToString(), "Doesn't matter"));

                    var selectedableUserCalendars = userCalendars
                                                    .Select(userCalendar => new SelectableUserCalendarViewModel(userCalendar, false));

                    InteractorFactory
                    .GetUserCalendars()
                    .Execute()
                    .Returns(Observable.Return(userCalendars));


                    var auxObserver = TestScheduler.CreateObserver <Unit>();

                    ViewModel.SelectCalendar.ExecuteSequentally(
                        selectedableUserCalendars
                        .Concat(selectedableUserCalendars)
                        )
                    .Subscribe(auxObserver);

                    TestScheduler.Start();

                    Received.InOrder(() =>
                    {
                        observer.OnNext(false);
                        observer.OnNext(true);
                        observer.OnNext(false);
                    });
                }
Example #27
0
            public void SetsTheEnabledCalendarsWhenThereAreCalendars(NonEmptyString[] nonEmptyStrings)
            {
                if (nonEmptyStrings == null)
                {
                    return;
                }

                InteractorFactory.ClearReceivedCalls();
                var viewModel = CreateViewModel();

                viewModel.AttachView(View);
                var calendarIds = nonEmptyStrings.Select(str => str.Get).ToArray();

                NavigationService.Navigate <SelectUserCalendarsViewModel, bool, string[]>(Arg.Any <bool>(), viewModel.View).Returns(calendarIds);
                View.RequestCalendarAuthorization().Returns(Observable.Return(true));
                InteractorFactory.GetUserCalendars().Execute().Returns(
                    Observable.Return(new UserCalendar[] { new UserCalendar() })
                    );

                viewModel.SelectCalendars.Execute();
                TestScheduler.Start();

                InteractorFactory.Received().SetEnabledCalendars(calendarIds).Execute();
            }
            public async Task ReturnsAllCalendarsFromTheCalendarService()
            {
                var calendars = await InteractorFactory.GetUserCalendars().Execute();

                calendars.Should().HaveCount(calendarsFromService.Count());
            }
            public async Task SetsTheCalendarsToSelectedWhenTheyWereSelectedByTheUser()
            {
                var calendars = await InteractorFactory.GetUserCalendars().Execute();

                calendars.Where(c => c.IsSelected).Should().HaveCount(selectedCalendars.Count());
            }