Verified Commit 416074ac authored by Peter Stanko's avatar Peter Stanko
Browse files

Fixtures for tests

parent 93b14274
Pipeline #14414 passed with stage
in 30 minutes and 50 seconds
from datetime import timedelta from datetime import timedelta
from flask import Flask from flask import Flask
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
from management.data.shared import DataFactory from management.data.shared import DataFactory
from portal.database.models import Review, Submission, SubmissionState, Secret from portal.database.models import Review, Secret, Submission, SubmissionState
from portal.tools import time from portal.tools import time
...@@ -19,81 +20,33 @@ def init_test_data(app: Flask, db: SQLAlchemy): ...@@ -19,81 +20,33 @@ def init_test_data(app: Flask, db: SQLAlchemy):
name='Teacher Only', uco=1002) name='Teacher Only', uco=1002)
teacher1.secrets.append(Secret('teacher1_secret', 'ultimate_teacher_secret')) teacher1.secrets.append(Secret('teacher1_secret', 'ultimate_teacher_secret'))
lecturer1 = factory.create_user( lecturer1 = factory.create_user(username='lecturer1', name='Courses Owner', uco=1010)
username='lecturer1',
name='Courses Owner',
password='654321',
uco=1010
)
# courses # courses
test_course1 = factory.create_course( test_course1 = factory.create_course(codename='testcourse1', name='Test Course One')
codename='testcourse1', name='Test Course One') test_course2 = factory.create_course(codename='testcourse2', name='test Course Two')
test_course2 = factory.create_course(
codename='testcourse2', name='test Course Two')
# groups # groups
tc1_students = factory.create_group( tc1_students = factory.create_group(course=test_course1, name="seminar01")
course=test_course1, name="seminar01") tc1_teachers = factory.create_group(course=test_course1, name="teachers")
tc1_teachers = factory.create_group(
course=test_course1, name="teachers") tc2_students = factory.create_group(course=test_course2, name="seminar01")
tc2_teachers = factory.create_group(course=test_course2, name="teachers")
tc2_students = factory.create_group(
course=test_course2, name="seminar01") tc1_hw01 = factory.scaffold_project(test_course1, 'hw01')
tc2_teachers = factory.create_group( tc1_hw02 = factory.scaffold_project(test_course1, 'hw02')
course=test_course2, name="teachers")
tc2_hw01 = factory.scaffold_project(test_course2, 'hw01')
tc1_hw01 = factory.create_project( tc2_hw01 = factory.scaffold_project(test_course2, 'hw02')
course=test_course1, name="HW01", codename='hw01', config=dict(
file_whitelist="main.cpp",
pre_submit_script="python for kontr pre",
post_submit_script="python for kontr post",
submission_scheduler_config="python for sub Q",
submission_parameters="{\"type\":\"text\"}",
submissions_allowed_from=time.current_time(),
submissions_allowed_to=time.current_time() + timedelta(days=2),
archive_from=time.current_time() + timedelta(days=30)
)
)
tc1_hw02 = factory.create_project(
course=test_course1, name="HW02", codename='HW02', config=dict(
file_whitelist="main.cpp\nfunc.hpp\nfunc.cpp",
pre_submit_script="python for kontr pre",
post_submit_script="python for kontr post",
submission_scheduler_config="python for sub Q",
submission_parameters="{\"type\":\"text\"}",
submissions_allowed_from=time.current_time() - timedelta(days=1),
submissions_allowed_to=time.current_time() + timedelta(days=10),
archive_from=time.current_time() + timedelta(days=30)
)
)
tc2_hw01 = factory.create_project(
course=test_course2, name="HW01", codename='hw01', config=dict(
file_whitelist="main.c", pre_submit_script="python for kontr pre",
post_submit_script="python for kontr post",
submission_scheduler_config="python for sub Q",
submission_parameters="{\"type\":\"text\"}",
submissions_allowed_from=time.current_time() - timedelta(days=1),
submissions_allowed_to=time.current_time() - timedelta(minutes=1),
archive_from=time.current_time() + timedelta(days=30)
)
)
# roles # roles
tc1_student = factory.scaffold_role( tc1_student = factory.scaffold_role(role_type='student', course=test_course1)
role_type='student', course=test_course1) tc1_teacher = factory.scaffold_role(role_type='teacher', course=test_course1)
tc1_teacher = factory.scaffold_role( tc1_owner = factory.scaffold_role(role_type='owner', course=test_course1)
role_type='teacher', course=test_course1)
tc1_owner = factory.scaffold_role( tc2_student = factory.scaffold_role(role_type='student', course=test_course2)
role_type='owner', course=test_course1) tc2_teacher = factory.scaffold_role(role_type='teacher', course=test_course2)
tc2_owner = factory.scaffold_role(role_type='owner', course=test_course2)
tc2_student = factory.scaffold_role(
role_type='student', course=test_course2)
tc2_teacher = factory.scaffold_role(
role_type='teacher', course=test_course2)
tc2_owner = factory.scaffold_role(
role_type='owner', course=test_course2)
# relationships # relationships
teacher_student = teacher1 teacher_student = teacher1
...@@ -120,24 +73,18 @@ def init_test_data(app: Flask, db: SQLAlchemy): ...@@ -120,24 +73,18 @@ def init_test_data(app: Flask, db: SQLAlchemy):
student_both.groups.append(tc2_students) student_both.groups.append(tc2_students)
# submissions # submissions
tc2_sub1 = Submission(user=teacher_student, tc2_sub1 = Submission(user=teacher_student, project=tc2_hw01, parameters={})
project=tc2_hw01, parameters="")
tc2_sub1.state = SubmissionState.FINISHED tc2_sub1.state = SubmissionState.FINISHED
tc2_sub2 = Submission( tc2_sub2 = Submission(user=student_both, project=tc2_hw01, parameters={})
user=student_both, project=tc2_hw01, parameters="")
tc2_sub2.state = SubmissionState.ABORTED tc2_sub2.state = SubmissionState.ABORTED
tc1_sub_p1_cancel = Submission( tc1_sub_p1_cancel = Submission(user=student_both, project=tc1_hw01, parameters={})
user=student_both, project=tc1_hw01, parameters="")
tc1_sub_p1_cancel.state = SubmissionState.CANCELLED tc1_sub_p1_cancel.state = SubmissionState.CANCELLED
tc1_sub_p1_abort = Submission( tc1_sub_p1_abort = Submission(user=student_tc1, project=tc1_hw01, parameters={})
user=student_tc1, project=tc1_hw01, parameters="")
tc1_sub_p1_abort.state = SubmissionState.ABORTED tc1_sub_p1_abort.state = SubmissionState.ABORTED
tc1_sub_p1_finished = Submission( tc1_sub_p1_finished = Submission(user=student_both, project=tc1_hw01, parameters={})
user=student_both, project=tc1_hw01, parameters="")
tc1_sub_p1_finished.state = SubmissionState.FINISHED tc1_sub_p1_finished.state = SubmissionState.FINISHED
tc1_sub_p1_in_progress = Submission( tc1_sub_p1_in_progress = Submission(user=student_tc1, project=tc1_hw01, parameters={})
user=student_tc1, project=tc1_hw01, parameters="")
tc1_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS tc1_sub_p1_in_progress.state = SubmissionState.IN_PROGRESS
# Projects in groups # Projects in groups
...@@ -152,10 +99,8 @@ def init_test_data(app: Flask, db: SQLAlchemy): ...@@ -152,10 +99,8 @@ def init_test_data(app: Flask, db: SQLAlchemy):
review = Review(tc2_sub1) review = Review(tc2_sub1)
factory.create_review_item(author=teacher_both, review=review, line=1, factory.create_review_item(author=teacher_both, review=review, line=1,
content="problem here") content="problem here")
factory.create_review_item(author=teacher_both, review=review, line=5, factory.create_review_item(author=teacher_both, review=review, line=5, content="good stuff")
content="good stuff") factory.create_review_item(author=teacher_student, review=review, line=1, content="oops")
factory.create_review_item(author=teacher_student, review=review,
line=1, content="oops")
db.session.add_all([review]) db.session.add_all([review])
......
...@@ -32,7 +32,7 @@ def client(app): ...@@ -32,7 +32,7 @@ def client(app):
@pytest.fixture() @pytest.fixture()
def rest_service(): def rest_service(app):
from portal.service.rest import RestService from portal.service.rest import RestService
return RestService() return RestService()
...@@ -51,3 +51,53 @@ def mocked_submission(ent_mocker: EntitiesMocker, rest_service): ...@@ -51,3 +51,53 @@ def mocked_submission(ent_mocker: EntitiesMocker, rest_service):
project_config: ProjectConfig = submission.project.config project_config: ProjectConfig = submission.project.config
project_config.test_files_commit_hash = 'some-random-hash' project_config.test_files_commit_hash = 'some-random-hash'
return submission return submission
@pytest.fixture()
def created_course(rest_service):
return rest_service.find.course('testcourse1')
@pytest.fixture()
def created_course2(rest_service):
return rest_service.find.course('testcourse2')
@pytest.fixture()
def created_project(rest_service, created_course):
return rest_service.find.project(created_course, 'hw01')
@pytest.fixture()
def created_role_student(rest_service, created_course):
return rest_service.find.role(created_course, 'student')
@pytest.fixture()
def created_role_teacher(rest_service, created_course):
return rest_service.find.role(created_course, 'teacher')
@pytest.fixture()
def created_group(rest_service, created_course):
return rest_service.find.group(created_course, 'seminar01')
@pytest.fixture()
def created_student(rest_service):
return rest_service.find.user('student1')
@pytest.fixture()
def created_admin(rest_service):
return rest_service.find.user('admin')
@pytest.fixture()
def created_teacher(rest_service):
return rest_service.find.user('teacher1')
@pytest.fixture()
def created_worker(rest_service):
return rest_service.find.worker('executor')
import json
import json as json_parser import json as json_parser
from datetime import datetime from datetime import datetime
...@@ -12,7 +11,7 @@ from portal.database.models import Course, Group, Project, ProjectConfig, Review ...@@ -12,7 +11,7 @@ from portal.database.models import Course, Group, Project, ProjectConfig, Review
def get_user_credentials(username, password='123456'): def get_user_credentials(username, password='123456'):
return json.dumps({ return json_parser.dumps({
"type": "username_password", "type": "username_password",
"identifier": username, "identifier": username,
"secret": password "secret": password
...@@ -20,7 +19,7 @@ def get_user_credentials(username, password='123456'): ...@@ -20,7 +19,7 @@ def get_user_credentials(username, password='123456'):
def get_user_secret(username, secret): def get_user_secret(username, secret):
return json.dumps({ return json_parser.dumps({
"type": "secret", "type": "secret",
"identifier": username, "identifier": username,
"secret": secret "secret": secret
...@@ -74,7 +73,7 @@ def __get_access_token(client, credentials): ...@@ -74,7 +73,7 @@ def __get_access_token(client, credentials):
login_resp = client.post(f"{API_PREFIX}/auth/login", data=credentials, login_resp = client.post(f"{API_PREFIX}/auth/login", data=credentials,
headers={"content-type": "application/json"}) headers={"content-type": "application/json"})
log.debug(f"[RESP] {login_resp}") log.debug(f"[RESP] {login_resp}")
resp_data = json.loads(str(login_resp.get_data().decode("utf-8"))) resp_data = json_parser.loads(str(login_resp.get_data().decode("utf-8")))
return resp_data['access_token'] return resp_data['access_token']
...@@ -272,12 +271,12 @@ def assert_review(expected: Review, actual: dict): ...@@ -272,12 +271,12 @@ def assert_review(expected: Review, actual: dict):
# source: # source:
# https://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable # https://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable
class DateTimeEncoder(json.JSONEncoder): class DateTimeEncoder(json_parser.JSONEncoder):
def default(self, o): def default(self, o):
if isinstance(o, datetime): if isinstance(o, datetime):
return o.isoformat() return o.isoformat()
return json.JSONEncoder.default(self, o) return json_parser.JSONEncoder.default(self, o)
def assert_response(response: flask.Response, code=200, content_type='application/json'): def assert_response(response: flask.Response, code=200, content_type='application/json'):
......
...@@ -3,21 +3,19 @@ from tests.rest.rest_tools import assert_response ...@@ -3,21 +3,19 @@ from tests.rest.rest_tools import assert_response
from . import rest_tools from . import rest_tools
def test_list(client): def test_list(client, created_course):
cpp = Course.query.filter_by(codename="testcourse2").first() cpp_roles = len(created_course.roles)
cpp_roles = len(cpp.roles) response = rest_tools.make_request(client, f'/courses/{created_course.codename}/roles')
response = rest_tools.make_request(client, f'/courses/{cpp.codename}/roles')
assert_response(response, 200) assert_response(response, 200)
roles = rest_tools.extract_data(response) roles = rest_tools.extract_data(response)
assert len(roles) == cpp_roles assert len(roles) == cpp_roles
cpp_updated = Course.query.filter_by(codename="testcourse1").first() cpp_updated = Course.query.filter_by(codename=created_course.codename).first()
for r in roles: for r in roles:
rest_tools.assert_role_in(cpp_updated.roles, r) rest_tools.assert_role_in(cpp_updated.roles, r)
def test_create(client): def test_create(client, created_course):
cpp = Course.query.filter_by(codename="testcourse1").first() cpp = created_course
cpp_roles = len(cpp.roles) cpp_roles = len(cpp.roles)
request_dict = { request_dict = {
...@@ -25,12 +23,13 @@ def test_create(client): ...@@ -25,12 +23,13 @@ def test_create(client):
'codename': 'new-role', 'codename': 'new-role',
"description": "new role desc" "description": "new role desc"
} }
response = rest_tools.make_request(client, f"/courses/{cpp.codename}/roles", json=request_dict, url = f"/courses/{created_course.codename}/roles"
response = rest_tools.make_request(client, url, json=request_dict,
method='post') method='post')
assert_response(response, 201) assert_response(response, 201)
new_role = rest_tools.extract_data(response) new_role = rest_tools.extract_data(response)
cpp_updated = Course.query.filter_by(codename="testcourse1").first() cpp_updated = Course.query.filter_by(codename=created_course.codename).first()
assert len(cpp_updated.roles) == cpp_roles + 1 assert len(cpp_updated.roles) == cpp_roles + 1
assert new_role['name'] == "new role" assert new_role['name'] == "new role"
assert new_role['description'] == "new role desc" assert new_role['description'] == "new role desc"
...@@ -38,126 +37,105 @@ def test_create(client): ...@@ -38,126 +37,105 @@ def test_create(client):
rest_tools.assert_role_in(cpp_updated.roles, new_role) rest_tools.assert_role_in(cpp_updated.roles, new_role)
def test_read(client): def test_read(client, created_course, created_role_student):
cpp = Course.query.filter_by(codename="testcourse1").first() url = f"/courses/{created_course.codename}/roles/{created_role_student.codename}"
r = cpp.roles[0] response = rest_tools.make_request(client, url)
response = rest_tools.make_request(
client, f"/courses/{cpp.codename}/roles/{r.name}", )
assert_response(response, 200) assert_response(response, 200)
role = rest_tools.extract_data(response) role = rest_tools.extract_data(response)
rest_tools.assert_role(created_role_student, role)
rest_tools.assert_role(r, role)
def test_update(client): def test_update(client, created_course, created_role_student, rest_service):
cpp = Course.query.filter_by(codename="testcourse1").first()
r = cpp.roles[0]
r_name = r.name
request_dict = dict( request_dict = dict(
name="new role name", name="new role name",
description="new role desc", description="new role desc",
) )
response = rest_tools.make_request(client, f"/courses/{cpp.codename}/roles/{r.name}", url = f"/courses/{created_course.codename}/roles/{created_role_student.name}"
json=request_dict, method='put') response = rest_tools.make_request(client, url, json=request_dict, method='put')
assert_response(response, 204) assert_response(response, 204)
r_updated = Role.query.filter(Role.course_id == cpp.id).filter( r_updated = rest_service.find.role(created_course, created_role_student.id)
Role.name == "new role name").first()
assert r_updated assert r_updated
assert r_updated.description == "new role desc" assert r_updated.description == "new role desc"
assert not Role.query.filter(Role.course_id == cpp.id).filter(
Role.name == r_name).first()
def test_delete(client): def test_delete(client, created_course, created_role_student, rest_service):
cpp = Course.query.filter_by(codename="testcourse1").first() cpp_roles = len(created_course.roles)
r = cpp.roles[0] url = f"/courses/{created_course.codename}/roles/{created_role_student.name}"
r_name = r.name response = rest_tools.make_request(client, url, method='delete')
cpp_roles = len(cpp.roles)
response = rest_tools.make_request(
client, f"/courses/{cpp.codename}/roles/{r.name}", method='delete')
assert_response(response, 204) assert_response(response, 204)
cpp_updated = Course.query.filter_by(codename="testcourse1").first() course_updated = rest_service.find.course(created_course.id)
assert len(cpp_updated.roles) == cpp_roles - 1 assert len(course_updated.roles) == cpp_roles - 1
assert not Role.query.filter(Role.course_id == cpp.id).filter( assert not rest_service.find.role(created_course, created_role_student.id, throws=False)
Role.name == r_name).first()
def test_users_list(client): def test_users_list(client, created_course, created_role_student, rest_service):
cpp = Course.query.filter_by(codename="testcourse1").first() url = f"/courses/{created_course.codename}/roles/{created_role_student.id}/clients?type=user"
r = cpp.roles[0] response = rest_tools.make_request(client, url)
response = rest_tools.make_request(
client, f"/courses/{cpp.codename}/roles/{r.id}/clients?type=user", )
assert_response(response, 200) assert_response(response, 200)
users = rest_tools.extract_data(response) users = rest_tools.extract_data(response)
assert len(users) == len(r.clients) assert len(users) == len(created_role_student.clients)
for user in users: for user in users:
rest_tools.assert_user_in(r.clients, user) rest_tools.assert_user_in(created_role_student.clients, user)
def test_users_update_add(client): def test_users_update_add(client, created_course2, created_role_student, rest_service,
c = Course.query.filter_by(codename="testcourse2").first() created_student):
roles = [role for role in c.roles if role.name == "student"] roles = [role for role in created_course2.roles if role.name == "student"]
r = roles[0] role = roles[0]
r_users = len(r.clients) r_users = len(role.clients)
user = User.query.filter_by(username="student1").first() user = created_student
assert user not in r.clients assert user not in role.clients
request_dict = dict( request_dict = dict(add=[user.id])
add=[user.id] url = f"/courses/{created_course2.codename}/roles/{role.name}/clients"
) response = rest_tools.make_request(client, url, json=request_dict, method='put')
response = rest_tools.make_request(client, f"/courses/{c.codename}/roles/{r.name}/clients",
json=request_dict, method='put')
assert_response(response, 204) assert_response(response, 204)
r_updated = Role.query.filter( r_updated = rest_service.find.role(created_course2, role.id)
Role.course_id == c.id).filter(Role.id == r.id).first()
assert len(r_updated.clients) == r_users + 1 assert len(r_updated.clients) == r_users + 1
assert user in r_updated.clients assert user in r_updated.clients
def test_users_update_add_duplicate(client): def test_users_update_add_duplicate(client, created_course2, created_role_student, rest_service,
c = Course.query.filter_by(codename="testcourse2").first() created_student):
roles = [role for role in c.roles if role.name == "student"] roles = [role for role in created_course2.roles if role.name == "student"]
r = roles[0] role = roles[0]
r_users = len(r.clients) r_users = len(role.clients)
user = r.clients[0] user = role.clients[0]
assert user in r.clients assert user in role.clients
request_dict = dict(add=[user.id]) request_dict = dict(add=[user.id])
response = rest_tools.make_request(client, f"/courses/{c.codename}/roles/{r.name}/clients", url = f"/courses/{created_course2.codename}/roles/{role.name}/clients"
json=request_dict, method='put') response = rest_tools.make_request(client, url, json=request_dict, method='put')
assert_response(response, 204) assert_response(response, 204)
r_updated = Role.query.filter( r_updated = rest_service.find.role(created_course2, role.id)
Role.course_id == c.id).filter(Role.id == r.id).first()
assert len(r_updated.clients) == r_users assert len(r_updated.clients) == r_users
assert user in r_updated.clients assert user in r_updated.clients
def test_users_update_remove(client): def test_users_update_remove(client, rest_service, created_course2, created_student):
c = Course.query.filter_by(codename="testcourse2").first() roles = [role for role in created_course2.roles if role.name == "student"]
roles = [role for role in c.roles if role.name == "student"] role = roles[0]
r = roles[0] r_users = len(role.clients)
r_users = len(r.clients) user = role.clients[0]
user = r.clients[0] assert user in role.clients
assert user in r.clients
request_dict = dict(remove=[user.id]) request_dict = dict(remove=[user.id])
response = rest_tools.make_request(client, f"/courses/{c.codename}/roles/{r.name}/clients", url = f"/courses/{created_course2.codename}/roles/{role.name}/clients"
response = rest_tools.make_request(client, url,
json=request_dict, method='put') json=request_dict, method='put')
assert_response(response, 204) assert_response(response, 204)
r_updated = Role.query.filter( r_updated = rest_service.find.role(created_course2, role.id)
Role.course_id == c.id).filter(Role.id == r.id).first()
assert len(r_updated.clients) == r_users - 1