def setUp(self):
        self.tutor_category = TutorCategory.objects.create(name='Categoria 1',
                                                           id=1)
        # datos usuario student
        self.user_password = "******"
        self.user_email = '*****@*****.**'

        # datos usuario tutor
        self.user_tutor_password = "******"
        self.user_tutor_email = "*****@*****.**"

        # subject
        self.subject = Subject.objects.create(name=u'Matematicas')

        # usuario
        self.user = User.objects.create_user(
            username=self.user_email, email=self.user_email,
            password=self.user_password, first_name='Jonathan',
            last_name='Diaz')
        self.student = Student.objects.create(user=self.user)

        # tutor
        self.user_tutor = User.objects.create_user(
            username=self.user_tutor_email,
            email=self.user_tutor_email, password=self.user_tutor_password,
            first_name='Jonathan', last_name='Diaz')
        self.tutor = Tutor.objects.create(user=self.user_tutor, id=1555,
                                          category=self.tutor_category)
        self.tutor.profile = 'Un texto para el perfil'
        self.tutor.save()

        # create group
        self.course1 = Course(
            name='primer curso',
            description='Este es el primer curso de pruebas',
            subject=self.subject,
            tutor=self.tutor)
        self.course1.save()

        self.course2 = Course(
            name='segundo curso',
            description='Este es el segundo curso curso de pruebas',
            subject=self.subject,
            tutor=self.tutor)
        self.course2.save()

        # create calendar class
        date = datetime.now()
        start_time = date.time()
        end_time = (date + timedelta(hours=1)).time()
        self.calendar1 = CourseClassCalendar(
            date=date.date(), start_time=start_time, end_time=end_time)
        self.calendar1.save()

        # create CourseClass
        self.classe1 = CourseClass(
            name='Primera clase', description='Esta es la primera clase')
        self.classe1.save()
        self.classe1.calendar.add(self.calendar1)
        self.classe1.save()

        self.classe2 = CourseClass(
            name='Segunda clase', description='Esta es la segunda clase')
        self.classe2.save()
        self.classe2.calendar.add(self.calendar1)
        self.classe2.save()

        self.classe3 = CourseClass(
            name='Tercera clase', description='Esta es la Tercera clase')
        self.classe3.save()
        self.classe3.calendar.add(self.calendar1)
        self.classe3.save()

        self.classe4 = CourseClass(
            name='Cuarta clase', description='Esta es la cuarta clase')
        self.classe4.save()
        self.classe4.calendar.add(self.calendar1)
        self.classe4.save()

        # is create answer for simulacrum
        self.simanswer = SimAnswer(text='text de prueba')
        self.simanswer.save()

        # is create question for simulacrum
        self.simquestion = SimQuestion(text='Pregunta de prueba')
        self.simquestion.save()
        self.simquestion.answers.add(self.simanswer)


        # is create simulacrum ty
        self.simulacrum = Simulacrum(
            name='Prueba uno', description='Esto es un simulacrum de test',
            subject=self.subject)
        self.simulacrum.save()
        self.simulacrum.questions.add(self.simquestion)

        # agrego clase al curso

        self.course1.classes.add(self.classe1)
        self.course1.classes.add(self.classe2)
        self.course1.sim_simulacrums.add(self.simulacrum)

        self.course2.classes.add(self.classe3)
        self.course2.classes.add(self.classe4)
        self.course2.sim_simulacrums.add(self.simulacrum)
class CoursesTestCase(TestCase):
    """
        Pruebas para app de courses
    """
    def setUp(self):
        self.tutor_category = TutorCategory.objects.create(name='Categoria 1',
                                                           id=1)
        # datos usuario student
        self.user_password = "******"
        self.user_email = '*****@*****.**'

        # datos usuario tutor
        self.user_tutor_password = "******"
        self.user_tutor_email = "*****@*****.**"

        # subject
        self.subject = Subject.objects.create(name=u'Matematicas')

        # usuario
        self.user = User.objects.create_user(
            username=self.user_email, email=self.user_email,
            password=self.user_password, first_name='Jonathan',
            last_name='Diaz')
        self.student = Student.objects.create(user=self.user)

        # tutor
        self.user_tutor = User.objects.create_user(
            username=self.user_tutor_email,
            email=self.user_tutor_email, password=self.user_tutor_password,
            first_name='Jonathan', last_name='Diaz')
        self.tutor = Tutor.objects.create(user=self.user_tutor, id=1555,
                                          category=self.tutor_category)
        self.tutor.profile = 'Un texto para el perfil'
        self.tutor.save()

        # create group
        self.course1 = Course(
            name='primer curso',
            description='Este es el primer curso de pruebas',
            subject=self.subject,
            tutor=self.tutor)
        self.course1.save()

        self.course2 = Course(
            name='segundo curso',
            description='Este es el segundo curso curso de pruebas',
            subject=self.subject,
            tutor=self.tutor)
        self.course2.save()

        # create calendar class
        date = datetime.now()
        start_time = date.time()
        end_time = (date + timedelta(hours=1)).time()
        self.calendar1 = CourseClassCalendar(
            date=date.date(), start_time=start_time, end_time=end_time)
        self.calendar1.save()

        # create CourseClass
        self.classe1 = CourseClass(
            name='Primera clase', description='Esta es la primera clase')
        self.classe1.save()
        self.classe1.calendar.add(self.calendar1)
        self.classe1.save()

        self.classe2 = CourseClass(
            name='Segunda clase', description='Esta es la segunda clase')
        self.classe2.save()
        self.classe2.calendar.add(self.calendar1)
        self.classe2.save()

        self.classe3 = CourseClass(
            name='Tercera clase', description='Esta es la Tercera clase')
        self.classe3.save()
        self.classe3.calendar.add(self.calendar1)
        self.classe3.save()

        self.classe4 = CourseClass(
            name='Cuarta clase', description='Esta es la cuarta clase')
        self.classe4.save()
        self.classe4.calendar.add(self.calendar1)
        self.classe4.save()

        # is create answer for simulacrum
        self.simanswer = SimAnswer(text='text de prueba')
        self.simanswer.save()

        # is create question for simulacrum
        self.simquestion = SimQuestion(text='Pregunta de prueba')
        self.simquestion.save()
        self.simquestion.answers.add(self.simanswer)


        # is create simulacrum ty
        self.simulacrum = Simulacrum(
            name='Prueba uno', description='Esto es un simulacrum de test',
            subject=self.subject)
        self.simulacrum.save()
        self.simulacrum.questions.add(self.simquestion)

        # agrego clase al curso

        self.course1.classes.add(self.classe1)
        self.course1.classes.add(self.classe2)
        self.course1.sim_simulacrums.add(self.simulacrum)

        self.course2.classes.add(self.classe3)
        self.course2.classes.add(self.classe4)
        self.course2.sim_simulacrums.add(self.simulacrum)

    def test_group_add_student(self):
        """
            Se crea para probar signal post_add de grupos con estudantes
            Agrega estudiantes a un grupo que ya tiene cursos, y le crea al
            estudiante las clases que tiene el curso
            1. Valida que el estudiante se agrega al curso
            2. Valida que se cree relacion estudiante clase
            3. Valida que se cree la relacion simulacrum tutorya
        """
        group = CourseGroupStudent(name='Prueba de primer grupo')
        group.save()
        group.courses.add(self.course1)
        group.courses.add(self.course2)
        group.students.add(self.student)

        # Verifico que se agregue estudiante a cursos del grupo
        self.assertTrue(
            self.course1.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 1')

        self.assertTrue(
            self.course2.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 2')

        # verifico CourseStudentClass
        exists_class1 = CourseStudentClass.objects.filter(
            course=self.course1, student=self.student)

        self.assertTrue(exists_class1,
                        'No existe primera clase para el estudiante')

        exists_ty_simulacrum = (
            CourseSimSimulacrumStudent.objects.get_for_student_course_simulacrum(
                self.student, self.course1, self.simulacrum))

        self.assertTrue(exists_ty_simulacrum,
                        'No existe simulacro para el estudiante')

    def test_group_remove_student(self):
        """
            Se crea para probar signal pre_remove de grupos con estudantes
            Elimina estudiante del grupo
            1. Valida que el estudiante se elimine de los cursos
            2. Valida que se elimine relacion estudiante clase
            3. Valida que se elimine relacion sim_simulacro estudiante
        """
        group = CourseGroupStudent(name='Prueba de primer grupo')
        group.save()
        group.courses.add(self.course1)
        group.courses.add(self.course2)
        group.students.add(self.student)

        # Verifico que se agregue estudiante a cursos del grupo
        self.assertTrue(
            self.course1.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 1')

        self.assertTrue(
            self.course2.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 2')

        # verifico CourseStudentClass
        exists_class1 = CourseStudentClass.objects.filter(
            course=self.course1, student=self.student)

        self.assertTrue(exists_class1,
                        'No existe primera clase para el estudiante')

        # Se elimina estudiante del grupo

        group.students.remove(self.student)

        # Verifico que se elimine estudiante del curso
        self.assertFalse(
            self.course1.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 1')

        self.assertFalse(
            self.course2.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 2')

        exists_simulacrum_student = CourseSimSimulacrumStudent.objects.filter(
            course=self.course1, student=self.student,
            sim_simulacrum=self.simulacrum
        ).exists()

        self.assertFalse(exists_simulacrum_student,
                         'No se elimino relacion estudiantes sim simulacro')

    def test_group_add_course(self):
        """
            Se crea para probar signal post_add de grupos con cursos
            Agrega un curso al grupo cuando el grupo ya tiene estudiantes
            1.Valido que se agregue estudiante al curso nuevo
            3.Valido que se cree relacion estudiante clase con las clases del
              curso nuevo.
        """
        group = CourseGroupStudent(name='Prueba de primer grupo')
        group.save()
        group.students.add(self.student)

        # agrego curso al grupo
        group.courses.add(self.course1)
        group.courses.add(self.course2)

        # Verifico que se agregue estudiante a cursos del grupo
        self.assertTrue(
            self.course1.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 1')

        self.assertTrue(
            self.course2.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 2')

        # verifico CourseStudentClass
        exists_class1 = CourseStudentClass.objects.filter(
            course=self.course1, student=self.student)

        exists_class2 = CourseStudentClass.objects.filter(
            course=self.course2, student=self.student)

        self.assertTrue(exists_class1,
                        'No existe primera clase para el estudiante')

        self.assertTrue(exists_class2,
                        'No existe primera clase para el estudiante')

        # valido que se cree el simulacro que tenga e curso 1
        exists_ty_simulacrum = (
            CourseSimSimulacrumStudent.objects.get_for_student_course_simulacrum(
                self.student, self.course1, self.simulacrum))

        self.assertTrue(exists_ty_simulacrum,
                        'No existe simulacro para el estudiante')


    def test_group_remove_course(self):
        """
            Se crea para probar signal pre_removed de grupos con cursos
            Elimino curso del grupo cuando el grupo tiene estudiantes y curso
            1. Valido que se elimine estudiante del curso
            2. Valido que se elimine relacion estudiante clase de las clases
               del curso
        """
        group = CourseGroupStudent(name='Prueba de primer grupo')
        group.save()
        group.students.add(self.student)

        # agrego curso al grupo
        group.courses.add(self.course1)
        group.courses.add(self.course2)

        # Verifico que se agregue estudiante a cursos del grupo
        self.assertTrue(
            self.course1.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 1')

        self.assertTrue(
            self.course2.students.filter(id=self.student.id).exists(),
            'No se agrego estudiante a curso 2')

        # verifico CourseStudentClass
        exists_class1 = CourseStudentClass.objects.filter(
            course=self.course1, student=self.student)

        exists_class2 = CourseStudentClass.objects.filter(
            course=self.course2, student=self.student)

        self.assertTrue(exists_class1,
                        'No existe primera clase para el estudiante')

        self.assertTrue(exists_class2,
                        'No existe primera clase para el estudiante')

        # Elimino cursos del grupo
        group.courses.remove(self.course1)
        group.courses.remove(self.course2)

        # Verifico que se agregue estudiante a cursos del grupo
        self.assertFalse(
            self.course1.students.filter(id=self.student.id).exists(),
            'No se elimino estudiante a curso 1')

        self.assertFalse(
            self.course2.students.filter(id=self.student.id).exists(),
            'No se elimino estudiante a curso 2')

        # valido que no existe el simulacro
        exists_simulacrum_student = CourseSimSimulacrumStudent.objects.filter(
            course=self.course1, student=self.student,
            sim_simulacrum=self.simulacrum
        ).exists()

        self.assertFalse(exists_simulacrum_student,
                         'No se elimino relacion estudiantes sim simulacro')