public void ModifiedNoteIsEncryptedAndStored()
        {
            string modelHtmlContent = "c2VjcmV0";

            byte[]                           safeKey             = new byte[] { 88 };
            SettingsModel                    settingsModel       = new SettingsModel();
            SearchableHtmlConverter          searchableConverter = new SearchableHtmlConverter();
            Mock <IRepositoryStorageService> repositoryService   = new Mock <IRepositoryStorageService>();
            Mock <ISettingsService>          settingsService     = new Mock <ISettingsService>();

            settingsService.
            Setup(m => m.LoadSettingsOrDefault()).Returns(settingsModel);
            Mock <ICryptor> cryptor = new Mock <ICryptor>();

            cryptor.
            Setup(m => m.Decrypt(It.IsAny <byte[]>(), It.Is <byte[]>(v => v == safeKey))).
            Returns(CryptoUtils.StringToBytes("not secret anymore"));

            SafeListModel safes = new SafeListModel(new[]
            {
                new SafeModel {
                    Id = Guid.NewGuid(), Key = safeKey
                },
            });
            NoteModel note = new NoteModel {
                Id = Guid.NewGuid(), HtmlContent = modelHtmlContent, SafeId = safes[0].Id
            };

            NoteViewModel noteViewModel = new NoteViewModel(
                new Mock <INavigationService>().Object,
                new Mock <ILanguageService>().Object,
                new Mock <ISvgIconService>().Object,
                new Mock <IThemeService>().Object,
                new Mock <IBaseUrlService>().Object,
                searchableConverter,
                repositoryService.Object,
                new Mock <IFeedbackService>().Object,
                settingsService.Object,
                cryptor.Object,
                safes,
                new List <string>(),
                note);

            noteViewModel.UnlockedHtmlContent = "something new";
            noteViewModel.OnStoringUnsavedData();

            cryptor.Verify(m => m.Encrypt(
                               It.Is <byte[]>(p => p.SequenceEqual(CryptoUtils.StringToBytes("something new"))),
                               It.Is <byte[]>(p => p.SequenceEqual(safeKey)),
                               It.IsAny <string>(),
                               It.Is <string>(p => p == null)),
                           Times.Once);
            repositoryService.Verify(m => m.TrySaveRepository(It.IsAny <NoteRepositoryModel>()), Times.Once);
        }
        public void IsPinned_SetToTrue_MovesNotePositionToTop()
        {
            NoteRepositoryModel repository     = CreateTestRepository();
            NoteModel           noteToBePinned = repository.Notes[1];
            NoteViewModel       noteViewModel  = CreateMockedNoteViewModel(noteToBePinned, repository);

            noteViewModel.IsPinned = true;
            noteViewModel.OnStoringUnsavedData();

            Assert.AreSame(noteToBePinned, repository.Notes[0]); // Now on first position
            Assert.IsTrue(noteToBePinned.IsPinned);
        }
        public void TogglePinned_CalledTwice_DoesNotChangeNotePosition()
        {
            NoteRepositoryModel repository     = CreateTestRepository();
            NoteModel           noteToBePinned = repository.Notes[1];
            NoteViewModel       noteViewModel  = CreateMockedNoteViewModel(noteToBePinned, repository);

            noteViewModel.TogglePinnedCommand.Execute(null);
            noteViewModel.TogglePinnedCommand.Execute(null);
            noteViewModel.OnStoringUnsavedData();

            Assert.AreSame(noteToBePinned, repository.Notes[1]); // No modification, no change of position
            Assert.IsFalse(noteToBePinned.IsPinned);
        }
        public void IsPinned_NoPositionChange_NOTStoresPosition()
        {
            NoteRepositoryModel repository = CreateTestRepository();
            var           testNote         = repository.Notes[0];
            NoteViewModel noteViewModel    = CreateMockedNoteViewModel(testNote, repository);

            var original = repository.OrderModifiedAt;

            testNote.IsPinned = true; //stays on indey 0 and does NOT refresh OrderModifiedAt

            noteViewModel.OnStoringUnsavedData();

            Assert.IsTrue(repository.OrderModifiedAt == original);
        }
        public void IsPinned_PositionChange_StoresPosition()
        {
            NoteRepositoryModel repository = CreateTestRepository();
            var           testNote         = repository.Notes[2];
            NoteViewModel noteViewModel    = CreateMockedNoteViewModel(testNote, repository);

            var original = repository.OrderModifiedAt;

            testNote.IsPinned = true; //should be moved to index 0 and refresh OrderModifiedAt

            noteViewModel.OnStoringUnsavedData();

            Assert.IsTrue(repository.OrderModifiedAt != original);
        }
        public void TogglePinned_CalledTwice_DoesNotStoreRepository()
        {
            NoteModel noteToBePinned = new NoteModel {
                Id = new Guid("11111111-1111-1111-1111-111111111111")
            };
            Mock <IRepositoryStorageService> repositoryStorageService = new Mock <IRepositoryStorageService>();
            NoteViewModel noteViewModel = CreateMockedNoteViewModel(noteToBePinned, repositoryStorageService.Object);

            noteViewModel.TogglePinnedCommand.Execute(null);
            noteViewModel.TogglePinnedCommand.Execute(null);
            noteViewModel.OnStoringUnsavedData();

            repositoryStorageService.Verify(m => m.TrySaveRepository(It.IsAny <NoteRepositoryModel>()), Times.Never);
        }
        public void IsPinned_SetToFalse_MovesNotePositionPastLastPinned()
        {
            NoteRepositoryModel repository = CreateTestRepository();

            repository.Notes[0].IsPinned = true;
            repository.Notes[1].IsPinned = true;
            NoteModel     noteToBeUnpinned = repository.Notes[0];
            NoteViewModel noteViewModel    = CreateMockedNoteViewModel(noteToBeUnpinned, repository);

            noteViewModel.IsPinned = false;
            noteViewModel.OnStoringUnsavedData();

            Assert.AreSame(noteToBeUnpinned, repository.Notes[1]); // Now on middle position
            Assert.IsFalse(noteToBeUnpinned.IsPinned);
        }
        public void IsPinned_SetToFalse_WorksWithOnlySingleNote()
        {
            NoteRepositoryModel repository = new NoteRepositoryModel {
                Id = new Guid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")
            };

            repository.Notes.Add(new NoteModel {
                Id = new Guid("11111111-1111-1111-1111-111111111111")
            });

            NoteModel     noteToBeUnpinned = repository.Notes[0];
            NoteViewModel noteViewModel    = CreateMockedNoteViewModel(noteToBeUnpinned, repository);

            noteViewModel.IsPinned = false;
            noteViewModel.OnStoringUnsavedData();

            Assert.AreSame(noteToBeUnpinned, repository.Notes[0]); // Now on last position
        }