diff --git a/tests/api/test_exams.py b/tests/api/test_exams.py new file mode 100644 index 0000000000000000000000000000000000000000..68ebe3a2106bccdafb8fe1ef33ebe8aed6ac42f8 --- /dev/null +++ b/tests/api/test_exams.py @@ -0,0 +1,95 @@ +import pytest + +from flask import json +from flask import Flask + +from zesje.api import api_bp +from zesje.database import db, Exam, Problem, ProblemWidget + + +@pytest.fixture(scope="module") +def app(): + app = Flask(__name__, static_folder=None) + + app.config.update( + SQLALCHEMY_DATABASE_URI='sqlite:///:memory:', + SQLALCHEMY_TRACK_MODIFICATIONS=False # Suppress future deprecation warning + ) + db.init_app(app) + + with app.app_context(): + db.create_all() + add_test_data() + + app.register_blueprint(api_bp, url_prefix='/api') + + return app + + +@pytest.fixture() +def test_client(app): + client = app.test_client() + + yield client + + +def mco_json(): + return { + 'x': 100, + 'y': 40, + 'problem_id': 1, + 'page': 1, + 'label': 'a', + 'name': 'test' + } + + +def add_test_data(): + exam1 = Exam(id=1, name='exam 1', finalized=False) + exam2 = Exam(id=2, name='exam 2', finalized=True) + + db.session.add(exam1) + db.session.add(exam2) + db.session.commit() + + problem1 = Problem(id=1, name='Problem 1', exam_id=1) + problem2 = Problem(id=2, name='Problem 2', exam_id=2) + db.session.add(problem1) + db.session.add(problem2) + db.session.commit() + + problem_widget_1 = ProblemWidget(id=1, name='problem widget', problem_id=1, page=2, + width=100, height=150, x=40, y=200, type='problem_widget') + db.session.add(problem_widget_1) + db.session.commit() + + +##################### +# Actual test # +##################### + +def test_get_exams(test_client): + mc_option_1 = { + 'x': 100, + 'y': 40, + 'problem_id': 1, + 'page': 1, + 'label': 'a', + 'name': 'test' + } + test_client.put('/api/mult-choice/', data=mc_option_1) + + mc_option_2 = { + 'x': 100, + 'y': 40, + 'problem_id': 1, + 'page': 1, + 'label': 'a', + 'name': 'test' + } + test_client.put('/api/mult-choice/', data=mc_option_2) + + response = test_client.get('/api/exams/1') + data = json.loads(response.data) + + assert len(data['problems'][0]['mc_options']) == 2 diff --git a/tests/test_api_mult_choice.py b/tests/api/test_mult_choice.py similarity index 53% rename from tests/test_api_mult_choice.py rename to tests/api/test_mult_choice.py index 00bc3fec48e0c83727365a8dfe7d063cfa057b3c..d62242ad77d7a51081e47a7fa9fe266bfc45290c 100644 --- a/tests/test_api_mult_choice.py +++ b/tests/api/test_mult_choice.py @@ -1,38 +1,12 @@ import pytest -from flask import Flask, json + +from flask import json +from flask import Flask from zesje.api import api_bp from zesje.database import db, Exam, Problem -def mco_json(): - return { - 'x': 100, - 'y': 40, - 'problem_id': 1, - 'page': 1, - 'label': 'a', - 'name': 'test' - } - - -def add_exam(db, finalized=False): - # Exam with id 1 - exam = Exam(name='exam', finalized=finalized) - db.session.add(exam) - db.session.commit() - - return exam - - -def add_problem(db, exam_id=1): - problem = Problem(name='problem', exam_id=exam_id) - db.session.add(problem) - db.session.commit() - - return problem - - @pytest.fixture(scope="module") def app(): app = Flask(__name__, static_folder=None) @@ -45,31 +19,67 @@ def app(): with app.app_context(): db.create_all() - add_problem(db) - add_exam(db) + add_test_data() app.register_blueprint(api_bp, url_prefix='/api') return app -@pytest.fixture -def client(app): +@pytest.fixture() +def test_client(app): client = app.test_client() yield client -def test_get_no_exam(client): - result = client.get('/api/mult-choice/1') +def add_test_data(): + exam1 = Exam(id=1, name='exam 1', finalized=False) + exam2 = Exam(id=2, name='exam 2', finalized=True) + + db.session.add(exam1) + db.session.add(exam2) + db.session.commit() + + problem1 = Problem(id=1, name='Problem 1', exam_id=1) + problem2 = Problem(id=2, name='Problem 2', exam_id=2) + db.session.add(problem1) + db.session.add(problem2) + db.session.commit() + + +def mco_json(): + return { + 'x': 100, + 'y': 40, + 'problem_id': 1, + 'page': 1, + 'label': 'a', + 'name': 'test' + } + + +@pytest.fixture +def mock_exam_finalized(monkeypatch): + monkeypatch.setattr(db.exam, 'finalized', True) + monkeypatch.setattr(db.mult_choice.feedback.problem, 'exam', None) + + +################### +# Actual tests # +################### + + +def test_get_no_exam(test_client): + result = test_client.get('/api/mult-choice/1') data = json.loads(result.data) assert data['message'] == "Multiple choice question with id 1 does not exist." -def test_add_exam(client): +def test_add_exam(test_client): req = mco_json() - response = client.put('/api/mult-choice/', data=req) + response = test_client.put('/api/mult-choice/', data=req) data = json.loads(response.data) @@ -80,15 +90,15 @@ def test_add_exam(client): assert data['status'] == 200 -def test_add_get(client): +def test_add_get(test_client): req = mco_json() - response = client.put('/api/mult-choice/', data=req) + response = test_client.put('/api/mult-choice/', data=req) data = json.loads(response.data) id = data['mult_choice_id'] - result = client.get(f'/api/mult-choice/{id}') + result = test_client.get(f'/api/mult-choice/{id}') data = json.loads(result.data) exp_resp = { @@ -104,10 +114,10 @@ def test_add_get(client): assert exp_resp == data -def test_update_put(client): +def test_update_put(test_client): req = mco_json() - response = client.put('/api/mult-choice/', data=req) + response = test_client.put('/api/mult-choice/', data=req) data = json.loads(response.data) id = data['mult_choice_id'] @@ -120,29 +130,49 @@ def test_update_put(client): 'name': 'test' } - result = client.put(f'/api/mult-choice/{id}', data=req2) + result = test_client.put(f'/api/mult-choice/{id}', data=req2) data = json.loads(result.data) assert data['message'] == f'Multiple choice question with id {id} updated' -def test_delete(client): +def test_delete(test_client): req = mco_json() - response = client.put('/api/mult-choice/', data=req) + response = test_client.put('/api/mult-choice/', data=req) data = json.loads(response.data) id = data['mult_choice_id'] - response = client.delete(f'/api/mult-choice/{id}') + response = test_client.delete(f'/api/mult-choice/{id}') data = json.loads(response.data) assert data['status'] == 200 -def test_delete_not_present(client): +def test_delete_not_present(test_client): id = 5 - response = client.delete(f'/api/mult-choice/{id}') + response = test_client.delete(f'/api/mult-choice/{id}') data = json.loads(response.data) assert data['message'] == f'Multiple choice question with id {id} does not exist.' + + +def test_delete_finalized_exam(test_client): + mc_option_json = { + 'x': 100, + 'y': 40, + 'problem_id': 2, + 'page': 1, + 'label': 'a', + 'name': 'test' + } + + response = test_client.put('/api/mult-choice/', data=mc_option_json) + data = json.loads(response.data) + mc_id = data['mult_choice_id'] + + response = test_client.delete(f'/api/mult-choice/{mc_id}') + data = json.loads(response.data) + + assert data['status'] == 401