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