Beispiel #1
0
        public void GetTestResult_UserHasSentAnswers_ValidResult()
        {
            //arrange
            var dateTimeProdiver = new Mock <IDateTimeProvider>();
            var utcNow           = new DateTime(2020, 9, 5, 14, 8, 58, 0, DateTimeKind.Utc);

            dateTimeProdiver.Setup(x => x.UtcNow).Returns(utcNow);
            int userId        = 2;
            var scheduledTest = new ScheduledTest(1, utcNow.AddDays(-2), utcNow.AddMinutes(-60), utcNow.AddMinutes(-30), 10, new int[] { userId, 3, 4 });
            var userTest      = new UserTest(2, 0);

            userTest.SetStartDate(utcNow.AddMinutes(-50));
            userTest.SetEndDate(utcNow.AddMinutes(-40));
            var   testAnswers = new TestAnswers(scheduledTest, userTest, "UserName", dateTimeProdiver.Object);
            float maxScore    = 3f;
            int   questionId  = 1;

            testAnswers.AddAnswerPair(new WrittenUserAnswer("value", 0, questionId, userId), new WrittenAnswer(questionId, "value", maxScore));
            questionId = 2;
            testAnswers.AddAnswerPair(new WrittenUserAnswer("value2", 0, questionId, userId), new WrittenAnswer(questionId, "value2", maxScore));
            var expectedUserTestResult = new UserTestResult("UserName", 6f, userId, TestStatus.Completed);

            //act
            UserTestResult result = testAnswers.GetTestResult();

            //assert
            result.Should().BeEquivalentTo(expectedUserTestResult);
        }
Beispiel #2
0
 public Dtos.Test.TestHeaderDto MapToTestHeaderDto(ScheduledTest scheduledTest)
 {
     return(new Dtos.Test.TestHeaderDto
     {
         Id = scheduledTest.Id,
         Name = scheduledTest.TestTemplate.Name,
         StartsAt = scheduledTest.StartDate,
         EndsAt = scheduledTest.EndDate
     });
 }
Beispiel #3
0
        private bool CanGetTest(ScheduledTest test, UserTest userTest)
        {
            var currentDate = dateTimeProvider.UtcNow;

            if (!userTest.StartDate.HasValue)
            {
                return(currentDate >= test.StartDate && currentDate <= test.EndDate);
            }

            return(currentDate >= userTest.StartDate && currentDate <= userTest.StartDate.Value.AddMinutes(test.Duration));
        }
Beispiel #4
0
 public ScheduledTestDto MapToScheduledTestDto(ScheduledTest scheduledTest)
 {
     return(new ScheduledTestDto
     {
         Id = scheduledTest.Id,
         Duration = scheduledTest.Duration,
         Name = scheduledTest.TestTemplate.Name,
         StartDate = scheduledTest.StartDate,
         EndDate = scheduledTest.EndDate,
         ScheduledAt = scheduledTest.PublishedAt,
         TestTemplateId = scheduledTest.TestTemplateId,
         Ended = scheduledTest.HasTestComeToEnd(dateTimeProvider)
     });
 }
Beispiel #5
0
        public void GetTestResult_UserHasBeenWritingTestFor2Minutes_ValidResult()
        {
            //arrange
            var dateTimeProdiver = new Mock <IDateTimeProvider>();
            var utcNow           = new DateTime(2020, 9, 5, 14, 8, 58, 0, DateTimeKind.Utc);

            dateTimeProdiver.Setup(x => x.UtcNow).Returns(utcNow);
            int userId        = 2;
            var scheduledTest = new ScheduledTest(1, utcNow.AddDays(-2), utcNow.AddMinutes(-5), utcNow.AddMinutes(10), 10, new int[] { userId, 3, 4 });
            var userTest      = new UserTest(2, 0);

            userTest.SetStartDate(utcNow.AddMinutes(-2));
            var testAnswers            = new TestAnswers(scheduledTest, userTest, "UserName", dateTimeProdiver.Object);
            var expectedUserTestResult = new UserTestResult("UserName", null, userId, TestStatus.IsInProcess);

            //act
            UserTestResult result = testAnswers.GetTestResult();

            //assert
            result.Should().BeEquivalentTo(expectedUserTestResult);
        }
Beispiel #6
0
        public async Task TeacherShouldGetTestResults()
        {
            ScheduledTest scheduledTest     = controllerFixture.ScheduledTest;
            float         maxScore          = controllerFixture.TestMaxScore;
            string        testName          = controllerFixture.TestTemplate.Name;
            var           studentIdUsername = fixture.OrganizationOwnerMembers[fixture.UserId]
                                              .Where(x => scheduledTest.UserTests.Any(y => y.UserId == x.Id))
                                              .ToDictionary(x => x.Id, x => x.UserName);

            List <UserTestResultDto> results = controllerFixture.StudentIdTestScore.Select(
                x => new UserTestResultDto
            {
                UserId    = x.Key,
                UserScore = x.Value,
                Status    = TestStatus.Completed.ToString(),
                Username  = studentIdUsername[x.Key]
            }).ToList();

            var expectedDto = new GroupResultsDto
            {
                MaxTestScore = maxScore,
                Ended        = true,
                TestId       = scheduledTest.Id,
                TestName     = testName,
                Results      = results
            };

            var response = await fixture.RequestSender.GetAsync($"tests/{scheduledTest.Id}/results");

            response.StatusCode.Should().Be(HttpStatusCode.OK);
            var responseData = await response.Content.ReadAsStringAsync();

            var result = fixture.Deserialize <GroupResultsDto>(responseData);

            result.Should().BeEquivalentTo(expectedDto);
        }
Beispiel #7
0
        public async Task <OperationResult <Unit> > ScheduleTest(int testId, DateTime startDate, DateTime endDate, int durationInMinutes, IList <UserInfo> students)
        {
            var utcNow = dateTimeProvider.UtcNow;

            if (startDate <= utcNow || startDate >= endDate)
            {
                return(new BadRequestError());
            }

            var testTemplate = await dbContext.TestTemplates.FirstOrDefaultAsync(x => x.Id == testId);

            if (testTemplate == null)
            {
                return(new BadRequestError());
            }

            if (userContext.UserId != testTemplate.AuthorId)
            {
                return(new AuthorizationError());
            }

            var numberOfQuestions = await dbContext.TestItems.Where(x => x.TestTemplateId == testId).CountAsync();

            if (numberOfQuestions == 0)
            {
                return(new BadRequestError("Cannot publish test without questions"));
            }

            IEnumerable <int> studentsIds = students.Select(x => x.Id);
            var test = new ScheduledTest(testTemplate.Id, utcNow, startDate, endDate, durationInMinutes, studentsIds);

            dbContext.ScheduledTests.Add(test);
            await dbContext.SaveChangesAsync();

            return(OperationResult.Ok);
        }
Beispiel #8
0
        private async Task AddPublishedTestWithAnswers()
        {
            var questionWithSingleValidChoice = Questions[0];
            var questionWith3ValidChoices     = Questions[1];
            var questionWithWrittenAnswer     = Questions[2];
            var testTemplateQuestions         = new Dictionary <int, Question>
            {
                [questionWithSingleValidChoice.Id] = questionWithSingleValidChoice,
                [questionWith3ValidChoices.Id]     = questionWith3ValidChoices,
                [questionWithWrittenAnswer.Id]     = questionWithWrittenAnswer
            };

            var student1 = fixture.OrganizationOwnerMembers[fixture.UserId][0];
            var student2 = fixture.OrganizationOwnerMembers[fixture.UserId][1];

            var testPublishDate           = new DateTime(2021, 1, 7, 6, 0, 0, DateTimeKind.Utc);
            var startDate                 = testPublishDate.AddDays(1);
            var endDate                   = startDate.AddHours(3);
            var durationInMinutes         = 30;
            IEnumerable <int> studentsIds = new List <int> {
                student1.Id, student2.Id
            };

            ScheduledTest = new ScheduledTest(TestTemplate.Id, testPublishDate, startDate, endDate, durationInMinutes, studentsIds);
            var userTestStartDate = startDate.AddMinutes(10);

            foreach (var userTest in ScheduledTest.UserTests)
            {
                userTest.SetStartDate(userTestStartDate);
                userTest.SetEndDate(userTestStartDate.AddMinutes(5));
            }

            await fixture.ExecuteDbContext(db =>
            {
                db.ScheduledTests.Add(ScheduledTest);
                return(db.SaveChangesAsync());
            });

            int scheduledTestId = ScheduledTest.Id;

            //student1:
            UserAnswers.Add(
                UserAnswerGenerator.GenerateValidAnswer(questionWithSingleValidChoice, scheduledTestId, student1.Id));
            UserAnswers.Add(
                UserAnswerGenerator.GenerateValidAnswer(questionWith3ValidChoices, scheduledTestId, student1.Id));
            UserAnswers.Add(
                UserAnswerGenerator.GenerateValidAnswer(questionWithWrittenAnswer, scheduledTestId, student1.Id));

            //student2:
            UserAnswers.Add(
                UserAnswerGenerator.GenerateInvalidAnswer(questionWithSingleValidChoice, scheduledTestId, student2.Id));
            UserAnswers.Add(
                UserAnswerGenerator.GenerateUserAnswerWithNValidChoices(questionWith3ValidChoices, 1, scheduledTestId, student2.Id));
            UserAnswers.Add(
                UserAnswerGenerator.GenerateInvalidAnswer(questionWithWrittenAnswer, scheduledTestId, student2.Id));

            await fixture.ExecuteDbContext(db =>
            {
                db.UserAnswers.AddRange(UserAnswers);
                return(db.SaveChangesAsync());
            });

            foreach (var userTest in ScheduledTest.UserTests)
            {
                float studentScore = 0f;
                foreach (var studentAnswer in UserAnswers.Where(x => x.UserId == userTest.UserId))
                {
                    var   question      = testTemplateQuestions[studentAnswer.QuestionId];
                    float questionScore = question.Answer.GetScore(studentAnswer);
                    studentScore += questionScore;
                }
                StudentIdTestScore.Add(userTest.UserId, studentScore);
            }

            TestMaxScore = testTemplateQuestions.Values.Select(x => x.Answer.MaxScore).Aggregate((x, y) => x + y);
        }