Skip to content
Snippets Groups Projects
test_data_download.py 2.38 KiB
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