system-pri/backend/tests/functional_tests/students/test_enrollments.py

343 lines
12 KiB
Python

import datetime
from app.base.mode import EnrollmentsMode
from app.dependencies import db
from app.examination_schedule.models import ExaminationSchedule, TermOfDefence
from ...factory import (
ExaminationScheduleFactory,
GroupFactory,
ProjectSupervisorFactory,
StudentFactory,
TermOfDefenceFactory,
YearGroupFactory,
)
from ...utils import (
_test_case_client,
_test_case_client_without_response,
assert_model_changes,
create_many_models,
create_one_model,
get_data_of_term_of_defence,
)
def test_list_examination_schedule(test_app_with_context) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
create_many_models(23, ExaminationScheduleFactory, year_group_id=year_group.id)
url = f"/api/students/examination-schedule/year-group/{year_group.id}/?student_id={st.id}"
data = _test_case_client_without_response(client, url, None, 200, method="get")
assert len(data.get("examination_schedules")) == 23
def test_list_examination_schedule_if_student_doesnt_exist(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
yg = create_one_model(YearGroupFactory)
_test_case_client(
client,
f"/api/students/examination-schedule/year-group/{yg.id}/?student_id=2",
None,
"Not found student!",
404,
method="get",
key="error",
)
def test_list_term_of_defences(test_app_with_context) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
ex = create_one_model(ExaminationScheduleFactory, year_group_id=year_group.id)
project_supervisors = create_many_models(
13, ProjectSupervisorFactory, year_group_id=year_group.id
)
ps = project_supervisors[0]
group = create_one_model(
GroupFactory, year_group_id=year_group.id, project_supervisor_id=ps.id
)
group.students.append(st)
db.session.commit()
term_of_defences = create_many_models(
13, TermOfDefenceFactory, examination_schedule_id=ex.id
)
ps_amount = 6
for i in range(ps_amount):
term_of_defences[i].members_of_committee.append(ps)
db.session.commit()
url = f"/api/students/examination-schedule/{ex.id}/enrollments/?student_id={st.id}"
data = _test_case_client_without_response(client, url, None, 200, method="get")
assert len(data.get("term_of_defences")) == ps_amount
def test_list_term_of_defences_if_student_doesnt_exist(test_app_with_context) -> None:
with test_app_with_context.test_client() as client:
_test_case_client(
client,
"/api/students/examination-schedule/3/enrollments/?student_id=2",
None,
"Not found student!",
404,
method="get",
key="error",
)
def test_assign_your_group_to_term_of_defence(test_app_with_context) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(
ExaminationScheduleFactory,
year_group_id=year_group.id,
open_enrollments=EnrollmentsMode.OPEN.value,
)
ps = create_one_model(ProjectSupervisorFactory, year_group_id=year_group.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
td = create_one_model(TermOfDefenceFactory, examination_schedule_id=ex.id)
group = create_one_model(
GroupFactory, year_group_id=year_group.id, project_supervisor_id=ps.id
)
td.members_of_committee.append(ps)
group.students.append(st)
db.session.commit()
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"You have just assigned the group for this exam date!",
201,
method="post",
)
def test_assign_your_group_to_term_of_defence_if_student_doesnt_exist(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
_test_case_client(
client,
"/api/students/3/enrollments/1/",
{"student_id": 2},
"Not found student!",
404,
method="post",
key="error",
)
def test_assign_your_group_to_term_of_defence_if_term_of_defence_doesnt_exist(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
st = create_one_model(StudentFactory)
_test_case_client(
client,
"/api/students/3/enrollments/1/",
{"student_id": st.id},
"Term of defence not found!",
404,
method="post",
key="error",
)
def test_assign_your_group_to_term_of_defence_if_enrollments_havent_started_yet(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(ExaminationScheduleFactory, year_group_id=year_group.id)
td = create_one_model(TermOfDefenceFactory, examination_schedule_id=ex.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"Enrollments is closed! You have been delayed!",
400,
method="post",
key="error",
)
def test_assign_your_group_to_term_of_defence_if_you_dont_have_group(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(
ExaminationScheduleFactory,
year_group_id=year_group.id,
open_enrollments=EnrollmentsMode.OPEN.value,
)
td = create_one_model(TermOfDefenceFactory, examination_schedule_id=ex.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"You don't have a group or your group doesn't have an assigned project supervisor!",
400,
method="post",
key="error",
)
def test_assign_your_group_to_term_of_defence_if_your_group_has_already_assigned_to_any_term_of_defence(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(
ExaminationScheduleFactory,
year_group_id=year_group.id,
open_enrollments=EnrollmentsMode.OPEN.value,
)
td = create_one_model(TermOfDefenceFactory, examination_schedule_id=ex.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
ps = create_one_model(ProjectSupervisorFactory, year_group_id=year_group.id)
group = create_one_model(
GroupFactory, year_group_id=year_group.id, project_supervisor_id=ps.id
)
td.group_id = group.id
group.students.append(st)
db.session.commit()
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"Your group has already assigned to any exam date!",
400,
method="post",
key="error",
)
def test_assign_your_group_to_term_of_defence_if_your_project_supervisor_is_not_in_committee(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(
ExaminationScheduleFactory,
year_group_id=year_group.id,
open_enrollments=EnrollmentsMode.OPEN.value,
)
td = create_one_model(TermOfDefenceFactory, examination_schedule_id=ex.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
ps = create_one_model(ProjectSupervisorFactory, year_group_id=year_group.id)
group = create_one_model(
GroupFactory, year_group_id=year_group.id, project_supervisor_id=ps.id
)
group.students.append(st)
db.session.commit()
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"Your project supervisor is not in committee!",
400,
method="post",
key="error",
)
def test_delete_your_group_from_term_of_defence(test_app_with_context) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(
ExaminationScheduleFactory,
year_group_id=year_group.id,
open_enrollments=EnrollmentsMode.OPEN.value,
)
ps = create_one_model(ProjectSupervisorFactory, year_group_id=year_group.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
group = create_one_model(
GroupFactory, year_group_id=year_group.id, project_supervisor_id=ps.id
)
td = create_one_model(
TermOfDefenceFactory, examination_schedule_id=ex.id, group_id=group.id
)
td.members_of_committee.append(ps)
group.students.append(st)
db.session.commit()
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"You have just removed the group for this exam date!",
200,
method="delete",
)
def test_delete_your_group_from_term_of_defence_if_student_doesnt_exist(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
_test_case_client(
client,
"/api/students/3/enrollments/1/",
{"student_id": 2},
"Not found student!",
404,
method="delete",
key="error",
)
def test_delete_your_group_from_term_of_defence_if_term_of_defence_doesnt_exist(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
st = create_one_model(StudentFactory)
_test_case_client(
client,
"/api/students/3/enrollments/1/",
{"student_id": st.id},
"Not found term of defence!",
404,
method="delete",
key="error",
)
def test_assign_your_group_to_term_of_defence_if_you_try_delete_not_your_group(
test_app_with_context,
) -> None:
with test_app_with_context.test_client() as client:
year_group = create_one_model(YearGroupFactory)
ex = create_one_model(
ExaminationScheduleFactory,
year_group_id=year_group.id,
open_enrollments=EnrollmentsMode.OPEN.value,
)
td = create_one_model(TermOfDefenceFactory, examination_schedule_id=ex.id)
st = create_one_model(StudentFactory, year_group_id=year_group.id)
ps = create_one_model(ProjectSupervisorFactory, year_group_id=year_group.id)
group = create_one_model(
GroupFactory, year_group_id=year_group.id, project_supervisor_id=ps.id
)
td.group_id = group.id
db.session.commit()
_test_case_client(
client,
f"/api/students/{ex.id}/enrollments/{td.id}/",
{"student_id": st.id},
"You are not assigned to this group!",
400,
method="delete",
key="error",
)