diff --git a/test/test_data_download.py b/test/test_data_download.py
new file mode 100644
index 0000000000000000000000000000000000000000..18601f7fe74d6aea91eb18abc47f74749591853c
--- /dev/null
+++ b/test/test_data_download.py
@@ -0,0 +1,69 @@
+import json
+import pathlib
+from sqlalchemy import select
+from compendium_v2.routes.api import models
+from compendium_v2.db import db
+from compendium_v2.db.presentation_models import NREN, NRENService, Service
+
+TEST_DATA_DIR = pathlib.Path(__file__).parent / 'data' / 'presentation_models_data'
+
+
+def _get_data(model):
+    filename = TEST_DATA_DIR / f'{model.__name__}.json'
+    if not filename.exists():
+        raise FileNotFoundError(
+            f'Data file for {model.__name__} not found at {filename}. Run test_data_dump.py to generate it.')
+    with open(filename, 'r') as f:
+        return json.load(f)
+
+
+def setup(model, nrens):
+    if model == NREN:
+        return
+
+    if model == NRENService:
+        services = {s.name_key: s for s in db.session.scalars(select(Service)).all()}
+
+    def _create_instance(model, data):
+        nren = nrens[data['nren_id']]
+        if model == NRENService:
+            service = services[data['service_key']]
+            return model(nren=nren, service=service, **data)
+
+        return model(nren=nren, **data)
+
+    data = _get_data(model)
+    instances = list(filter(lambda i: i is not None, [_create_instance(model, instance) for instance in data]))
+    db.session.add_all(instances)
+    db.session.commit()
+
+
+def test_data_download(app, client, mocked_admin_user, nren_services):
+    nren_services(app)
+
+    with app.app_context():
+        # set up the presentation model data for NREN first, as the instances are needed for other models
+        nren_data = _get_data(NREN)
+        nrens = {
+            nren['id']: NREN(**nren)
+            for nren in nren_data
+        }
+        db.session.add_all(nrens.values())
+        db.session.commit()
+
+        response = client.get('/api/data-download/', headers={'Accept': ['application/json']})
+        assert response.status_code == 200
+        json = response.get_json()
+        assert not any([d.get('data') for d in json])
+
+        for model, *_ in models:
+            setup(model, nrens)
+
+        response = client.get('/api/data-download/', headers={'Accept': ['application/json']})
+        assert response.status_code == 200
+        json = response.get_json()
+        data_counts = [len(d['data']) for d in json]
+        assert sum(data_counts) > 0
+
+        assert all([len(d['data']) > 0 for d in json if d['name'] != 'Survey Comments'])
+        assert len([d for d in json if len(d['data']) == 0]) == 1  # only no data for survey comments