public void SuccessfulFlowEndsInNextStep() { const string transferCode = "abcdefgh"; var settingsModel = CreateSettingsModel(transferCode); byte[] encryptedRepository = CreateEncryptedRepository(transferCode); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <byte[]>(It.Is <SynchronizationStorySessionKey>(p => p == SynchronizationStorySessionKey.BinaryCloudRepository))). Returns(encryptedRepository); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <INoteRepositoryUpdater> updater = new Mock <INoteRepositoryUpdater>(); // Run step var step = new DecryptCloudRepositoryStep( SynchronizationStoryStepId.DecryptCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, updater.Object); Assert.DoesNotThrowAsync(step.Run); // Repository has not changed and was not stored in session settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.IsNotNull <SettingsModel>()), Times.Never); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.IsSameRepository)), Times.Once); }
public void StoreMergedRepositoryWhenDifferent() { const string transferCode = "abcdefgh"; SerializeableCloudStorageCredentials credentialsFromSession = new SerializeableCloudStorageCredentials(); var settingsModel = CreateSettingsModel(transferCode); NoteRepositoryModel repositoryModelLocal = new NoteRepositoryModel(); repositoryModelLocal.Notes.Add(new NoteModel()); NoteRepositoryModel repositoryModelCloud = new NoteRepositoryModel(); repositoryModelCloud.Notes.Add(new NoteModel()); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <SerializeableCloudStorageCredentials>(It.Is <int>(p => p == SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()))). Returns(credentialsFromSession); storyBoard. Setup(m => m.LoadFromSession <NoteRepositoryModel>(It.Is <int>(p => p == SynchronizationStorySessionKey.CloudRepository.ToInt()))). Returns(repositoryModelCloud); // same as from repositoryStorageService Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>(); repositoryStorageService. Setup(m => m.LoadRepositoryOrDefault(out repositoryModelLocal)); // same as from storyBoard Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); // Run step var step = new StoreMergedRepositoryAndQuitStep( SynchronizationStoryStepId.StoreLocalRepositoryToCloudAndQuit.ToInt(), storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CryptoRandomService(), repositoryStorageService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // repository is stored to the local device repositoryStorageService.Verify(m => m.TrySaveRepository(It.IsAny <NoteRepositoryModel>()), Times.Once); // repository is stored to the cloud cloudStorageClient.Verify(m => m.UploadFileAsync(It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <CloudStorageCredentials>()), Times.Once); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <int>(x => x == SynchronizationStoryStepId.StopAndShowRepository.ToInt())), Times.Once); }
public void AccountIsStoredWhenDifferent() { SerializeableCloudStorageCredentials credentialsFromSession = new SerializeableCloudStorageCredentials { CloudStorageId = CloudStorageClientFactory.CloudStorageIdDropbox }; SettingsModel settingsModel = new SettingsModel { Credentials = new SerializeableCloudStorageCredentials { CloudStorageId = CloudStorageClientFactory.CloudStorageIdFtp } }; Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <SerializeableCloudStorageCredentials>(It.Is <SynchronizationStorySessionKey>(p => p == SynchronizationStorySessionKey.CloudStorageCredentials))). Returns(credentialsFromSession); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); cloudStorageClient. Setup(m => m.ExistsFileAsync(It.IsAny <string>(), It.IsAny <CloudStorageCredentials>())). ReturnsAsync(true); // Run step var step = new ExistsCloudRepositoryStep( SynchronizationStoryStepId.ExistsCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // Settings are stored with account from session settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.Is <SettingsModel>(s => s.Credentials == credentialsFromSession)), Times.Once); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.DownloadCloudRepository)), Times.Once); }
public void QuitWhenMissingClientOrTransfercode() { SerializeableCloudStorageCredentials credentials = new SerializeableCloudStorageCredentials { CloudStorageId = CloudStorageClientFactory.CloudStorageIdDropbox }; SettingsModel settingsModel = new SettingsModel { Credentials = credentials }; Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); cloudStorageClient. Setup(m => m.ExistsFileAsync(It.IsAny <string>(), It.IsAny <CloudStorageCredentials>())). ReturnsAsync(true); // Run step with missing transfercode var step = new ExistsCloudRepositoryStep( PullPushStoryStepId.ExistsCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <PullPushStoryStepId>(x => x == PullPushStoryStepId.DownloadCloudRepository)), Times.Never); // Run step with missing storage client settingsModel.TransferCode = "abc"; settingsModel.Credentials.CloudStorageId = null; Assert.DoesNotThrowAsync(step.Run); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <PullPushStoryStepId>(x => x == PullPushStoryStepId.DownloadCloudRepository)), Times.Never); }
public void CorrectNextStepWhenNoCloudRepositoryExists() { SerializeableCloudStorageCredentials credentials = new SerializeableCloudStorageCredentials { CloudStorageId = CloudStorageClientFactory.CloudStorageIdDropbox }; SettingsModel settingsModel = new SettingsModel { Credentials = credentials }; Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <SerializeableCloudStorageCredentials>(It.Is <SynchronizationStorySessionKey>(p => p == SynchronizationStorySessionKey.CloudStorageCredentials))). Returns(credentials); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); cloudStorageClient. Setup(m => m.ExistsFileAsync(It.IsAny <string>(), It.IsAny <CloudStorageCredentials>())). ReturnsAsync(false); // Run step var step = new ExistsCloudRepositoryStep( SynchronizationStoryStepId.ExistsCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // Settings are not stored because they are equal settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.IsAny <SettingsModel>()), Times.Never); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.StoreLocalRepositoryToCloudAndQuit)), Times.Once); }
public void RejectWhenNotesAreEqual() { NoteModel noteModel = new NoteModel(); NoteRepositoryModel repositoryModel = new NoteRepositoryModel(); repositoryModel.Notes.Add(noteModel); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <NoteRepositoryModel>(It.Is <PullPushStorySessionKey>(p => p == PullPushStorySessionKey.CloudRepository))). Returns(repositoryModel); // same as from repositoryStorageService Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(new SettingsModel()); Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>(); repositoryStorageService. Setup(m => m.LoadRepositoryOrDefault(out repositoryModel)); // same as from storyBoard Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); // Run step var step = new StoreMergedRepositoryAndQuitStep( PullPushStoryStepId.StoreMergedRepositoryAndQuit, storyBoard.Object, noteModel.Id, PullPushDirection.PullFromServer, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CryptoRandomService(), repositoryStorageService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object));; Assert.DoesNotThrowAsync(step.Run); // repository is not stored to the local device, nor to the cloud repositoryStorageService.Verify(m => m.TrySaveRepository(It.IsAny <NoteRepositoryModel>()), Times.Never); cloudStorageClient.Verify(m => m.UploadFileAsync(It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <CloudStorageCredentials>()), Times.Never); }
public void MissingOrWrongTransfercodeLeadsToInputDialog() { const string transferCode = "abcdefgh"; var settingsModel = CreateSettingsModel(null); // no transfer code at all byte[] encryptedRepository = CreateEncryptedRepository(transferCode); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <byte[]>(It.Is <SynchronizationStorySessionKey>(p => p == SynchronizationStorySessionKey.BinaryCloudRepository))). Returns(encryptedRepository); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <INoteRepositoryUpdater> updater = new Mock <INoteRepositoryUpdater>(); // Run step var step = new DecryptCloudRepositoryStep( SynchronizationStoryStepId.DecryptCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, updater.Object); Assert.DoesNotThrowAsync(step.Run); // No changes should be done to the settings settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.IsNotNull <SettingsModel>()), Times.Never); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.ShowTransferCode)), Times.Once); // Run step with wrong transfer code settingsModel.TransferCode = "qqqqqqqq"; Assert.DoesNotThrowAsync(step.Run); storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.ShowTransferCode)), Times.Exactly(2)); }
public void DoNotStoreAnythingWhenRepositoriesAreSame() { NoteRepositoryModel repositoryModel = new NoteRepositoryModel(); repositoryModel.Revision = NoteRepositoryModel.NewestSupportedRevision; Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <NoteRepositoryModel>(It.Is <int>(p => p == SynchronizationStorySessionKey.CloudRepository.ToInt()))). Returns(repositoryModel); // same as from repositoryStorageService Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>(); repositoryStorageService. Setup(m => m.LoadRepositoryOrDefault(out repositoryModel)); // same as from storyBoard Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); // Run step var step = new StoreMergedRepositoryAndQuitStep( SynchronizationStoryStepId.StoreLocalRepositoryToCloudAndQuit.ToInt(), storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CryptoRandomService(), repositoryStorageService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // repository is not stored to the local device repositoryStorageService.Verify(m => m.TrySaveRepository(It.IsAny <NoteRepositoryModel>()), Times.Never); // repository is not stored to the cloud cloudStorageClient.Verify(m => m.UploadFileAsync(It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <CloudStorageCredentials>()), Times.Never); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <int>(x => x == SynchronizationStoryStepId.StopAndShowRepository.ToInt())), Times.Once); }
public void KeepExistingTransfercode() { SerializeableCloudStorageCredentials credentialsFromSession = new SerializeableCloudStorageCredentials(); var settingsModel = CreateSettingsModel("abcdefgh"); // Transfercode exists NoteRepositoryModel repositoryModel = new NoteRepositoryModel(); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <SerializeableCloudStorageCredentials>(It.Is <SynchronizationStorySessionKey>(p => p == SynchronizationStorySessionKey.CloudStorageCredentials))). Returns(credentialsFromSession); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>(); repositoryStorageService. Setup(m => m.LoadRepositoryOrDefault(out repositoryModel)); // Run step var step = new StoreLocalRepositoryToCloudAndQuitStep( SynchronizationStoryStepId.StoreLocalRepositoryToCloudAndQuit, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CryptoRandomService(), repositoryStorageService.Object, CommonMocksAndStubs.CloudStorageClientFactory()); Assert.DoesNotThrowAsync(step.Run); // No settings are stored settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.IsAny <SettingsModel>()), Times.Never); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.StopAndShowRepository)), Times.Once); }
public void GenerateAndStoreNewTransfercode() { SerializeableCloudStorageCredentials credentialsFromSession = new SerializeableCloudStorageCredentials(); var settingsModel = CreateSettingsModel(null); // Transfercode does not yet exist NoteRepositoryModel repositoryModel = new NoteRepositoryModel(); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <SerializeableCloudStorageCredentials>(It.Is <int>(p => p == SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()))). Returns(credentialsFromSession); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>(); repositoryStorageService. Setup(m => m.LoadRepositoryOrDefault(out repositoryModel)); // Run step var step = new StoreLocalRepositoryToCloudAndQuitStep( SynchronizationStoryStepId.StoreLocalRepositoryToCloudAndQuit.ToInt(), storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CryptoRandomService(), repositoryStorageService.Object, CommonMocksAndStubs.CloudStorageClientFactory()); Assert.DoesNotThrowAsync(step.Run); // Settings are stored with new transfer code settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.Is <SettingsModel>(s => !string.IsNullOrEmpty(s.TransferCode))), Times.Once); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <int>(x => x == SynchronizationStoryStepId.StopAndShowRepository.ToInt())), Times.Once); }
public void TransfercodeOfHistoryWillBeReused() { const string transferCode = "abcdefgh"; var settingsModel = CreateSettingsModel("qqqqqqqq"); settingsModel.TransferCodeHistory.Add(transferCode); // Good transfercode is in history byte[] encryptedRepository = CreateEncryptedRepository(transferCode); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <byte[]>(It.Is <SynchronizationStorySessionKey>(p => p == SynchronizationStorySessionKey.BinaryCloudRepository))). Returns(encryptedRepository); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <INoteRepositoryUpdater> updater = new Mock <INoteRepositoryUpdater>(); // Run step var step = new DecryptCloudRepositoryStep( SynchronizationStoryStepId.DecryptCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, updater.Object); Assert.DoesNotThrowAsync(step.Run); // transfercode was moved from history to current and was stored Assert.AreEqual(transferCode, settingsModel.TransferCode); settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.IsNotNull <SettingsModel>()), Times.Once); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <SynchronizationStoryStepId>(x => x == SynchronizationStoryStepId.IsSameRepository)), Times.Once); }
public void SuccessfulFlowEndsInNextStep() { SerializeableCloudStorageCredentials credentialsFromSession = new SerializeableCloudStorageCredentials(); byte[] repositoryFromSession = null; byte[] repository = new byte[8]; Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <SerializeableCloudStorageCredentials>(It.Is <int>(p => p == SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()))). Returns(credentialsFromSession); storyBoard. Setup(m => m.TryLoadFromSession(It.Is <int>(p => p == SynchronizationStorySessionKey.BinaryCloudRepository.ToInt()), out repositoryFromSession)). Returns(false); Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); cloudStorageClient. Setup(m => m.DownloadFileAsync(It.IsAny <string>(), It.IsAny <CloudStorageCredentials>())). ReturnsAsync(repository); // Run step var step = new DownloadCloudRepositoryStep( SynchronizationStoryStepId.DownloadCloudRepository.ToInt(), storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // Repository was stored in session storyBoard.Verify(m => m.StoreToSession(It.Is <int>(p => p == SynchronizationStorySessionKey.BinaryCloudRepository.ToInt()), It.Is <object>(p => p == repository)), Times.Once); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <int>(x => x == SynchronizationStoryStepId.ExistsTransferCode.ToInt())), Times.Once); }
public void CorrectNextStepWhenCloudRepositoryExists() { SerializeableCloudStorageCredentials credentials = new SerializeableCloudStorageCredentials { CloudStorageId = CloudStorageClientFactory.CloudStorageIdDropbox }; SettingsModel settingsModel = new SettingsModel { Credentials = credentials, TransferCode = "abc" }; Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel); Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); cloudStorageClient. Setup(m => m.ExistsFileAsync(It.IsAny <string>(), It.IsAny <CloudStorageCredentials>())). ReturnsAsync(true); // Run step var step = new ExistsCloudRepositoryStep( PullPushStoryStepId.ExistsCloudRepository, storyBoard.Object, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object)); Assert.DoesNotThrowAsync(step.Run); // Settings are not stored because no token needs to be refreshed settingsService.Verify(m => m.TrySaveSettingsToLocalDevice(It.IsAny <SettingsModel>()), Times.Never); // Next step is called storyBoard.Verify(m => m.ContinueWith(It.Is <PullPushStoryStepId>(x => x == PullPushStoryStepId.DownloadCloudRepository)), Times.Once); }
public void PushStoresCorrectData() { NoteModel cloudNoteModel = new NoteModel { HtmlContent = "cloudContent", InRecyclingBin = true, ModifiedAt = new DateTime(2000, 10, 22) }; NoteRepositoryModel cloudRepositoryModel = new NoteRepositoryModel(); cloudRepositoryModel.Notes.Add(cloudNoteModel); NoteModel localNoteModel = new NoteModel { Id = cloudNoteModel.Id, HtmlContent = "localContent", InRecyclingBin = false, ModifiedAt = new DateTime(1900, 10, 22) }; NoteRepositoryModel localRepositoryModel = new NoteRepositoryModel { Id = cloudNoteModel.Id }; localRepositoryModel.Notes.Add(localNoteModel); Mock <IStoryBoard> storyBoard = new Mock <IStoryBoard>(); storyBoard. Setup(m => m.LoadFromSession <NoteRepositoryModel>(It.Is <PullPushStorySessionKey>(p => p == PullPushStorySessionKey.CloudRepository))). Returns(cloudRepositoryModel); Mock <ISettingsService> settingsService = new Mock <ISettingsService>(); settingsService. Setup(m => m.LoadSettingsOrDefault()).Returns(new SettingsModel { TransferCode = "AAAAAAAAAAAA", Credentials = new SerializeableCloudStorageCredentials() }); Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>(); repositoryStorageService. Setup(m => m.LoadRepositoryOrDefault(out localRepositoryModel)); Mock <ICloudStorageClient> cloudStorageClient = new Mock <ICloudStorageClient>(); // Run step var step = new StoreMergedRepositoryAndQuitStep( PullPushStoryStepId.StoreMergedRepositoryAndQuit, storyBoard.Object, cloudNoteModel.Id, PullPushDirection.PushToServer, CommonMocksAndStubs.LanguageService(), CommonMocksAndStubs.FeedbackService(), settingsService.Object, CommonMocksAndStubs.CryptoRandomService(), repositoryStorageService.Object, CommonMocksAndStubs.CloudStorageClientFactory(cloudStorageClient.Object));; Assert.DoesNotThrowAsync(step.Run); // Cloud note object still exists and contains the content of the cloud plus a new modification date NoteModel newCloudNote = cloudRepositoryModel.Notes.FindById(localNoteModel.Id); Assert.AreSame(cloudNoteModel, newCloudNote); Assert.AreEqual("localContent", newCloudNote.HtmlContent); Assert.AreEqual(false, newCloudNote.InRecyclingBin); Assert.AreEqual(DateTime.UtcNow.Day, newCloudNote.ModifiedAt.Day); // Local note object still exists and has new modification date NoteModel newLocalNote = localRepositoryModel.Notes.FindById(cloudNoteModel.Id); Assert.AreEqual(DateTime.UtcNow.Day, newLocalNote.ModifiedAt.Day); // repository was stored to the local device and to the cloud repositoryStorageService.Verify(m => m.TrySaveRepository(It.IsAny <NoteRepositoryModel>()), Times.Once); cloudStorageClient.Verify(m => m.UploadFileAsync(It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <CloudStorageCredentials>()), Times.Once); }