public void AfterSubmittingQuestionnaire_ThenChangeDataRelatedNotificationsAreFired()
        {
            Action<IOperationResult<Questionnaire>> callback = null;
            Action<IOperationResult> submitCallback = null;

            var repository = new Mock<IQuestionnaireRepository>();
            repository.Setup(r => r.GetQuestionnaireAsync(It.IsAny<Action<IOperationResult<Questionnaire>>>()))
                .Callback<Action<IOperationResult<Questionnaire>>>(c => callback = c);
            repository.Setup(r => r.SubmitQuestionnaireAsync(It.IsAny<Questionnaire>(), It.IsAny<Action<IOperationResult>>()))
                .Callback<Questionnaire, Action<IOperationResult>>(
                (q, sc) => submitCallback = sc);

            var viewModel = new QuestionnaireViewModel(repository.Object);

            callback(CreateQuestionnaireResult());

            var tracker = new PropertyChangeTracker(viewModel);
            viewModel.Questionnaire.Name = "TestName";
            viewModel.Questionnaire.Age = 25;
            AnswerAllQuestions(viewModel);

            viewModel.Submit();
            submitCallback(new Mock<IOperationResult>().Object);
            callback(CreateQuestionnaireResult());

            Assert.IsTrue(tracker.ChangedProperties.Contains("Questionnaire"));
        }
        public void WhenServiceIsDoneSubmitting_ThenStateIsSetToNormal()
        {
            Action<IOperationResult<Questionnaire>> callback = null;
            Action<IOperationResult> submitCallback = null;

            var repository = new Mock<IQuestionnaireRepository>();
            repository.Setup(r => r.GetQuestionnaireAsync(It.IsAny<Action<IOperationResult<Questionnaire>>>()))
                .Callback<Action<IOperationResult<Questionnaire>>>(c => callback = c);
            repository.Setup(r => r.SubmitQuestionnaireAsync(It.IsAny<Questionnaire>(), It.IsAny<Action<IOperationResult>>()))
                .Callback<Questionnaire, Action<IOperationResult>>(
                (q, sc) => submitCallback = sc);

            var viewModel = new QuestionnaireViewModel(repository.Object);

            callback(CreateQuestionnaireResult());

            viewModel.Submit();
            Assert.AreEqual("Submitting", viewModel.CurrentState);

            var tracker = new PropertyChangeTracker(viewModel);

            // Responds as the service would.
            submitCallback(new Mock<IOperationResult>().Object);
            callback(CreateQuestionnaireResult());

            Assert.AreEqual("Normal", viewModel.CurrentState);
            CollectionAssert.Contains(tracker.ChangedProperties, "CanSubmit");
        }
        public void AfterSubmitting_ANewQuestionnaireIsCreated()
        {
            QuestionViewModel[] originalQuestions = null;
            Action<IOperationResult<Questionnaire>> callback = null;
            Action<IOperationResult> submitCallback = null;

            var repository = new Mock<IQuestionnaireRepository>();
            repository.Setup(r => r.GetQuestionnaireAsync(It.IsAny<Action<IOperationResult<Questionnaire>>>()))
                .Callback<Action<IOperationResult<Questionnaire>>>(c => callback = c);
            repository.Setup(r => r.SubmitQuestionnaireAsync(It.IsAny<Questionnaire>(), It.IsAny<Action<IOperationResult>>()))
                .Callback<Questionnaire, Action<IOperationResult>>(
                (q, sc) => submitCallback = sc);

            var viewModel = new QuestionnaireViewModel(repository.Object);

            callback(CreateQuestionnaireResult());

            originalQuestions = viewModel.Questions.ToArray();

            viewModel.Questionnaire.Name = "TestName";
            viewModel.Questionnaire.Age = 14;
            AnswerAllQuestions(viewModel);

            viewModel.Submit();
            submitCallback(new Mock<IOperationResult>().Object);
            callback(CreateQuestionnaireResult());

            CollectionAssert.AreNotEquivalent(originalQuestions, viewModel.Questions.ToArray());
        }
        public void WhenQuestionnaireIsSubmitted_ThenSubmitsToService()
        {
            Action<IOperationResult<Questionnaire>> callback = null;

            var repository = new Mock<IQuestionnaireRepository>();
            repository.Setup(r => r.GetQuestionnaireAsync(It.IsAny<Action<IOperationResult<Questionnaire>>>()))
                .Callback<Action<IOperationResult<Questionnaire>>>(c => callback = c);

            repository.Setup(r => r.SubmitQuestionnaireAsync(It.IsAny<Questionnaire>(), It.IsAny<Action<IOperationResult>>()))
                .Verifiable("SubmitQuestionnaireAsync not called");

            var viewModel = new QuestionnaireViewModel(repository.Object);

            callback(CreateQuestionnaireResult());

            viewModel.Questionnaire.Name = "Name";
            viewModel.Questionnaire.Age = 21;
            AnswerAllQuestions(viewModel);
            viewModel.Submit();

            repository.Verify();
        }