Skip to content
Snippets Groups Projects
Select Git revision
  • 841d489491acffacedc8ff091a3ea13042361c12
  • master default protected
  • release-1.10 protected
  • dev protected
  • 549-test-oai-pmh
  • 545-saving-multiple-times-breaks-pid-metadata
  • release-1.9 protected
  • 499-standalone-compute-service-2
  • 539-load-tests
  • hotfix/helm-chart
  • luca_ba_new_interface
  • 534-bug-when-adding-access-to-user-that-is-not-registered-at-dashboard-service
  • release-1.8 protected
  • 533-integrate-semantic-recommendation
  • feature/openshift
  • 518-spark-doesn-t-map-the-headers-correct
  • 485-fixity-checks
  • 530-various-schema-problems-with-subsets
  • release-1.7 protected
  • fix/auth-service
  • fix/pid-list
  • v1.10.0-rc13 protected
  • v1.10.0-rc12 protected
  • v1.10.0-rc11 protected
  • v1.10.0-rc10 protected
  • v1.10.0-rc9 protected
  • v1.10.0-rc8 protected
  • v1.10.0-rc7 protected
  • v1.10.0-rc6 protected
  • v1.10.0-rc5 protected
  • v1.10.0-rc4 protected
  • v1.10.0-rc3 protected
  • v1.10.0-rc2 protected
  • v1.10.0rc1 protected
  • v1.10.0rc0 protected
  • v1.10.0 protected
  • v1.9.3 protected
  • v1.9.2 protected
  • v1.9.2-rc0 protected
  • v1.9.1 protected
  • v1.9.0 protected
41 results

test_dtos.py

Blame
  • test_dtos.py 3.65 KiB
    import inspect
    import logging
    import sys
    import unittest
    from logging.config import dictConfig
    from math import floor
    
    from yaml import safe_load
    
    from dbrepo.api import dto
    
    logging.addLevelName(level=logging.NOTSET, levelName='TRACE')
    logging.basicConfig(level=logging.DEBUG)
    
    # logging configuration
    dictConfig({
        'version': 1,
        'formatters': {
            'default': {
                'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
            },
            'simple': {
                'format': '[%(asctime)s] %(levelname)s: %(message)s',
            },
        },
        'handlers': {'console': {
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',
            'formatter': 'simple'  # default
        }},
        'root': {
            'level': 'DEBUG',
            'handlers': ['console']
        }
    })
    
    
    class DtoUnitTest(unittest.TestCase):
        schemas = None
        models: [()] = []
        exclusions: [str] = ['EnumType']
        found: int = 0
        skipped: [str] = []
    
        def setUp(self):
            with open('../../.docs/.openapi/api.yaml') as fh:
                self.schemas = safe_load(fh)['components']['schemas']
                for name, obj in inspect.getmembers(sys.modules[dto.__name__]):
                    self.found += 1
                    if not inspect.isclass(obj):
                        continue
                    if f'{name}Dto' not in self.schemas or name not in self.exclusions:
                        logging.debug(f'skip model {name}: OpenAPI schema definition {name}Dto not found')
                        self.skipped.append(f'{name}Dto')
                        continue
                    self.models.append((name, obj))
    
        def build_model(self, name: str, obj: any, definition: any) -> dict:
            model_dict = dict()
            for property in definition['properties']:
                if 'example' in definition['properties'][property]:
                    if '$ref' not in definition['properties'][property]:
                        model_dict[property] = definition['properties'][property]['example']
                        continue
                    ref = definition['properties'][property]['$ref'][len('#/components/schemas/'):-3]
                    # recursive call
                    model_dict[property] = self.build_model(ref, self.get_model(ref), self.schemas[f'{ref}Dto'])
                    continue
                if 'items' in definition['properties'][property]:
                    if '$ref' not in definition['properties'][property]['items']:
                        continue
                    ref = definition['properties'][property]['items']['$ref'][len('#/components/schemas/'):-3]
                    # recursive call
                    model_dict[property] = [self.build_model(ref, self.get_model(ref), self.schemas[f'{ref}Dto'])]
                    continue
                if '$ref' in definition['properties'][property]:
                    ref = definition['properties'][property]['$ref'][len('#/components/schemas/'):-3]
                    # recursive call
                    model_dict[property] = self.build_model(ref, self.get_model(ref), self.schemas[f'{ref}Dto'])
            return model_dict
    
        def get_model(self, ref: str):
            for name, obj in self.models:
                if name == ref:
                    return obj
            return None
    
        def test_dtos_succeeds(self):
            logging.info(f'Found {self.found} model(s) in {dto.__name__}')
            for name, obj in self.models:
                logging.debug(f'building model: {name} against OpenAPI schema definition {name}Dto')
                model = obj(**self.build_model(name, obj, self.schemas[f'{name}Dto']))
            logging.warning(f'Unable to find {len(self.skipped)} OpenAPI schema definition(s): {self.skipped}')
            logging.info(f'Coverage: {floor((1 - len(self.skipped) / self.found) * 100)}%')
            pass