public void WhenSummaryRequestOperationisCompleted_ThenUpdatesCurrentSummaryAndStatusChangesToNormal()
        {
            var questionnaireRepositoryMock = new Mock<IQuestionnaireRepository>();

            Action<IOperationResult<QuestionnaireTemplateSummary>> summaryCallback = null;
            var summary = new QuestionnaireTemplateSummary();
            questionnaireRepositoryMock
                .Setup(qs => qs.GetQuestionnaireTemplateSummaryAsync(It.IsAny<QuestionnaireTemplate>(), It.IsAny<Action<IOperationResult<QuestionnaireTemplateSummary>>>()))
                .Callback<QuestionnaireTemplate, Action<IOperationResult<QuestionnaireTemplateSummary>>>((qt, ac) => summaryCallback = ac);

            var viewModel = new QuestionnaireTemplateSummaryViewModel(questionnaireRepositoryMock.Object);

            viewModel.CurrentlySelectedQuestionnaireTemplate = new QuestionnaireTemplate();

            var summaryResult = new Mock<IOperationResult<QuestionnaireTemplateSummary>>();
            summaryResult.SetupGet(r => r.Result).Returns(summary);

            var tracker = new PropertyChangeTracker(viewModel);
            summaryCallback(summaryResult.Object);

            Assert.AreEqual("Normal", viewModel.CurrentState);
            Assert.AreSame(summary, viewModel.QuestionnaireTemplateSummary);
            CollectionAssert.Contains(tracker.ChangedProperties, "CurrentState");
            CollectionAssert.Contains(tracker.ChangedProperties, "QuestionnaireTemplateSummary");
        }
        public void WhenViewModelIsCreated_ThenItHasNoSummaryOrSelectedTemplate()
        {
            var questionnaireRepositoryMock = new Mock<IQuestionnaireRepository>();

            var viewModel = new QuestionnaireTemplateSummaryViewModel(questionnaireRepositoryMock.Object);

            Assert.IsNull(viewModel.CurrentlySelectedQuestionnaireTemplate);
            Assert.IsNull(viewModel.QuestionnaireTemplateSummary);
        }
        public void WhenSelectedTemplateIsSetToNull_ThenSummaryIsCleared()
        {
            var questionnaireRepositoryMock = new Mock<IQuestionnaireRepository>(MockBehavior.Strict);

            var viewModel = new QuestionnaireTemplateSummaryViewModel(questionnaireRepositoryMock.Object);

            viewModel.CurrentlySelectedQuestionnaireTemplate = null;

            Assert.IsNull(viewModel.QuestionnaireTemplateSummary);
            Assert.AreEqual("Normal", viewModel.CurrentState);
            questionnaireRepositoryMock.VerifyAll();
        }
        public void WhenSelectedTemplateIsSetToNonNull_ThenSummaryIsRequestedAndStatusChangesToUpdatingSummary()
        {
            var questionnaireRepositoryMock = new Mock<IQuestionnaireRepository>();
            var requestedSummary = false;
            questionnaireRepositoryMock
                .Setup(qs => qs.GetQuestionnaireTemplateSummaryAsync(It.IsAny<QuestionnaireTemplate>(), It.IsAny<Action<IOperationResult<QuestionnaireTemplateSummary>>>()))
                .Callback<QuestionnaireTemplate, Action<IOperationResult<QuestionnaireTemplateSummary>>>((qt, ac) => { requestedSummary = true; });

            var viewModel = new QuestionnaireTemplateSummaryViewModel(questionnaireRepositoryMock.Object);

            var tracker = new PropertyChangeTracker(viewModel);
            viewModel.CurrentlySelectedQuestionnaireTemplate = new QuestionnaireTemplate();

            Assert.IsTrue(requestedSummary);
            Assert.IsNull(viewModel.QuestionnaireTemplateSummary);
            Assert.AreEqual("RequestingSummary", viewModel.CurrentState);
            CollectionAssert.Contains(tracker.ChangedProperties, "CurrentState");
        }
        public void WhenCurrentlySelectedTemplateChangesToNullBeforePreviousSummaryRequestOperationisCompleted_ThenStatusIsSetToNormalAndOriginalRequestOperationCompletionDoesNotCauseAnUpdate()
        {
            var questionnaireRepositoryMock = new Mock<IQuestionnaireRepository>();

            Action<IOperationResult<QuestionnaireTemplateSummary>> summaryCallback = null;
            var summary = new QuestionnaireTemplateSummary();
            questionnaireRepositoryMock
                .Setup(qs => qs.GetQuestionnaireTemplateSummaryAsync(It.IsAny<QuestionnaireTemplate>(), It.IsAny<Action<IOperationResult<QuestionnaireTemplateSummary>>>()))
                .Callback<QuestionnaireTemplate, Action<IOperationResult<QuestionnaireTemplateSummary>>>((qt, ac) => summaryCallback = ac);

            var viewModel = new QuestionnaireTemplateSummaryViewModel(questionnaireRepositoryMock.Object);

            viewModel.CurrentlySelectedQuestionnaireTemplate = new QuestionnaireTemplate();

            var originalSummaryCallback = summaryCallback;

            var summaryResult = new Mock<IOperationResult<QuestionnaireTemplateSummary>>();
            summaryResult.SetupGet(r => r.Result).Returns(summary);

            viewModel.CurrentlySelectedQuestionnaireTemplate = null;

            Assert.AreEqual("Normal", viewModel.CurrentState);
            Assert.IsNull(viewModel.QuestionnaireTemplateSummary);

            originalSummaryCallback(summaryResult.Object);

            Assert.AreEqual("Normal", viewModel.CurrentState);
            Assert.IsNull(viewModel.QuestionnaireTemplateSummary);
        }