Ejemplo n.º 1
0
def test_get_division_batch_students(client: TestClient,
                                     superuser_token_headers: dict[str, str],
                                     db: Session) -> None:
    course = create_random_course(db)
    division = create_random_division(db, course_id=course.id)
    students = [
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
    ]
    batch_number = randint(1, 5)
    for student in students:
        division.students.append({
            "student": student,
            "batch_number": batch_number
        })
    try:
        db.commit()
    except exc.IntegrityError as e:
        logging.error(e.__str__())
        db.rollback()
    except Exception as e:
        logging.error(e.__str__())
        db.rollback()
    r = client.get(
        f"{settings.API_V1_STR}/divisions/{division.id}/students/{batch_number}",
        headers=superuser_token_headers)
    assert r.status_code == 200
    student_ids = [student.get("user_id") for student in r.json()]
    for student in students:
        assert student.user_id in student_ids
Ejemplo n.º 2
0
def test_add_students_to_division(db: Session) -> None:
    division = create_random_division(db)
    assert division
    students = [
        create_random_student(db, term_id=division.course.term_id),
        create_random_student(db, term_id=division.course.term_id),
    ]
    random_batch = randint(1, 5)
    for student in students:
        division.students.append({
            "student": student,
            "batch_number": random_batch
        })
    try:
        db.commit()
    except exc.IntegrityError as e:
        logging.error(e.__str__())
        db.rollback()
    except Exception as e:
        logging.error(e.__str__())
        db.rollback()
    for student in students:
        db.refresh(student)
        assert student.divisions
        assert student.divisions[0] == division
Ejemplo n.º 3
0
def test_remove_division_student(client: TestClient,
                                 superuser_token_headers: dict[str, str],
                                 db: Session) -> None:
    course = create_random_course(db)
    division = create_random_division(db, course_id=course.id)
    students = [
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
    ]
    batch_number = randint(1, 5)
    for student in students:
        division.students.append({
            "student": student,
            "batch_number": batch_number
        })
    try:
        db.commit()
    except Exception as e:
        logging.error(e)
        db.rollback()
    r = client.delete(
        f"{settings.API_V1_STR}/divisions/{division.id}/students/{students[0].user_id}",
        headers=superuser_token_headers)
    assert r.status_code == 200
    updated_student = r.json()
    assert updated_student["user_id"] == students[0].user_id
    db.refresh(division)
    assert students[0] not in division.students
Ejemplo n.º 4
0
def test_update_division(db: Session) -> None:
    professor_id = create_random_professor(db).user_id
    division = create_random_division(db)
    assert division
    updated_division = crud.division.update(
        db, db_obj=division, obj_in=DivisionUpdate(professor_id=professor_id))
    assert updated_division.professor_id == professor_id
Ejemplo n.º 5
0
def test_add_division_students_no_student_object(client: TestClient,
                                                 superuser_token_headers: dict[
                                                     str, str],
                                                 db: Session) -> None:
    course = create_random_course(db)
    division = create_random_division(db, course_id=course.id)
    students = [
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
    ]
    data = [student.user_id for student in students]
    student_no_object = create_random_student(
        db, school_id=course.term.year.school_id, term_id=course.term_id)
    crud.student.remove(db, id=student_no_object.user_id)
    data.append(student_no_object.user_id)
    r = client.post(f"{settings.API_V1_STR}/divisions/{division.id}/students",
                    headers=superuser_token_headers,
                    json=data)
    assert r.status_code == 207
    response = r.json()
    assert response.get("errors").get(
        "no student object")[0] == student_no_object.user_id
    for student in students:
        assert student.user_id in response.get("success")
Ejemplo n.º 6
0
def test_remove_students_from_division(db: Session) -> None:
    division = create_random_division(db)
    assert division
    student = create_random_student(db, term_id=division.course.term_id)
    division.students.append({
        "student": student,
        "batch_number": randint(1, 5)
    })
    try:
        db.commit()
    except exc.IntegrityError as e:
        logging.error(e.__str__())
        db.rollback()
    except Exception as e:
        logging.error(e.__str__())
        db.rollback()
    db.refresh(student)
    assert division in student.divisions
    division.students.remove(student)
    try:
        db.commit()
    except exc.IntegrityError as e:
        logging.error(e.__str__())
        db.rollback()
    except Exception as e:
        logging.error(e.__str__())
        db.rollback()
    db.refresh(student)
    assert division not in student.divisions
Ejemplo n.º 7
0
def test_delete_division(client: TestClient,
                         superuser_token_headers: dict[str, str],
                         db: Session) -> None:
    division = create_random_division(db)
    r = client.delete(f"{settings.API_V1_STR}/divisions/{division.id}",
                      headers=superuser_token_headers)
    assert r.status_code == 200
    deleted_division = crud.division.get(db, id=division.id)
    assert deleted_division is None
Ejemplo n.º 8
0
def test_get_division_students_admin_without_perms(
        client: TestClient, admin_user_token_headers: dict[str, str],
        db: Session) -> None:
    division = create_random_division(db)
    r = client.get(
        f"{settings.API_V1_STR}/divisions/{division.id}/students",
        headers=admin_user_token_headers,
    )
    assert r.status_code == 403
Ejemplo n.º 9
0
def test_get_division_batch_students_normal_user(
        client: TestClient, normal_user_token_headers: dict[str, str],
        db: Session) -> None:
    division = create_random_division(db)
    r = client.get(
        f"{settings.API_V1_STR}/divisions/{division.id}/students/0",
        headers=normal_user_token_headers,
    )
    assert r.status_code == 403
Ejemplo n.º 10
0
def test_remove_division_nonexisting_student(client: TestClient,
                                             superuser_token_headers: dict[
                                                 str, str],
                                             db: Session) -> None:
    division = create_random_division(db)
    r = client.delete(
        f"{settings.API_V1_STR}/divisions/{division.id}/students/{generate_uuid()}",
        headers=superuser_token_headers)
    assert r.status_code == 404
Ejemplo n.º 11
0
def test_get_division_existing(client: TestClient,
                               superuser_token_headers: dict[str, str],
                               db: Session) -> None:
    division = create_random_division(db)
    r = client.get(f"{settings.API_V1_STR}/divisions/{division.id}",
                   headers=superuser_token_headers)
    assert r.status_code == 200
    fetched_division = r.json()
    assert fetched_division
    compare_api_and_db_query_results(fetched_division, to_json(division))
Ejemplo n.º 12
0
def test_get_all_divisions(client: TestClient,
                           superuser_token_headers: dict[str, str],
                           db: Session) -> None:
    division = create_random_division(db)
    r = client.get(f"{settings.API_V1_STR}/divisions/",
                   headers=superuser_token_headers)
    assert r.status_code == 200
    results = r.json()
    assert results
    compare_api_and_db_query_results(results[-1], to_json(division))
Ejemplo n.º 13
0
def test_division_by_details(db: Session) -> None:
    division = create_random_division(db)
    assert division.course_id
    assert division.division_code
    fetched_division = crud.division.get_by_details(
        db,
        course_id=division.course_id,
        division_code=division.division_code,
    )
    assert fetched_division
    assert fetched_division.id == division.id
Ejemplo n.º 14
0
def test_get_student_me_divisions(client: TestClient, db: Session) -> None:
    student = create_random_student(db)
    course = create_random_course(db, term_id=student.term_id)
    divisions = [create_random_division(db, course_id=course.id), create_random_division(db, course_id=course.id)]
    batch_number = randint(1, 5)
    for division in divisions:
        division.students.append({"student": student, "batch_number": batch_number})
    r = client.get(
        f"{settings.API_V1_STR}/students/me/divisions",
        headers=authentication_token_from_email(client=client, email=student.user.email, db=db),
    )
    assert r.status_code == 200
    fetched_divisions = r.json()
    assert fetched_divisions
    assert len(fetched_divisions) == 2
    for division in divisions:
        if fetched_divisions[0].get("id") == division.id:
            compare_api_and_db_query_results(api_result=fetched_divisions[0], db_dict=to_json(division))
        else:
            compare_api_and_db_query_results(api_result=fetched_divisions[1], db_dict=to_json(division))
Ejemplo n.º 15
0
def test_create_division(db: Session) -> None:
    course_id = create_random_course(db).id
    division_code = randint(1, 20)
    professor_id = create_random_professor(db).user_id
    division = create_random_division(db,
                                      course_id=course_id,
                                      division_code=division_code,
                                      professor_id=professor_id)
    assert division
    assert division.course_id == course_id
    assert division.division_code == division_code
    assert division.professor_id == professor_id
Ejemplo n.º 16
0
def test_get_student_divisions_id_normal_user(
    client: TestClient, normal_user_token_headers: dict[str, str], db: Session
) -> None:
    student = create_random_student(db)
    course = create_random_course(db, term_id=student.term_id)
    division = create_random_division(db, course_id=course.id)
    division.students.append({"student": student, "batch_number": randint(1, 5)})
    r = client.get(
        f"{settings.API_V1_STR}/students/{student.user_id}/divisions",
        headers=normal_user_token_headers,
    )
    assert r.status_code == 403
Ejemplo n.º 17
0
def test_read_professor_divisions_by_id_superuser(
        client: TestClient, superuser_token_headers: dict[str, str],
        db: Session) -> None:
    professor = create_random_user(db, type="professor")
    division = create_random_division(db, professor_id=professor.id)
    r = client.get(
        f"{settings.API_V1_STR}/professors/{professor.id}/divisions",
        headers=superuser_token_headers,
    )
    assert r.status_code == 200
    divisions = r.json()
    compare_api_and_db_query_results(api_result=divisions[-1],
                                     db_dict=to_json(division))
Ejemplo n.º 18
0
def test_create_division_existing(client: TestClient,
                                  superuser_token_headers: dict[str, str],
                                  db: Session) -> None:
    division = create_random_division(db)
    data = {
        "course_id": division.course_id,
        "division_code": division.division_code,
        "professor_id": division.professor_id,
    }
    r = client.post(f"{settings.API_V1_STR}/divisions/",
                    headers=superuser_token_headers,
                    json=data)
    assert r.status_code == 409
Ejemplo n.º 19
0
def test_add_division_students_not_a_user(client: TestClient,
                                          superuser_token_headers: dict[str,
                                                                        str],
                                          db: Session) -> None:
    division = create_random_division(db)
    new_user_id = generate_uuid()
    data = [new_user_id]
    r = client.post(f"{settings.API_V1_STR}/divisions/{division.id}/students",
                    headers=superuser_token_headers,
                    json=data)
    assert r.status_code == 207
    response = r.json()
    assert response.get("errors").get("not a user")[0] == new_user_id
Ejemplo n.º 20
0
def test_read_professor_divisions_by_id_normal_professor_fetch_self(
        client: TestClient, db: Session) -> None:
    professor = create_random_user(db, type="professor")
    division = create_random_division(db, professor_id=professor.id)
    r = client.get(
        f"{settings.API_V1_STR}/professors/{professor.id}/divisions",
        headers=authentication_token_from_email(client=client,
                                                email=professor.email,
                                                db=db),
    )
    assert r.status_code == 200
    divisions = r.json()
    compare_api_and_db_query_results(api_result=divisions[-1],
                                     db_dict=to_json(division))
Ejemplo n.º 21
0
def test_update_division(client: TestClient,
                         superuser_token_headers: dict[str, str],
                         db: Session) -> None:
    division = create_random_division(db)
    assert division.professor_id
    professor_id = create_random_professor(db).user_id
    data = {"professor_id": professor_id}
    r = client.put(f"{settings.API_V1_STR}/divisions/{division.id}",
                   headers=superuser_token_headers,
                   json=data)
    fetched_division = r.json()
    db.refresh(division)
    assert fetched_division
    compare_api_and_db_query_results(fetched_division, to_json(division))
Ejemplo n.º 22
0
def test_get_student_divisions_id_admin_with_perms(client: TestClient, db: Session) -> None:
    student = create_random_student(db)
    course = create_random_course(db, term_id=student.term_id)
    division = create_random_division(db, course_id=course.id)
    division.students.append({"student": student, "batch_number": randint(1, 5)})

    perms = AdminPermissions(0)
    perms["student"] = True
    admin = create_random_user(db, type="admin", permissions=perms.permissions)

    r = client.get(
        f"{settings.API_V1_STR}/students/{student.user_id}/divisions",
        headers=authentication_token_from_email(client=client, email=admin.email, db=db),
    )
    assert r.status_code == 200
    fetched_divisions = r.json()
    assert fetched_divisions
    assert division.id == fetched_divisions[0].get("id")
Ejemplo n.º 23
0
def test_read_professor_divisions_by_id_admin_with_permissions(
        client: TestClient, db: Session) -> None:
    professor = create_random_user(db, type="professor")
    division = create_random_division(db, professor_id=professor.id)
    admin_perms = AdminPermissions(0)
    admin_perms["professor"] = True
    admin_with_perms = create_random_user(db,
                                          type="admin",
                                          permissions=admin_perms.permissions)
    r = client.get(
        f"{settings.API_V1_STR}/professors/{professor.id}/divisions",
        headers=authentication_token_from_email(client=client,
                                                email=admin_with_perms.email,
                                                db=db),
    )
    assert r.status_code == 200
    divisions = r.json()
    compare_api_and_db_query_results(api_result=divisions[-1],
                                     db_dict=to_json(division))
Ejemplo n.º 24
0
def test_get_division_students_professor(client: TestClient,
                                         db: Session) -> None:
    course = create_random_course(db)
    professor = create_random_user(db,
                                   type="professor",
                                   school_id=course.term.year.school_id)
    division = create_random_division(db,
                                      course_id=course.id,
                                      professor_id=professor.id)
    students = [
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
    ]
    batch_number = randint(1, 5)
    for student in students:
        division.students.append({
            "student": student,
            "batch_number": batch_number
        })
    try:
        db.commit()
    except exc.IntegrityError as e:
        logging.error(e.__str__())
        db.rollback()
    except Exception as e:
        logging.error(e.__str__())
        db.rollback()
    r = client.get(
        f"{settings.API_V1_STR}/divisions/{division.id}/students",
        headers=authentication_token_from_email(client=client,
                                                db=db,
                                                email=professor.email),
    )
    assert r.status_code == 200
    assert r.json()
    fetched_students = [student.get("user_id") for student in r.json()]
    for student in students:
        assert student.user_id in fetched_students
Ejemplo n.º 25
0
def test_add_division_students(client: TestClient,
                               superuser_token_headers: dict[str, str],
                               db: Session) -> None:
    course = create_random_course(db)
    division = create_random_division(db, course_id=course.id)
    students = [
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
    ]
    data = [student.user_id for student in students]
    r = client.post(f"{settings.API_V1_STR}/divisions/{division.id}/students",
                    headers=superuser_token_headers,
                    json=data)
    assert r.status_code == 207
    assert r.json()
    fetched_students = [student_id for student_id in r.json()["success"]]
    for student in students:
        assert student.user_id in fetched_students
Ejemplo n.º 26
0
def test_get_division_batch_students_admin_with_perms(client: TestClient,
                                                      db: Session) -> None:
    course = create_random_course(db)
    division = create_random_division(db, course_id=course.id)
    students = [
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
        create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id),
    ]
    batch_number = randint(1, 5)
    for student in students:
        division.students.append({
            "student": student,
            "batch_number": batch_number
        })
    try:
        db.commit()
    except exc.IntegrityError as e:
        logging.error(e.__str__())
        db.rollback()
    except Exception as e:
        logging.error(e.__str__())
        db.rollback()
    perms = AdminPermissions(0)
    perms["course"] = True
    admin = create_random_user(db, type="admin", permissions=perms.permissions)
    r = client.get(
        f"{settings.API_V1_STR}/divisions/{division.id}/students/{batch_number}",
        headers=authentication_token_from_email(client=client,
                                                db=db,
                                                email=admin.email),
    )
    assert r.status_code == 200
    student_ids = [student.get("user_id") for student in r.json()]
    for student in students:
        assert student.user_id in student_ids
Ejemplo n.º 27
0
def test_add_students_to_division_batches(db: Session) -> None:
    division = create_random_division(db)
    assert division
    students = [
        create_random_student(db, term_id=division.course.term_id),
        create_random_student(db, term_id=division.course.term_id),
    ]
    random_batch = randint(1, 5)
    for student in students:
        division.students.append({
            "student": student,
            "batch_number": random_batch
        })
    db.commit()
    for student in students:
        db.refresh(student)
        assert student.divisions
        assert student.divisions[0] == division
        assert getattr(student,
                       "student_division")[0].division_id == division.id
        assert getattr(student,
                       "student_division")[0].batch_number == random_batch
Ejemplo n.º 28
0
def test_add_division_students_duplicate_students(
        client: TestClient, superuser_token_headers: dict[str, str],
        db: Session) -> None:
    course = create_random_course(db)
    division = create_random_division(db, course_id=course.id)
    s = create_random_student(db,
                              school_id=course.term.year.school_id,
                              term_id=course.term_id)
    students = [s, s]
    data = [student.user_id for student in students]
    r = client.post(f"{settings.API_V1_STR}/divisions/{division.id}/students",
                    headers=superuser_token_headers,
                    json=data)
    assert r.status_code == 207
    assert r.json()
    db.refresh(division)
    success = r.json().get("success")
    assert success
    assert s.user_id in [student_id for student_id in success]
    errors = r.json().get("errors")
    assert errors.get("student already in division")
    assert s.user_id in [
        student_id for student_id in errors.get("student already in division")
    ]