public void CancelAllJobsAndExit_Exits() { // arrange int taskStartCount = 0; SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); // act A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)) .Invokes(() => { taskStartCount++; if (taskStartCount > 1) { throw new Exception("Concurrent calls are not being trapped"); } ViewModel.RequestExit(); ViewModel.CancelAllJobsAndExit(); }); ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockTaskPool.CancelAllTasks()).MustHaveHappened(1, Times.Exactly); Assert.AreEqual(1, ObservedResults.ExitCount, "exit count"); }
public void RequestExit_Prompts() { // arrange bool result = true; int taskStartCount = 0; SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); // act A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)) .Invokes(() => { taskStartCount++; if (taskStartCount > 1) { throw new Exception("Concurrent calls are not being trapped"); } result = ViewModel.RequestExit(); }); ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); Assert.AreEqual(result, false, "result"); Assert.AreEqual("dialog title", ObservedResults.LastExitPromptTitle, "exit prompt title"); Assert.AreEqual("exit message", ObservedResults.LastExitPromptMessage, "exit prompt message"); Assert.AreEqual("exit ok", ObservedResults.LastExitPromptOk, "exit prompt ok"); Assert.AreEqual("exit cancel", ObservedResults.LastExitPromptCancel, "exit prompt cancel"); }
public void StatusUpdate_Exception() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); var testException = new Exception("TEST EXCEPTION"); var syncItemMocker = SetupFireStatusEvent(EPISODE_1_ID, StatusUpdateLevel.Error, false, testException, "test exception"); Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore); Fake.ClearRecordedCalls(MockAnalyticsEngine); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockStatusAndProgressMessageStore.StoreMessage( A <Guid> .That.Matches(g => g.ToString() == EPISODE_1_ID.ToString()), A <string> .That.Matches(s => s == "test exception"))) .MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockStatusAndProgressMessageStore.StoreMessage( A <Guid> .That.Matches(g => g.ToString() == EPISODE_1_ID.ToString()), A <string> .That.Matches(s => s == "System.Exception: TEST EXCEPTION"))) .MustHaveHappened(1, Times.Exactly); Assert.AreEqual("test exception", ObservedResults.LastUpdateStatusMessage, "message"); Assert.AreEqual(syncItemMocker.GetMockedSyncItem(), ObservedResults.LastUpdateStatusItem, "item"); Assert.AreEqual(Status.Error, ObservedResults.LastUpdateStatus, "status"); A.CallTo(MockAnalyticsEngine).MustNotHaveHappened(); }
public void RefreshFilesystemInfo_Adds_DriveInfo_Sdcard_Paths() { // arrange SetupFileSystemStorageCardPaths(); ViewModel.Initialise(); // act ViewModel.RefreshFileSystemInfo(); // assert // there are no errors A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); // file 1 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/SDCARD1").MustHaveHappened(1, Times.Exactly); // file 2 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/SDCARD2/anotherplace/").MustHaveHappened(1, Times.Exactly); // file 3 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/SDCARD3").MustHaveHappened(1, Times.Exactly); // file 4 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/Android/data/").MustHaveHappened(1, Times.Exactly); // file 5 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/emulated/0").MustHaveHappened(1, Times.Exactly); // all A.CallTo(() => MockDriveVolumeInfoView.GetView()).MustHaveHappened(5, Times.Exactly); }
public void DownloadAllPodcastsWithoutNetworkCheck_HandlesMultipleCalls_Concurrent() { // arrange int taskStartCount = 0; SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)) .Invokes(() => { taskStartCount++; if (taskStartCount > 1) { throw new Exception("Concurrent calls are not being trapped"); } ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); }); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockLogger.Warning(A <ILogger.MessageGenerator> .Ignored)).MustHaveHappened(1, Times.Exactly); Assert.AreEqual(1, ObservedResults.StartDownloadingCount, "start count"); Assert.AreEqual(1, ObservedResults.EndDownloadingCount, "end count"); Assert.AreEqual(1, taskStartCount, "task start count"); }
public void GeneratePlaylist_CallsGenerate() { // arrange SetupMockControlFileFor1Podcast(); ViewModel.Initialise(); // act ViewModel.GeneratePlaylist(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockPlaylistGenerator.GeneratePlaylist(MockControlFile, "/sdcard/sourceroot", true, A <EventHandler <StatusUpdateEventArgs> > .Ignored)).MustHaveHappened(1, Times.Exactly); }
public void LoadControlFile_LoadsFile() { // arrange Android.Net.Uri uri = Android.Net.Uri.Parse("content://com.android.externalstorage.documents/document/primary%3APodcastUtilities%2FDerekPodcastsSmall2.xml"); var control = SetupRealControlFile(uri); ViewModel.Initialise(); // act ViewModel.LoadContolFile(uri); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockApplicationControlFileProvider.ReplaceApplicationConfiguration(control)).MustHaveHappened(1, Times.Exactly); }
public void RequestExit_DoesNotPrompts() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); // act var result = ViewModel.RequestExit(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); Assert.AreEqual(result, true, "result"); }
public async Task DownloadAllPodcastsWithoutNetworkCheck_StartsAndStops() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); // act await ViewModel.DownloadAllPodcastsWithoutNetworkCheck().ConfigureAwait(false); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); Assert.AreEqual(1, ObservedResults.StartDownloadingCount, "start count"); Assert.AreEqual(1, ObservedResults.EndDownloadingCount, "end count"); }
public async Task DownloadAllPodcastsWithoutNetworkCheck_SetsMaxDownloads() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); // act await ViewModel.DownloadAllPodcastsWithoutNetworkCheck().ConfigureAwait(false); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockNetworkHelper.SetNetworkConnectionLimit(MAX_DOWNLOADS)).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockTaskPool.RunAllTasks(MAX_DOWNLOADS, A <ITask[]> .Ignored)).MustHaveHappened(1, Times.Exactly); }
public void GeneratePlaylist_HandlesErrors() { // arrange SetupMockControlFileFor1Podcast(); ViewModel.Initialise(); var testException = new Exception(); A.CallTo(() => MockPlaylistGenerator.GeneratePlaylist(A <IReadOnlyControlFile> .Ignored, A <string> .Ignored, A <bool> .Ignored, A <EventHandler <StatusUpdateEventArgs> > .Ignored)).Throws(testException); // act ViewModel.GeneratePlaylist(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly); Assert.AreEqual("Mocked playlist error", ObservedResults.LastToastMessage); }
public void CancelAllJobsAndExit_CancelsJobs() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); ViewModel.RequestExit(); // act ViewModel.CancelAllJobsAndExit(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockTaskPool.CancelAllTasks()).MustHaveHappened(1, Times.Exactly); Assert.AreEqual("cancelling", ObservedResults.LastDisplayMessage); }
public void LoadControlFile_HandlesErrors() { // arrange Android.Net.Uri uri = Android.Net.Uri.Parse("content://com.android.externalstorage.documents/document/primary%3APodcastUtilities%2FDerekPodcastsSmall2.xml"); var control = SetupRealControlFile(uri); ViewModel.Initialise(); var testException = new Exception(); A.CallTo(() => MockApplicationControlFileFactory.CreateControlFile(A <XmlDocument> .Ignored)).Throws(testException); // act ViewModel.LoadContolFile(uri); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly); Assert.AreEqual("Mocked control file error", ObservedResults.LastToastMessage); }
public void ProgressUpdate_ChecksFreeSpace() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); SetupFireProgressEvent(EPISODE_1_ID, 9); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockFileSystemHelper.GetAvailableFileSystemSizeInBytes(A <string> .Ignored)).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockTaskPool.CancelAllTasks()).MustNotHaveHappened(); }
public void RefreshFilesystemInfo_Handles_Errors() { // arrange SetupFileSystem(); ViewModel.Initialise(); var testException = new Exception(); A.CallTo(MockFileSystemHelper).Throws(testException); // act ViewModel.RefreshFileSystemInfo(); // assert // writes the error to the logs A.CallTo(() => MockLogger.LogException(A <ILogger.MessageGenerator> .Ignored, testException)).MustHaveHappened(1, Times.Exactly); // writes the error to crshlytics A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustHaveHappened(1, Times.Exactly); }
public void DownloadAllPodcastsWithoutNetworkCheck_HandlesMultipleCalls_Sequential() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockLogger.Warning(A <ILogger.MessageGenerator> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)).MustHaveHappened(2, Times.Exactly); Assert.AreEqual(2, ObservedResults.StartDownloadingCount, "start count"); Assert.AreEqual(2, ObservedResults.EndDownloadingCount, "end count"); }
public void GeneratePlaylist_StatusUpdates() { // arrange SetupMockControlFileFor1Podcast(); ViewModel.Initialise(); A.CallTo(() => MockPlaylistGenerator.GeneratePlaylist(MockControlFile, "/sdcard/sourceroot", true, A <EventHandler <StatusUpdateEventArgs> > .Ignored)) .Invokes((IReadOnlyControlFile control, string root, bool copy, EventHandler <StatusUpdateEventArgs> statusUpdateHandler) => { statusUpdateHandler?.Invoke(this, new StatusUpdateEventArgs(StatusUpdateLevel.Status, "status message", true, null)); }); // act ViewModel.GeneratePlaylist(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); Assert.AreEqual("status message", ObservedResults.LastToastMessage); }
public void PurgeAllItems_HandlesException() { // arrange SetupMockControlFileFor2Podcasts(); var dir = SetupMockPurgerWithRealItems(); ViewModel.Initialise(); ViewModel.FindItemsToDelete(); var testException = new Exception("TEST EXCEPTION"); A.CallTo(MockFileUtilities).Throws(testException); // act ViewModel.PurgeAllItems(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly); Assert.AreEqual("Error file.ext", ObservedResults.LastDisplayMessage); }
public void ProgressUpdate_UpdatesProgress_Not_At_11() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); var syncItemMocker = SetupFireProgressEvent(EPISODE_1_ID, 11); Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(MockStatusAndProgressMessageStore).MustNotHaveHappened(); Assert.AreEqual(0, ObservedResults.LastUpdatePercentage, "percentage"); Assert.IsNull(ObservedResults.LastUpdatePercentageItem, "item"); }
public async Task DownloadAllPodcastsWithoutNetworkCheck_HandlesException() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); var testException = new Exception("TEST EXCEPTION"); A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)).Throws(testException); // act await ViewModel.DownloadAllPodcastsWithoutNetworkCheck().ConfigureAwait(false); // assert Assert.AreEqual(1, ObservedResults.StartDownloadingCount, "start count"); Assert.AreEqual(1, ObservedResults.EndDownloadingCount, "end count"); A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockLogger.LogException(A <ILogger.MessageGenerator> .Ignored, testException)).MustHaveHappened(1, Times.Exactly); Assert.AreEqual("TEST EXCEPTION", ObservedResults.LastDisplayMessage); }
public void StatusUpdate_StatusMessageVerboseDoesNotDisplay() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); var syncItemMocker = SetupFireStatusEvent(EPISODE_1_ID, StatusUpdateLevel.Verbose, false, null, "test verbose"); Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore); Fake.ClearRecordedCalls(MockAnalyticsEngine); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); Assert.IsNull(ObservedResults.LastUpdateStatusMessage, "message"); Assert.IsNull(ObservedResults.LastUpdateStatusItem, "item"); Assert.AreEqual(Status.OK, ObservedResults.LastUpdateStatus, "status"); A.CallTo(MockStatusAndProgressMessageStore).MustNotHaveHappened(); A.CallTo(MockAnalyticsEngine).MustNotHaveHappened(); }
public void ProgressUpdate_UpdatesProgress_At_10() { // arrange SetupMockControlFileFor2Podcasts(); SetupEpisodesFor2Podcasts(); ViewModel.Initialise(); ViewModel.FindEpisodesToDownload(); var syncItemMocker = SetupFireProgressEvent(EPISODE_1_ID, 10); Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore); // act ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait(); // assert A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); A.CallTo(() => MockStatusAndProgressMessageStore.StoreMessage( A <Guid> .That.Matches(g => g.ToString() == EPISODE_1_ID.ToString()), A <string> .That.Matches(s => s == "EpisodeTitle (10 bytes of 100 bytes) 10%"))) .MustHaveHappened(1, Times.Exactly); Assert.AreEqual(10, ObservedResults.LastUpdatePercentage, "percentage"); Assert.AreEqual(syncItemMocker.GetMockedSyncItem(), ObservedResults.LastUpdatePercentageItem, "item"); }
public void RefreshFilesystemInfo_Adds_DriveInfo_Before_An_Error() { // arrange SetupFileSystem(); ViewModel.Initialise(); // throw processing the second item var testException = new Exception(); A.CallTo(() => MockFileSystemHelper.GetAvailableFileSystemSizeInBytes(PATH2)).Throws(testException); // act ViewModel.RefreshFileSystemInfo(); // assert // writes the error to the logs A.CallTo(() => MockLogger.LogException(A <ILogger.MessageGenerator> .Ignored, testException)).MustHaveHappened(1, Times.Exactly); // writes the error to crshlytics A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustHaveHappened(1, Times.Exactly); // file 1 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => PATH1).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockDriveVolumeInfoView.SetSpace(100, 200, "100", "MB", "200", "MB")).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockDriveVolumeInfoView.GetView()).MustHaveHappened(1, Times.Exactly); }
public void RefreshFilesystemInfo_Adds_DriveInfo() { // arrange SetupFileSystem(); ViewModel.Initialise(); // act ViewModel.RefreshFileSystemInfo(); // assert // there are no errors A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened(); // file 1 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => PATH1).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockDriveVolumeInfoView.SetSpace(100, 200, "100", "MB", "200", "MB")).MustHaveHappened(1, Times.Exactly); // file 2 A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => PATH2).MustHaveHappened(1, Times.Exactly); A.CallTo(() => MockDriveVolumeInfoView.SetSpace(2000, 4000, "1.95", "GB", "3.91", "GB")).MustHaveHappened(1, Times.Exactly); // both A.CallTo(() => MockDriveVolumeInfoView.GetView()).MustHaveHappened(2, Times.Exactly); }