Untitled

 avatar
unknown
plain_text
2 years ago
8.7 kB
2
Indexable
package pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.service


import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.domain.TeacherDashboard
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.boot.test.context.TestConfiguration
import pt.ulisboa.tecnico.socialsoftware.tutor.BeanConfiguration;
import pt.ulisboa.tecnico.socialsoftware.tutor.SpockTest
import pt.ulisboa.tecnico.socialsoftware.tutor.user.domain.Teacher
import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.domain.QuestionStats;
import pt.ulisboa.tecnico.socialsoftware.tutor.quiz.domain.Quiz
import pt.ulisboa.tecnico.socialsoftware.tutor.user.domain.Student
import pt.ulisboa.tecnico.socialsoftware.tutor.question.domain.Question
import pt.ulisboa.tecnico.socialsoftware.tutor.quiz.domain.QuizQuestion
import pt.ulisboa.tecnico.socialsoftware.tutor.answer.domain.QuestionAnswer
import pt.ulisboa.tecnico.socialsoftware.tutor.answer.domain.QuizAnswer
import pt.ulisboa.tecnico.socialsoftware.tutor.auth.domain.AuthUser
import pt.ulisboa.tecnico.socialsoftware.tutor.question.domain.MultipleChoiceQuestion
import pt.ulisboa.tecnico.socialsoftware.tutor.answer.domain.MultipleChoiceAnswer
import pt.ulisboa.tecnico.socialsoftware.tutor.question.domain.Option
import pt.ulisboa.tecnico.socialsoftware.tutor.utils.DateHandler

@DataJpaTest
class UpdateAllTeacherDashboardsTest extends SpockTest {
    def teacher
    def teacher2
    def teacher3
    def teacher4
    def teacherdashboard1
    def teacherdashboard2
    def teacherdashboard3
    def questionStats1
    def questionStats2
    def questionStats3

    def setup() {
        createExternalCourseAndExecution()

        teacher = new Teacher(USER_1_NAME, false)
        teacher.addCourse(externalCourseExecution)
        userRepository.save(teacher)

        teacher2 = new Teacher(USER_2_NAME, false)
        teacher2.addCourse(externalCourseExecution)
        userRepository.save(teacher2)

        teacher3 = new Teacher(USER_3_NAME, false)
        teacher3.addCourse(externalCourseExecution)
        userRepository.save(teacher3)

        teacher4 = new Teacher(USER_1_NAME, false)
        teacher4.addCourse(externalCourseExecution)
        userRepository.save(teacher4)

        teacherdashboard1 = new TeacherDashboard(externalCourseExecution, teacher)
        teacherDashboardRepository.save(teacherdashboard1)

        teacherdashboard2 = new TeacherDashboard(externalCourseExecution, teacher2)
        teacherDashboardRepository.save(teacherdashboard2)

        teacherdashboard3 = new TeacherDashboard(externalCourseExecution, teacher3)
        teacherDashboardRepository.save(teacherdashboard3)

        questionStats1 = new QuestionStats(teacherdashboard1, externalCourseExecution)
        questionStatsRepository.save(questionStats1)

        questionStats2 = new QuestionStats(teacherdashboard2, externalCourseExecution)
        questionStatsRepository.save(questionStats2)

        questionStats3 = new QuestionStats(teacherdashboard3, externalCourseExecution)
        questionStatsRepository.save(questionStats3)
    }


    def createQuiz() {
        def quiz = new Quiz()
        quiz.setKey(1)
        quiz.setTitle("Quiz Title")
        quiz.setType(Quiz.QuizType.PROPOSED.toString())
        quiz.setCourseExecution(externalCourseExecution)
        quiz.setAvailableDate(DateHandler.now())
        quizRepository.save(quiz)
    }

    def createQuizQuestion(quiz, question, seq) {
        def quizQuestion = new QuizQuestion(quiz, question, seq)
        quizQuestionRepository.save(quizQuestion)
    }

    def createStudent(name, user, mail) {
        def student = new Student(name, user, mail, false, AuthUser.Type.TECNICO)
        student.addCourse(externalCourseExecution)
        userRepository.save(student)
    }

    def createQuestion(key, available=true) {
        def question = new Question()
        question.setTitle("Question Title")
        question.setCourse(externalCourse)
        if(available == true){
            question.setStatus(Question.Status.AVAILABLE)
        }
        else{
            question.setStatus(Question.Status.SUBMITTED)
        }
        question.setKey(key)
        def questionDetails = new MultipleChoiceQuestion()
        question.setQuestionDetails(questionDetails)
        questionRepository.save(question)

        def option = new Option()
        option.setContent("Option Content")
        option.setCorrect(true)
        option.setSequence(0)
        option.setQuestionDetails(questionDetails)
        optionRepository.save(option)
        def optionKO = new Option()
        optionKO.setContent("Option Content")
        optionKO.setCorrect(false)
        optionKO.setSequence(1)
        optionKO.setQuestionDetails(questionDetails)
        optionRepository.save(optionKO)

        return question;
    }

    def createQuizAnswer (user, quiz, date = DateHandler.now()) {
        def quizAnswer = new QuizAnswer()
        quizAnswer.setCompleted(true)
        quizAnswer.setCreationDate(date)
        quizAnswer.setAnswerDate(date)
        quizAnswer.setStudent(user)
        quizAnswer.setQuiz(quiz)
        quizAnswerRepository.save(quizAnswer)
    }

    def createQuestionAnswer (quizQuestion, quizAnswer, sequence, correct, answered = true) {
        def questionAnswer = new QuestionAnswer()
        questionAnswer.setTimeTaken(1)
        questionAnswer.setQuizAnswer(quizAnswer)
        questionAnswer.setQuizQuestion(quizQuestion)
        questionAnswer.setSequence(sequence)
        questionAnswerRepository.save(questionAnswer)

        def answerDetails
        def correctOption = quizQuestion.getQuestion().getQuestionDetails().getCorrectOption()
        def incorrectOption = quizQuestion.getQuestion().getQuestionDetails().getOptions().stream().filter(option -> option != correctOption).findAny().orElse(null)
        if (answered && correct) answerDetails = new MultipleChoiceAnswer(questionAnswer, correctOption)
        else if (answered && !correct) answerDetails = new MultipleChoiceAnswer(questionAnswer, incorrectOption)
        else {
            questionAnswerRepository.save(questionAnswer)
            return questionAnswer
        }
        questionAnswer.setAnswerDetails(answerDetails)
        answerDetailsRepository.save(answerDetails)
        return questionAnswer
    }

    def "test stats of an updated and empty dashboard"() {
        given: "a dashboard"
        when: "the user update the dashboard"
        teacherDashboardService.updateAllTeacherDashboards()

        then: "the dashboard is updated"
        questionStatsRepository.count() == 4L
        teacherdashboard1.getQuestionStats().size() == 1
    }

    def "update 3 teacherDashboard with the same courseExecution"() {
        given: "two students"
        def s1 = createStudent(USER_1_NAME, USER_1_USERNAME, USER_1_EMAIL)
        def s2 = createStudent(USER_2_NAME, USER_2_USERNAME, USER_2_EMAIL)

        and: "three questions"
        def q1 = createQuestion(1)
        def q2 = createQuestion(2)
        def q3 = createQuestion(3)

        and: "a submitted question"
        def q4 = createQuestion(4, false)

        and: "a quiz"
        def quiz = createQuiz()
        def qq1 = createQuizQuestion(quiz, q1, 0)
        def qq2 = createQuizQuestion(quiz, q2, 1)
        def qq3 = createQuizQuestion(quiz, q3, 2)

        and: "question stats"

        and: "students answer questions"
        def quizAs1 = createQuizAnswer(s1, quiz)
        def quizAs2 = createQuizAnswer(s2, quiz)
        createQuestionAnswer(qq1, quizAs1, 0, true)
        createQuestionAnswer(qq2, quizAs1, 1, false)
        createQuestionAnswer(qq2, quizAs2, 0, true)

        when: "the stats are updates"
        teacherDashboardService.updateAllTeacherDashboards()

        then: "the stats are correct"
        questionStats1.getAnsweredQuestionsUnique() == 2
        questionStats1.getAverageQuestionsAnswered() == (float) 3 / 2
        questionStats1.getNumAvailable() == 3
        questionStats2.getAnsweredQuestionsUnique() == 2
        questionStats2.getAverageQuestionsAnswered() == (float) 3 / 2
        questionStats2.getNumAvailable() == 3
        questionStats3.getAnsweredQuestionsUnique() == 2
        questionStats3.getAverageQuestionsAnswered() == (float) 3 / 2
        questionStats3.getNumAvailable() == 3

    }

    @TestConfiguration
    static class LocalBeanConfiguration extends BeanConfiguration {}
}
Editor is loading...