add functional tests of year-group endpoint for students view and fix importing models
This commit is contained in:
parent
3009ca01b3
commit
02677ca511
@ -87,10 +87,9 @@ def create_student(data: dict) -> dict:
|
|||||||
yg_id = data['year_group_id']
|
yg_id = data['year_group_id']
|
||||||
del data['year_group_id']
|
del data['year_group_id']
|
||||||
|
|
||||||
student = Student.query.filter_by(index=index).join(Student.year_groups).first()
|
student = Student.query.filter(Student.index == index).first()
|
||||||
# if student is not None:
|
# if student is not None:
|
||||||
# abort(400, "Student has already exists!")
|
# abort(400, "Student has already exists!")
|
||||||
|
|
||||||
if student is None:
|
if student is None:
|
||||||
dummy_email = f'student{randint(1, 300_000)}@gmail.com'
|
dummy_email = f'student{randint(1, 300_000)}@gmail.com'
|
||||||
student = Student(**data, email=dummy_email)
|
student = Student(**data, email=dummy_email)
|
||||||
@ -102,6 +101,7 @@ def create_student(data: dict) -> dict:
|
|||||||
abort(404, "Not found year group!")
|
abort(404, "Not found year group!")
|
||||||
if any((year_group.id == yg.id for yg in student.year_groups)):
|
if any((year_group.id == yg.id for yg in student.year_groups)):
|
||||||
abort(400, "You are assigned to this year group!")
|
abort(400, "You are assigned to this year group!")
|
||||||
|
|
||||||
ygs = YearGroupStudents(student_index=student.index, year_group_id=year_group.id)
|
ygs = YearGroupStudents(student_index=student.index, year_group_id=year_group.id)
|
||||||
db.session.add(ygs)
|
db.session.add(ygs)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from apiflask import APIBlueprint
|
from apiflask import APIBlueprint
|
||||||
from flask import abort
|
from flask import abort
|
||||||
|
|
||||||
from ...students.models import YearGroup
|
from ...students.models import YearGroup, YearGroupStudents
|
||||||
from ...dependencies import db
|
from ...dependencies import db
|
||||||
from ...base.utils import paginate_models
|
from ...base.utils import paginate_models
|
||||||
from ..schemas import YearGroupQueryStudentSchema, YearGroupStudentPaginationSchema
|
from ..schemas import YearGroupQueryStudentSchema, YearGroupStudentPaginationSchema
|
||||||
@ -22,8 +22,8 @@ def list_of_year_groups(query: dict) -> dict:
|
|||||||
page = query.get('page')
|
page = query.get('page')
|
||||||
per_page = query.get('per_page')
|
per_page = query.get('per_page')
|
||||||
|
|
||||||
year_group_query = YearGroup.query.join(YearGroup.students). \
|
year_group_query = db.session.query(YearGroup).join(YearGroupStudents, isouter=True). \
|
||||||
filter(Student.index == st.index).order_by(db.desc(YearGroup.created_at))
|
filter(YearGroupStudents.student_index == st.index).order_by(db.desc(YearGroup.created_at))
|
||||||
data = paginate_models(page, year_group_query, per_page)
|
data = paginate_models(page, year_group_query, per_page)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -23,7 +23,6 @@ def import_models() -> None:
|
|||||||
models_module = "models"
|
models_module = "models"
|
||||||
for dirname in directories:
|
for dirname in directories:
|
||||||
try:
|
try:
|
||||||
importlib.import_module(f"app.app.{dirname}.{models_module}")
|
importlib.import_module(f"app.{dirname}.{models_module}")
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
print(models_module, dirname)
|
|
||||||
warnings.warn(f"Not found module {models_module}.py in package {dirname}")
|
warnings.warn(f"Not found module {models_module}.py in package {dirname}")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from .app import create_app
|
from app import create_app
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
app = create_app()
|
app = create_app()
|
||||||
|
@ -6,8 +6,8 @@ from flask import Flask
|
|||||||
from flask.testing import FlaskClient
|
from flask.testing import FlaskClient
|
||||||
from flask.ctx import AppContext
|
from flask.ctx import AppContext
|
||||||
|
|
||||||
from ..app import create_app
|
from app import create_app
|
||||||
from ..app.dependencies import db
|
from app.dependencies import db
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
|
@ -2,9 +2,9 @@ from factory import alchemy, Sequence
|
|||||||
from factory.faker import Faker
|
from factory.faker import Faker
|
||||||
from factory.fuzzy import FuzzyInteger
|
from factory.fuzzy import FuzzyInteger
|
||||||
|
|
||||||
from ..app.dependencies import db
|
from app.dependencies import db
|
||||||
from ..app.students.models import Student, Group, YearGroupStudents
|
from app.students.models import Student, Group, YearGroupStudents
|
||||||
from ..app.project_supervisor.models import ProjectSupervisor, YearGroupProjectSupervisors
|
from app.project_supervisor.models import ProjectSupervisor, YearGroupProjectSupervisors
|
||||||
|
|
||||||
|
|
||||||
class ProjectSupervisorFactory(alchemy.SQLAlchemyModelFactory):
|
class ProjectSupervisorFactory(alchemy.SQLAlchemyModelFactory):
|
||||||
|
@ -2,10 +2,10 @@ from typing import List
|
|||||||
|
|
||||||
from .factory import ProjectSupervisorFactory, YearGroupProjectSupervisorsFactory, \
|
from .factory import ProjectSupervisorFactory, YearGroupProjectSupervisorsFactory, \
|
||||||
StudentFactory, YearGroupStudentsFactory, GroupFactory
|
StudentFactory, YearGroupStudentsFactory, GroupFactory
|
||||||
from ..app.dependencies import db
|
from app.dependencies import db
|
||||||
from ..app.project_supervisor.models import YearGroup, ProjectSupervisor
|
from app.project_supervisor.models import YearGroup, ProjectSupervisor
|
||||||
from ..app.students.models import Group, Student, YearGroupStudents
|
from app.students.models import Group, Student, YearGroupStudents
|
||||||
from ..app.base.mode import ModeGroups
|
from app.base.mode import ModeGroups
|
||||||
|
|
||||||
|
|
||||||
def create_year_group(data: dict = None) -> YearGroup:
|
def create_year_group(data: dict = None) -> YearGroup:
|
||||||
@ -51,10 +51,11 @@ def create_students(yg: YearGroup, amount: int) -> List[StudentFactory]:
|
|||||||
return students
|
return students
|
||||||
|
|
||||||
|
|
||||||
def create_student(data: dict, year_group_id: int) -> Student:
|
def create_student(data: dict, year_group_id: int = None) -> Student:
|
||||||
st = Student(**data)
|
st = Student(**data)
|
||||||
db.session.add(st)
|
db.session.add(st)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
if year_group_id is not None:
|
||||||
db.session.add(YearGroupStudents(year_group_id=year_group_id, student_index=st.index))
|
db.session.add(YearGroupStudents(year_group_id=year_group_id, student_index=st.index))
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return st
|
return st
|
||||||
|
@ -4,9 +4,9 @@ from flask import current_app
|
|||||||
|
|
||||||
from ...utils import _test_case_client, _test_case_client_without_response, assert_model_changes, _test_case_group
|
from ...utils import _test_case_client, _test_case_client_without_response, assert_model_changes, _test_case_group
|
||||||
from ...fake_data import create_year_group, create_groups, create_group, create_students, create_project_supervisors
|
from ...fake_data import create_year_group, create_groups, create_group, create_students, create_project_supervisors
|
||||||
from ....app.dependencies import db
|
from app.dependencies import db
|
||||||
from ....app.students.models import Group
|
from app.students.models import Group
|
||||||
from ....app.project_supervisor.models import YearGroupProjectSupervisors
|
from app.project_supervisor.models import YearGroupProjectSupervisors
|
||||||
|
|
||||||
valid_data = {
|
valid_data = {
|
||||||
'name': 'System Pri'
|
'name': 'System Pri'
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from ...utils import _test_case_client, _test_case_client_without_response, assert_model_changes
|
from ...utils import _test_case_client, _test_case_client_without_response, assert_model_changes
|
||||||
from ...fake_data import create_project_supervisors, create_year_group, create_dummy_group, create_dummy_ps
|
from ...fake_data import create_project_supervisors, create_year_group, create_dummy_group, create_dummy_ps
|
||||||
from ....app.dependencies import db
|
from app.dependencies import db
|
||||||
from ....app.project_supervisor.models import YearGroupProjectSupervisors
|
from app.project_supervisor.models import YearGroupProjectSupervisors
|
||||||
|
|
||||||
valid_data = {
|
valid_data = {
|
||||||
'first_name': 'John',
|
'first_name': 'John',
|
||||||
|
@ -17,7 +17,9 @@ new_data = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
data_to_create_student = {
|
data_to_create_student = {
|
||||||
**new_data,
|
'first_name': 'Albert',
|
||||||
|
'last_name': 'Marcus',
|
||||||
|
'pesel': '93030312896',
|
||||||
'index': 123_456
|
'index': 123_456
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from ...fake_data import create_year_group
|
from ...fake_data import create_year_group
|
||||||
from ...utils import _test_case_client_without_response, _test_case_client, assert_model_changes
|
from ...utils import _test_case_client_without_response, _test_case_client, assert_model_changes
|
||||||
from ....app.base.mode import ModeGroups
|
from app.base.mode import ModeGroups
|
||||||
|
|
||||||
valid_data = {
|
valid_data = {
|
||||||
'mode': ModeGroups.STATIONARY.value,
|
'mode': ModeGroups.STATIONARY.value,
|
||||||
|
50
backend/tests/functional_tests/students/test_year_group.py
Normal file
50
backend/tests/functional_tests/students/test_year_group.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
from ...utils import _test_case_client, _test_case_client_without_response, assert_model_changes
|
||||||
|
from ...fake_data import create_year_group, create_students, create_student
|
||||||
|
from app.base.mode import ModeGroups
|
||||||
|
from app.dependencies import db
|
||||||
|
from app.students.models import YearGroupStudents
|
||||||
|
|
||||||
|
valid_data = {
|
||||||
|
'first_name': 'Dominic',
|
||||||
|
'last_name': 'Mozart',
|
||||||
|
'index': 123_345
|
||||||
|
}
|
||||||
|
|
||||||
|
year_group_data = [
|
||||||
|
{
|
||||||
|
'name': '2022/2023',
|
||||||
|
'mode': ModeGroups.STATIONARY.value
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': '2021/2022',
|
||||||
|
'mode': ModeGroups.STATIONARY.value
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': '2023/2024',
|
||||||
|
'mode': ModeGroups.NON_STATIONARY.value
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': '1997/1998',
|
||||||
|
'mode': ModeGroups.NON_STATIONARY.value
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_year_group_for_specific_student(test_app_with_context) -> None:
|
||||||
|
with test_app_with_context.test_client() as client:
|
||||||
|
year_groups = [create_year_group(data) for data in year_group_data]
|
||||||
|
student = create_student(valid_data)
|
||||||
|
for yg in year_groups[:-1]:
|
||||||
|
db.session.add(YearGroupStudents(year_group_id=yg.id, student_index=student.index))
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
url = f'/api/students/year-group/?per_page=10&index={student.index}'
|
||||||
|
data = _test_case_client_without_response(client, url, None, 200, method='get')
|
||||||
|
assert data.get('max_pages') == 1
|
||||||
|
assert len(data.get('year_groups')) == len(year_groups) - 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_year_group_if_student_doesnt_exist(test_app_with_context) -> None:
|
||||||
|
with test_app_with_context.test_client() as client:
|
||||||
|
_test_case_client(client, '/api/students/year-group/?per_page=10&index=23', None, 'Not found student!', 404,
|
||||||
|
method='get', key='error')
|
@ -4,11 +4,11 @@ import pandas as pd
|
|||||||
import pytest
|
import pytest
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
|
|
||||||
from ...app.dependencies import db
|
from app.dependencies import db
|
||||||
from ...app.base.utils import is_allowed_extensions, order_by_column_name, paginate_models
|
from app.base.utils import is_allowed_extensions, order_by_column_name, paginate_models
|
||||||
from ...app.coordinator.utils import check_columns, parse_csv, generate_range_dates, generate_csv
|
from app.coordinator.utils import check_columns, parse_csv, generate_range_dates, generate_csv
|
||||||
from ...app.coordinator.exceptions import InvalidNameOrTypeHeaderException
|
from app.coordinator.exceptions import InvalidNameOrTypeHeaderException
|
||||||
from ...app.students.models import Student, Group
|
from app.students.models import Student, Group
|
||||||
|
|
||||||
|
|
||||||
def test_is_allowed_extensions(test_app) -> None:
|
def test_is_allowed_extensions(test_app) -> None:
|
||||||
|
@ -3,7 +3,7 @@ import datetime
|
|||||||
import pytest
|
import pytest
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
|
|
||||||
from ...app.coordinator.validators import validate_index, validate_datetime_greater_than_now
|
from app.coordinator.validators import validate_index, validate_datetime_greater_than_now
|
||||||
|
|
||||||
|
|
||||||
def test_validate_index() -> None:
|
def test_validate_index() -> None:
|
||||||
|
@ -2,8 +2,8 @@ from typing import Union
|
|||||||
|
|
||||||
from flask.testing import FlaskClient
|
from flask.testing import FlaskClient
|
||||||
|
|
||||||
from ..app.dependencies import db
|
from app.dependencies import db
|
||||||
from ..app.students.models import Group
|
from app.students.models import Group
|
||||||
|
|
||||||
|
|
||||||
def assert_model_changes(model: db.Model, expected_data: dict) -> None:
|
def assert_model_changes(model: db.Model, expected_data: dict) -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user