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); }
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 }); }
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)); }
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) }); }
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); }
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); }
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); }
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); }