Ejemplo n.º 1
0
        public ActionResult Display(string tenant, string surveySlug, SurveyAnswer contentModel)
        {
            var surveyAnswer = this.CallGetSurveyAndCreateSurveyAnswer(tenant, surveySlug);

            if (surveyAnswer == null)
            {
                return this.View(new TenantPageViewData<SurveyAnswer>(surveyAnswer));
            }

            if (surveyAnswer.QuestionAnswers.Count != contentModel.QuestionAnswers.Count)
            {
                throw new ArgumentException("The survey answers received have different amount of questions than the survey to be filled.");
            }

            for (int i = 0; i < surveyAnswer.QuestionAnswers.Count; i++)
            {
                surveyAnswer.QuestionAnswers[i].Answer = contentModel.QuestionAnswers[i].Answer;
            }

            if (!this.ModelState.IsValid)
            {
                var model = new TenantPageViewData<SurveyAnswer>(surveyAnswer);
                model.Title = surveyAnswer.Title;
                return this.View(model);
            }

            this.surveyAnswerStore.SaveSurveyAnswer(surveyAnswer);

            return this.RedirectToAction("ThankYou");
        }
        public void AddNewAnswerCallsMergeWith1AsTotalAnswers()
        {
            var surveyAnswersSummary = new StubSurveyAnswersSummary();
            var surveyAnswer = new SurveyAnswer();

            surveyAnswersSummary.AddNewAnswer(surveyAnswer);

            Assert.AreEqual(1, surveyAnswersSummary.MergeParameter.TotalAnswers);
        }
        public virtual void AddNewAnswer(SurveyAnswer surveyAnswer)
        {
            if (surveyAnswer == null)
            {
                return;
            }

            var newSurveyAnswersSummary = new SurveyAnswersSummary(surveyAnswer.Tenant, surveyAnswer.SlugName)
            {
                TotalAnswers = 1
            };

            foreach (var questionAnswer in surveyAnswer.QuestionAnswers)
            {
                var questionAnswersSummary = new QuestionAnswersSummary
                {
                    QuestionType    = questionAnswer.QuestionType,
                    QuestionText    = questionAnswer.QuestionText,
                    PossibleAnswers = questionAnswer.PossibleAnswers
                };

                newSurveyAnswersSummary.QuestionAnswersSummaries.Add(questionAnswersSummary);

                switch (questionAnswer.QuestionType)
                {
                case QuestionType.SimpleText:
                    var words        = questionAnswer.Answer.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    var wordCounts   = new Dictionary <string, int>();
                    var stemmedWords =
                        words.Where(w => !WordCloudFiltering.IsStopWord(w))
                        .Select(w => Regex.Replace(w, @"[^a-z0-9]", string.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
                        .Where(w => !WordCloudFiltering.IsNumber(w));
                    stemmedWords.GroupBy(w => w, w => w).ToList()
                    .ForEach(g => wordCounts.Add(g.Key, g.Count()));
                    questionAnswersSummary.AnswersSummary = new JavaScriptSerializer().Serialize(wordCounts);
                    break;

                case QuestionType.MultipleChoice:
                    var choiceCounts = new Dictionary <string, int> {
                        { questionAnswer.Answer, 1 }
                    };
                    questionAnswersSummary.AnswersSummary = new JavaScriptSerializer().Serialize(choiceCounts);
                    break;

                case QuestionType.FiveStars:
                    var answer = double.Parse(questionAnswer.Answer);
                    questionAnswersSummary.AnswersSummary = answer.ToString("F", CultureInfo.InvariantCulture);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            this.MergeWith(newSurveyAnswersSummary);
        }
        public virtual void AddNewAnswer(SurveyAnswer surveyAnswer)
        {
            if (surveyAnswer == null)
            {
                return;
            }

            var newSurveyAnswersSummary = new SurveyAnswersSummary(surveyAnswer.Tenant, surveyAnswer.SlugName)
            {
                TotalAnswers = 1
            };

            foreach (var questionAnswer in surveyAnswer.QuestionAnswers)
            {
                var questionAnswersSummary = new QuestionAnswersSummary
                {
                    QuestionType    = questionAnswer.QuestionType,
                    QuestionText    = questionAnswer.QuestionText,
                    PossibleAnswers = questionAnswer.PossibleAnswers
                };

                newSurveyAnswersSummary.QuestionAnswersSummaries.Add(questionAnswersSummary);

                switch (questionAnswer.QuestionType)
                {
                case QuestionType.SimpleText:
                    var wordCounts = new Dictionary <string, int>();
                    GetStemmedWordsGroups(questionAnswer.Answer.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
                    .ToList()
                    .ForEach(g => wordCounts.Add(g.Key, g.Count()));
                    questionAnswersSummary.AnswersSummary = new JavaScriptSerializer().Serialize(wordCounts);
                    break;

                case QuestionType.MultipleChoice:
                    var choiceCounts = new Dictionary <string, int> {
                        { questionAnswer.Answer, 1 }
                    };
                    questionAnswersSummary.AnswersSummary = new JavaScriptSerializer().Serialize(choiceCounts);
                    break;

                case QuestionType.FiveStars:
                    var answer = double.Parse(questionAnswer.Answer);
                    questionAnswersSummary.AnswersSummary = answer.ToString("F", CultureInfo.InvariantCulture);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            this.MergeWith(newSurveyAnswersSummary);
        }
        public void SaveAndDelete()
        {
            var account = CloudConfiguration.GetStorageAccount("DataConnectionString");
            var surveyAnswerStorage = new EntitiesBlobContainer<SurveyAnswer>(account, SurveyAnswersContainer);
            var surveyAnswerId = new Guid("{A0E27D4B-4CD9-43B0-B29E-FE61096A529A}").ToString();
            var expectedSurveyAnswer = new SurveyAnswer { Tenant = "tenant", Title = "title", SlugName = "slugname" };

            surveyAnswerStorage.Save(surveyAnswerId, expectedSurveyAnswer);
            SurveyAnswer savedSurveyAnswer = surveyAnswerStorage.Get(surveyAnswerId);
            Assert.IsNotNull(savedSurveyAnswer);

            surveyAnswerStorage.Delete(surveyAnswerId);
            SurveyAnswer deletedSurveyAnswer = surveyAnswerStorage.Get(surveyAnswerId);
            Assert.IsNull(deletedSurveyAnswer);
        }
        public void AddNew5StarsAnswerCallsMergeWithNewSummary()
        {
            var surveyAnswersSummary = new StubSurveyAnswersSummary();
            var questionAnswer = new QuestionAnswer
            {
                QuestionType = QuestionType.FiveStars,
                QuestionText = "5 stars",
                Answer = "1"
            };
            var surveyAnswer = new SurveyAnswer();
            surveyAnswer.QuestionAnswers.Add(questionAnswer);

            surveyAnswersSummary.AddNewAnswer(surveyAnswer);

            var questionAnswersSummary = surveyAnswersSummary.MergeParameter.QuestionAnswersSummaries.First();
            Assert.AreEqual("5 stars", questionAnswersSummary.QuestionText);
            Assert.AreEqual(QuestionType.FiveStars, questionAnswersSummary.QuestionType);
            Assert.AreEqual("1.00", questionAnswersSummary.AnswersSummary);
        }
        public void AddNewMultipleChoiceAnswerCallsMergeWithNewSummary()
        {
            var surveyAnswersSummary = new StubSurveyAnswersSummary();
            var questionAnswer = new QuestionAnswer
            {
                QuestionType = QuestionType.MultipleChoice,
                QuestionText = "multiple choice",
                Answer = "choice 1",
                PossibleAnswers = "possible answers"
            };
            var surveyAnswer = new SurveyAnswer();
            surveyAnswer.QuestionAnswers.Add(questionAnswer);

            surveyAnswersSummary.AddNewAnswer(surveyAnswer);

            var questionAnswersSummary = surveyAnswersSummary.MergeParameter.QuestionAnswersSummaries.First();
            Assert.AreEqual("multiple choice", questionAnswersSummary.QuestionText);
            Assert.AreEqual("possible answers", questionAnswersSummary.PossibleAnswers);
            Assert.AreEqual(QuestionType.MultipleChoice, questionAnswersSummary.QuestionType);
            var actualSummary = new JavaScriptSerializer().Deserialize<Dictionary<string, int>>(questionAnswersSummary.AnswersSummary);
            Assert.AreEqual(1, actualSummary.Keys.Count);
            Assert.AreEqual(1, actualSummary["choice 1"]);
        }
        public void RunAddsTheSurveyAnswerToTheSummary()
        {
            var mockTenantSurveyProcessingInfo = new Mock<TenantSurveyProcessingInfo>("tenant", "slug-name");
            var mockTenantSurveyProcessingInfoObj = mockTenantSurveyProcessingInfo.Object;
            var mockTenantSurveyProcessingInfoCache = new Mock<IDictionary<string, TenantSurveyProcessingInfo>>();
            var mockSurveyAnswerStore = new Mock<ISurveyAnswerStore>();
            var command = new UpdatingSurveyResultsSummaryCommand(mockTenantSurveyProcessingInfoCache.Object, mockSurveyAnswerStore.Object, new Mock<ISurveyAnswersSummaryStore>().Object);
            mockTenantSurveyProcessingInfoCache.Setup(c => c.ContainsKey("tenant-slug-name")).Returns(true);
            mockTenantSurveyProcessingInfoCache.Setup(c => c["tenant-slug-name"]).Returns(mockTenantSurveyProcessingInfoObj);
            var surveyAnswer = new SurveyAnswer() { Tenant = "tenant", SlugName = "slug-name" };
            mockSurveyAnswerStore.Setup(r => r.GetSurveyAnswer(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Returns(surveyAnswer);
            var message = new SurveyAnswerStoredMessage
            {
                Tenant = "tenant",
                SurveySlugName = "slug-name",
                AppendedToAnswers = true
            };

            command.Run(message);

            Assert.AreEqual(1, mockTenantSurveyProcessingInfoObj.AnswersSummary.TotalAnswers);
        }
        public void SaveAndGet()
        {
            var account = CloudConfiguration.GetStorageAccount("DataConnectionString");
            var surveyAnswerStorage = new EntitiesBlobContainer<SurveyAnswer>(account, SurveyAnswersContainer);
            var surveyAnswerId = new Guid("{DB0298D2-432B-41A7-B80F-7E7A025FA267}").ToString();
            var expectedSurveyAnswer = new SurveyAnswer { Tenant = "tenant", Title = "title", SlugName = "slugname" };
            var question1 = new QuestionAnswer { QuestionText = "text 1", QuestionType = QuestionType.SimpleText, PossibleAnswers = string.Empty };
            var question2 = new QuestionAnswer { QuestionText = "text 2", QuestionType = QuestionType.MultipleChoice, PossibleAnswers = "answer 1\nanswer2" };
            var question3 = new QuestionAnswer { QuestionText = "text 3", QuestionType = QuestionType.FiveStars, PossibleAnswers = string.Empty };
            (expectedSurveyAnswer.QuestionAnswers as List<QuestionAnswer>).AddRange(new[] { question1, question2, question3 });

            surveyAnswerStorage.Save(surveyAnswerId, expectedSurveyAnswer);
            SurveyAnswer actualSurveyAnswer = surveyAnswerStorage.Get(surveyAnswerId);

            Assert.AreEqual(expectedSurveyAnswer.Tenant, actualSurveyAnswer.Tenant);
            Assert.AreEqual(expectedSurveyAnswer.Title, actualSurveyAnswer.Title);
            Assert.AreEqual(expectedSurveyAnswer.SlugName, actualSurveyAnswer.SlugName);
            Assert.AreEqual(3, actualSurveyAnswer.QuestionAnswers.Count);
            var actualQuestionAnswer1 = actualSurveyAnswer.QuestionAnswers.SingleOrDefault(q =>
                q.QuestionText == "text 1" &&
                q.QuestionType == QuestionType.SimpleText &&
                q.PossibleAnswers == string.Empty);
            Assert.IsNotNull(actualQuestionAnswer1);
            var actualQuestionAnswer2 = actualSurveyAnswer.QuestionAnswers.SingleOrDefault(q =>
                q.QuestionText == "text 2" &&
                q.QuestionType == QuestionType.MultipleChoice &&
                q.PossibleAnswers == "answer 1\nanswer2");
            Assert.IsNotNull(actualQuestionAnswer2);
            var actualQuestionAnswer3 = actualSurveyAnswer.QuestionAnswers.SingleOrDefault(q =>
                q.QuestionText == "text 3" &&
                q.QuestionType == QuestionType.FiveStars &&
                q.PossibleAnswers == string.Empty);
            Assert.IsNotNull(actualQuestionAnswer3);
        }
        public void DisplayWhenPostReturnsSurveyTitleAsTitleInTheModelWhenModelIsNotValid()
        {
            var mockSurveyStore = new Mock<ISurveyStore>();
            var survey = new Survey
            {
                Title = "title",
                Questions = new List<Question>(new[] { new Question() })
            };
            mockSurveyStore.Setup(r => r.GetSurveyByTenantAndSlugName(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
                                              .Returns(survey);
            var surveyAnswer = new SurveyAnswer
            {
                QuestionAnswers = new List<QuestionAnswer>(new[] { new QuestionAnswer() })
            };

            using (var controller = new SurveysController(mockSurveyStore.Object, default(ISurveyAnswerStore)))
            {
                controller.ModelState.AddModelError("error for test", "invalid model state");

                var result = controller.Display(string.Empty, string.Empty, surveyAnswer) as ViewResult;

                var model = result.ViewData.Model as TenantMasterPageViewData;
                Assert.AreSame("title", model.Title);
            }
        }
Ejemplo n.º 11
0
        public void SaveSurveyAnswer(SurveyAnswer surveyAnswer)
        {
            var tenant = this.tenantStore.GetTenant(surveyAnswer.Tenant);
            if (tenant != null)
            {
                var surveyAnswerBlobContainer = this.surveyAnswerContainerFactory.Create(surveyAnswer.Tenant, surveyAnswer.SlugName);

                surveyAnswer.CreatedOn = DateTime.UtcNow;
                var blobId = Guid.NewGuid().ToString();
                surveyAnswerBlobContainer.Save(blobId, surveyAnswer);

                (SubscriptionKind.Premium.Equals(tenant.SubscriptionKind)
                    ? this.premiumSurveyAnswerStoredQueue
                    : this.standardSurveyAnswerStoredQueue)
                    .AddMessage(new SurveyAnswerStoredMessage
                    {
                        SurveyAnswerBlobId = blobId,
                        Tenant = surveyAnswer.Tenant,
                        SurveySlugName = surveyAnswer.SlugName
                    });
            }
        }
        public void DisplayWhenPostThrowsIfSaveSurveyAnswersReadFromSurveyStoreHaveDifferentCountToTheSurveyAnswerParameter()
        {
            var surveyWith1Question = new Survey
            {
                Questions = new List<Question>(new[] { new Question() })
            };

            var mockSurveyStore = new Mock<ISurveyStore>();
            mockSurveyStore.Setup(r => r.GetSurveyByTenantAndSlugName(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
                                              .Returns(surveyWith1Question);
            var surveyAnswerWithoutQuestions = new SurveyAnswer();

            using (var controller = new SurveysController(mockSurveyStore.Object, default(ISurveyAnswerStore)))
            {
                controller.Display(string.Empty, string.Empty, surveyAnswerWithoutQuestions);
            }
        }
        public void GetSurveyAnswerReturnsAnswerObtainedFromBlobContainer()
        {
            var mockSurveyAnswerBlobContainer = new Mock<IAzureBlobContainer<SurveyAnswer>>();
            var mockSurveyContainerFactory = new Mock<ISurveyAnswerContainerFactory>();
            var store = new SurveyAnswerStore(
                new Mock<ITenantStore>().Object,
                mockSurveyContainerFactory.Object,
                new Mock<IAzureQueue<SurveyAnswerStoredMessage>>().Object,
                new Mock<IAzureQueue<SurveyAnswerStoredMessage>>().Object,
                new Mock<IAzureBlobContainer<List<string>>>().Object);

            mockSurveyContainerFactory.Setup(f => f.Create(It.IsAny<string>(), It.IsAny<string>()))
                                      .Returns(mockSurveyAnswerBlobContainer.Object);
            var surveyAnswer = new SurveyAnswer();
            mockSurveyAnswerBlobContainer.Setup(c => c.Get(It.IsAny<string>()))
                                         .Returns(surveyAnswer);

            var actualSurveyAnswer = store.GetSurveyAnswer("tenant", "slug-name", string.Empty);

            Assert.AreSame(surveyAnswer, actualSurveyAnswer);
        }
Ejemplo n.º 14
0
        private SurveyAnswer CallGetSurveyAndCreateSurveyAnswer(string tenantName, string surveySlug)
        {
            try
            {
                var survey = this.surveyStore.GetSurveyByTenantAndSlugName(tenantName, surveySlug, true);

                if (survey == null)
                {
                    TraceHelper.TraceInformation("wrong tenant/request pair requested: {0}/{1}", tenantName, surveySlug);
                    return null;
                }

                var surveyAnswer = new SurveyAnswer
                {
                    Title = survey.Title,
                    SlugName = surveySlug,
                    Tenant = tenantName
                };

                foreach (var question in survey.Questions)
                {
                    surveyAnswer.QuestionAnswers.Add(new QuestionAnswer
                    {
                        QuestionText = question.Text,
                        QuestionType = question.Type,
                        PossibleAnswers = question.PossibleAnswers
                    });
                }

                return surveyAnswer;
            }
            catch (Exception ex)
            {
                TraceHelper.TraceWarning(ex.TraceInformation());
                return null;
            }
        }
        public void DisplayWhenPostReturnsModelWithTheAnswersReadFromTheParameterWhenModelIsNotValid()
        {
            var mockSurveyStore = new Mock<ISurveyStore>();
            var survey = new Survey
            {
                Questions = new List<Question>(new[] { new Question() })
            };
            mockSurveyStore.Setup(r => r.GetSurveyByTenantAndSlugName(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
                                              .Returns(survey);
            var surveyAnswer = new SurveyAnswer
            {
                QuestionAnswers = new List<QuestionAnswer>(new[] { new QuestionAnswer { Answer = "answer" } })
            };

            using (var controller = new SurveysController(mockSurveyStore.Object, default(ISurveyAnswerStore)))
            {
                controller.ModelState.AddModelError("error for test", "invalid model state");

                var result = controller.Display(string.Empty, string.Empty, surveyAnswer) as ViewResult;

                var model = result.ViewData.Model as TenantPageViewData<SurveyAnswer>;
                Assert.AreEqual("answer", model.ContentModel.QuestionAnswers.First().Answer);
            }
        }
        public void SaveSurveyAnswerCreatesBlobContainerForGivenTenantAndSurvey()
        {
            var mockTenantStore = new Mock<ITenantStore>();
            var mockSurveyContainerFactory = new Mock<ISurveyAnswerContainerFactory>();
            var store = new SurveyAnswerStore(
                mockTenantStore.Object,
                mockSurveyContainerFactory.Object,
                new Mock<IAzureQueue<SurveyAnswerStoredMessage>>().Object,
                null,
                new Mock<IAzureBlobContainer<List<string>>>().Object);

            mockTenantStore.Setup(t => t.GetTenant("tenant")).Returns(new Tenant());
            mockSurveyContainerFactory.Setup(f => f.Create(It.IsAny<string>(), It.IsAny<string>()))
                                      .Returns(new Mock<IAzureBlobContainer<SurveyAnswer>>().Object);

            var surveyAnswer = new SurveyAnswer { Tenant = "tenant", SlugName = "slug-name" };
            store.SaveSurveyAnswer(surveyAnswer);

            mockTenantStore.Verify(t => t.GetTenant("tenant"));
            mockSurveyContainerFactory.Verify(f => f.Create("tenant", "slug-name"));
        }
        public void SaveSurveyAnswerSavesAnswerInBlobContainer()
        {
            var mockSurveyAnswerBlobContainer = new Mock<IAzureBlobContainer<SurveyAnswer>>();
            var mockTenantStore = new Mock<ITenantStore>();
            var mockSurveyContainerFactory = new Mock<ISurveyAnswerContainerFactory>();
            var store = new SurveyAnswerStore(
                mockTenantStore.Object,
                mockSurveyContainerFactory.Object,
                new Mock<IAzureQueue<SurveyAnswerStoredMessage>>().Object,
                null,
                new Mock<IAzureBlobContainer<List<string>>>().Object);

            mockTenantStore.Setup(t => t.GetTenant(It.IsAny<string>())).Returns(new Tenant());
            mockSurveyContainerFactory.Setup(f => f.Create(It.IsAny<string>(), It.IsAny<string>()))
                                      .Returns(mockSurveyAnswerBlobContainer.Object);

            var surveyAnswer = new SurveyAnswer();
            store.SaveSurveyAnswer(surveyAnswer);

            mockTenantStore.Verify(t => t.GetTenant(It.IsAny<string>()));
            mockSurveyAnswerBlobContainer.Verify(c => c.Save(It.IsAny<string>(), It.Is<SurveyAnswer>(a => a == surveyAnswer)));
        }
        public void BrowseResponsesSetsTheAnswerFromTheStoreInTheModel()
        {
            var mockSurveyAnswerStore = new Mock<ISurveyAnswerStore>();
            var surveyAnswer = new SurveyAnswer();
            mockSurveyAnswerStore.Setup(r => r.GetSurveyAnswerBrowsingContext(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
                                      .Returns(new SurveyAnswerBrowsingContext { PreviousId = string.Empty, NextId = string.Empty });
            mockSurveyAnswerStore.Setup(r => r.GetSurveyAnswer("tenant", "survey-slug", "answer id"))
                                      .Returns(surveyAnswer);

            using (var controller = new SurveysController(null, mockSurveyAnswerStore.Object, null, null, null, null))
            {
                var result = controller.BrowseResponses("tenant", "survey-slug", "answer id") as ViewResult;

                var model = result.ViewData.Model as TenantPageViewData<BrowseResponseModel>;
                Assert.AreSame(surveyAnswer, model.ContentModel.SurveyAnswer);
            }
        }
        public void DisplayWhenPostCallsSaveSurveyAnswerFromSurveyAnswerStoreWithQuestionTypeReadFromTheSurveyWhenModelIsValid()
        {
            var survey = new Survey
            {
                Questions = new List<Question>(
                    new[]
                                     {
                                        new Question { Type = QuestionType.SimpleText },
                                     })
            };

            var mockSurveyStore = new Mock<ISurveyStore>();
            mockSurveyStore.Setup(r => r.GetSurveyByTenantAndSlugName(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
                                              .Returns(survey);
            var mockSurveyAnswerStore = new Mock<ISurveyAnswerStore>();
            var surveyAnswer = new SurveyAnswer
            {
                QuestionAnswers = new List<QuestionAnswer>(new[] { new QuestionAnswer() })
            };

            using (var controller = new SurveysController(mockSurveyStore.Object, mockSurveyAnswerStore.Object))
            {
                controller.Display(string.Empty, string.Empty, surveyAnswer);
            }

            mockSurveyAnswerStore.Verify(
                r => r.SaveSurveyAnswer(
                    It.Is<SurveyAnswer>(sa => QuestionType.SimpleText == sa.QuestionAnswers[0].QuestionType)),
                Times.Once());
        }