public ShellViewModel(
            SettingsViewModel settingsViewModel,
            MainViewModel mainViewModel,
            IEventAggregator eventAggregator,
            INavigationService navigationService,
            IMonitorStreamsModel monitorStreamsModel,
            ISettingsHandler settingsHandler,
            PopularLivestreamWatcher popularLivestreamWatcher)
        {
            Settings                      = settingsViewModel ?? throw new ArgumentNullException(nameof(settingsViewModel));
            this.mainViewModel            = mainViewModel ?? throw new ArgumentNullException(nameof(mainViewModel));
            this.navigationService        = navigationService ?? throw new ArgumentNullException(nameof(navigationService));
            this.monitorStreamsModel      = monitorStreamsModel ?? throw new ArgumentNullException(nameof(monitorStreamsModel));
            this.settingsHandler          = settingsHandler ?? throw new ArgumentNullException(nameof(settingsHandler));
            this.popularLivestreamWatcher = popularLivestreamWatcher ?? throw new ArgumentNullException(nameof(popularLivestreamWatcher));

            ActiveItem = mainViewModel;

            eventAggregator.Subscribe(this);
            Settings.ActivateWith(this);

            currentAppVersion = GetType().Assembly.GetName().Version;
            DisplayName       = $"LIVESTREAM MONITOR V{currentAppVersion.Major}.{currentAppVersion.Minor}.{currentAppVersion.Build}";
#if DEBUG
            // helps to know that we're running the debug rather than release version of the exe
            DisplayName += " (DEBUG)";
#endif
        }
        public async Task NotNotifyWhenBelowMinimumViewers(
            [Frozen] ISettingsHandler settingsHandler,
            [Frozen] INotificationHandler notificationHandler,
            [Frozen] IEnumerable <IApiClient> apiClients,
            [Frozen] List <LivestreamQueryResult> livestreamQueryResults,
            PopularLivestreamWatcher sut)
        {
            var apiClient = apiClients.First();

            SetupApiClient(apiClient, livestreamQueryResults);
            settingsHandler.Settings.MinimumEventViewers = 2000;

            await sut.NotifyPopularStreams();

            notificationHandler.DidNotReceive().AddNotification(Arg.Any <LivestreamNotification>());
        }
        public async Task NotifyWhenStreamAboveMinimumViewers(
            int minimumViewers,
            int expectedNotificationCount,
            [Frozen] ISettingsHandler settingsHandler,
            [Frozen] INotificationHandler notificationHandler,
            [Frozen] List <IApiClient> apiClients,
            [Frozen] List <LivestreamQueryResult> livestreamQueryResults,
            PopularLivestreamWatcher sut)
        {
            var apiClient = apiClients.First();

            SetupApiClient(apiClient, livestreamQueryResults);
            settingsHandler.Settings.MinimumEventViewers = minimumViewers;

            await sut.NotifyPopularStreams();

            notificationHandler.Received(expectedNotificationCount).AddNotification(Arg.Any <LivestreamNotification>());
        }