public void RecreateStorageCommandSubscibesRecreateStorage()
        {
            var term = new Term("term4", "def 4");

            // Create service mock that allows to load terms, prevents
            // adding a term, and verifies recreation attempt.

            var observable = new Mock <IObservable <Unit> >();

            observable.Setup(o => o.Subscribe(It.IsAny <IObserver <Unit> >())).Verifiable();

            var service = this._termsServiceMock;

            service
            .Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new InvalidTermsStorageException("Invalid")));
            service
            .Setup(s => s.RecreateStorage(
                       It.Is <IEnumerable <Term> >(terms => !TermListViewModelFixture.SampleTerms.Except(terms).Any()),
                       ThreadPoolScheduler.Instance))
            .Returns(() => observable.Object);

            // Create view model to test invokation on RecreateStorage.

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            listModel.RecreateStorage.Execute(null);

            observable.Verify();
        }
        public void ModelNotifiesWhenRecreateStorageFailed()
        {
            var term = new Term("term4", "def 4");

            var service = new Mock <ITermsService>();

            service
            .Setup(s => s.LoadTerms(ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <IEnumerable <Term> >(new InvalidTermsStorageException("Invalid")));
            service
            .Setup(s => s.RecreateStorage(It.Is <IEnumerable <Term> >(terms => !terms.Any()), ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Unit>(new InvalidTermsStorageException("Invalid")));

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));

            listModel.RecreateStorage.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsNotNull(listModel.Notification);
            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));
        }
        public void ModelNotifiesAndStaysInEditModeWhenAcceptEditFailed()
        {
            var oldTerm = TermListViewModelFixture.SampleTerms[0];
            var newTerm = new Term("term4", "def 4");

            var msg = "Failed";

            var service = this._termsServiceMock;

            service
            .Setup(s => s.UpdateTerm(oldTerm, newTerm, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new Exception(msg)));

            var editModel = TermListViewModelFixture.MockEditModel(newTerm);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(oldTerm);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.Terms.Cast <Term>().Contains(oldTerm));
            Assert.IsFalse(listModel.Terms.Cast <Term>().Contains(newTerm));

            Assert.AreEqual(msg, listModel.Notification);
            Assert.IsTrue(listModel.IsEditMode);
        }
        public void AcceptCommandShouldRefreshCommandState()
        {
            var oldTerm = TermListViewModelFixture.SampleTerms[0];
            var newTerm = new Term("term4", "def 4");

            var service = this._termsServiceMock;

            service
            .Setup(s => s.UpdateTerm(oldTerm, newTerm, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Return(newTerm));

            var editModel = TermListViewModelFixture.MockEditModel(newTerm);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.EditTerm.Execute(oldTerm);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.AddTerm.CanExecute(null));
            Assert.IsTrue(listModel.EditTerm.CanExecute(newTerm));
            Assert.IsFalse(listModel.DeleteTerm.CanExecute(null));
            Assert.IsFalse(listModel.Accept.CanExecute(null));
            Assert.IsFalse(listModel.Cancel.CanExecute(null));
        }
        public void AcceptAddCommandShowsNewTerm()
        {
            var term = new Term("term4", "def 4");

            var service = this._termsServiceMock;

            service.Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance)).Returns(() => Observable.Return(term));

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.Terms.Cast <Term>().Contains(term));
            Assert.IsFalse(listModel.IsEditMode);
        }
        public void AcceptAddCommandSubscibesAddTerm()
        {
            var term = new Term("term4", "def 4");

            var observable = new Mock <IObservable <Term> >();

            observable.Setup(o => o.Subscribe(It.IsAny <IObserver <Term> >())).Verifiable();

            var service = this._termsServiceMock;

            service.Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance)).Returns(() => observable.Object);

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);
            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            observable.Verify();
        }
        public void AcceptAddCommandEnablesRecreateStorageForInvalidStorage()
        {
            var term = new Term("term4", "def 4");

            var service = this._termsServiceMock;

            service
            .Setup(s => s.AddTerm(term, ThreadPoolScheduler.Instance))
            .Returns(() => Observable.Throw <Term>(new InvalidTermsStorageException("Invalid")));

            var editModel = TermListViewModelFixture.MockEditModel(term);
            var listModel = TermListViewModelFixture.CreateViewModelLoaded(service.Object, editModel);

            listModel.AddTerm.Execute(null);

            Assert.IsFalse(listModel.RecreateStorage.CanExecute(null));

            listModel.Accept.Execute(null);

            DispatcherHelper.ProcessCurrentQueue();

            Assert.IsTrue(listModel.RecreateStorage.CanExecute(null));
        }