Exemplo n.º 1
0
 def test_response(self) -> None:
     tornado_request = HTTPRequest(url="http://example.com")
     tornado_response = HTTPResponse(request=tornado_request, code=200)
     expected = OpenAPIResponse(
         data="",
         status_code=200,
         mimetype="text/html",
     )
     openapi_response = TornadoResponseFactory.create(tornado_response)
     self.assertEqual(attr.asdict(expected), attr.asdict(openapi_response))
Exemplo n.º 2
0
    def test_get_metadata_for_combine_archive_file_as_biosimulations(self):
        archive_filename = os.path.join(
            self.FIXTURES_DIR,
            'Ciliberto-J-Cell-Biol-2003-morphogenesis-checkpoint-continuous.omex'
        )
        fid = open(archive_filename, 'rb')

        data = MultiDict([
            ('file', fid),
            ('omexMetadataFormat', OmexMetadataInputFormat.rdfxml.value),
        ])
        endpoint = '/combine/metadata/biosimulations'
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type="multipart/form-data")
        self.assertEqual(response.status_code, 200, response.json)
        metadata = response.json

        sed_output_specs_filename = os.path.join(
            self.FIXTURES_DIR,
            'Ciliberto-J-Cell-Biol-2003-morphogenesis-checkpoint-continuous.md.json'
        )
        with open(sed_output_specs_filename, 'r') as file:
            expected_metadata = json.load(file)
        self.assertEqual(metadata, expected_metadata)

        fid.close()

        # validate request and response
        if hasattr(self, "request_validator"):
            with open(archive_filename, 'rb') as file:
                file_content = file.read()

            request = OpenAPIRequest(
                full_url_pattern=
                'https://127.0.0.1/combine/metadata/biosimulations',
                method='post',
                body={
                    'file': file_content,
                    'omexMetadataFormat': OmexMetadataInputFormat.rdfxml.value,
                },
                mimetype='multipart/form-data',
                parameters=RequestParameters(),
            )

            result = self.request_validator.validate(request)
            result.raise_for_errors()

            response = OpenAPIResponse(data=json.dumps(expected_metadata),
                                       status_code=200,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()
Exemplo n.º 3
0
 def create(cls,
            data,
            status_code=200,
            headers=None,
            mimetype="application/json"):
     headers = Headers(headers or {})
     return OpenAPIResponse(
         data=data,
         status_code=status_code,
         headers=headers,
         mimetype=mimetype,
     )
    def test_validate_is_valid(self):
        archive_filename = os.path.join(self.FIXTURES_DIR,
                                        self.TEST_CASE + '.omex')
        fid = open(archive_filename, 'rb')

        data = MultiDict([
            ('file', fid),
            ('omexMetadataFormat', OmexMetadataInputFormat.rdfxml.value),
            ('omexMetadataSchema', OmexMetadataSchema.biosimulations.value),
            ('validateSedmlModels', False),
        ])
        endpoint = '/combine/validate'
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type="multipart/form-data")
        fid.close()
        self.assertEqual(response.status_code, 200, response.json)
        validation_report = response.json

        validation_report.pop('warnings')
        self.assertEqual(validation_report, {
            "_type": "ValidationReport",
            "status": "warnings"
        })

        # validate request and response
        if hasattr(self, "request_validator"):
            with open(archive_filename, 'rb') as file:
                file_content = file.read()

            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/combine/validate',
                method='post',
                body={
                    'file': file_content,
                    'omexMetadataFormat': OmexMetadataInputFormat.rdfxml.value,
                    'omexMetadataSchema':
                    OmexMetadataSchema.biosimulations.value,
                },
                mimetype='multipart/form-data',
                parameters=RequestParameters(),
            )

            result = self.request_validator.validate(request)
            result.raise_for_errors()

            response = OpenAPIResponse(data=json.dumps(validation_report),
                                       status_code=200,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()
Exemplo n.º 5
0
    def create(cls, response):
        status_code = int(response.status[:3])

        mimetype = ''
        if response.content_type:
            mimetype = response.content_type.partition(";")[0]
        else:
            mimetype = response.options.default_media_type

        return OpenAPIResponse(
            data=response.body,
            status_code=status_code,
            mimetype=mimetype,
        )
Exemplo n.º 6
0
def create_and_validate_response(request, response):
    """
    Helper function to create OpenAPIResponse and validate it
    :param request: OpenAPIRequest
    :param response: API response
    :return:
        - result: result of response validation
    """
    response = OpenAPIResponse(data=response.content,
                               status_code=response.status_code,
                               mimetype='application/json')

    validator = ResponseValidator(spec)
    result = validator.validate(request, response)
    return result
    def test_get_file_in_combine_archive_url(self):
        archive_filename = os.path.join(
            self.FIXTURES_DIR,
            'Ciliberto-J-Cell-Biol-2003-morphogenesis-checkpoint-continuous.omex'
        )
        with open(archive_filename, 'rb') as file:
            archive_url_content = file.read()

        archive_url = 'https://archive.combine.org'
        resolve_archive_response = mock.Mock(
            raise_for_status=lambda: None,
            content=archive_url_content,
        )
        endpoint = '/combine/file?url={}&location={}'.format(
            urllib.parse.quote(archive_url),
            urllib.parse.quote('Figure1.jpg'),
        )
        with mock.patch('requests.get', return_value=resolve_archive_response):
            with app.app.app.test_client() as client:
                response = client.get(endpoint)
        self.assertEqual(response.status_code, 200, response.json)
        image_filename = os.path.join(self.temp_dirname, 'image')
        with open(image_filename, 'wb') as file:
            file.write(response.data)

        self.assertEqual(imghdr.what(image_filename), 'jpeg')

        # validate request and response
        if hasattr(self, "request_validator"):
            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/combine/file',
                method='get',
                body={
                    'url': archive_url,
                    'location': 'Figure1.jpg',
                },
                mimetype='multipart/form-data',
                parameters=RequestParameters(url=archive_url,
                                             location='Figure1.jpg'),
            )
            result = self.request_validator.validate(request)
            result.raise_for_errors()

            response = OpenAPIResponse(data=response.data,
                                       status_code=200,
                                       mimetype='image/jpeg')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()
Exemplo n.º 8
0
    def create(cls, response):
        status_code = int(response.status[:3])

        mimetype = ''
        if response.content_type:
            mimetype = response.content_type.partition(";")[0]
        else:
            mimetype = response.options.default_media_type

        data = get_response_text(response)

        return OpenAPIResponse(
            data=data,
            status_code=status_code,
            headers=response.headers,
            mimetype=mimetype,
        )
    def test_get_file_in_combine_archive_error_handling(self):
        endpoint = '/combine/file?url={}&location={}'.format(
            urllib.parse.quote('x'),
            urllib.parse.quote('Figure1.jpg'),
        )
        with app.app.app.test_client() as client:
            response = client.get(endpoint)
        self.assertEqual(response.status_code, 400, response.json)
        self.assertTrue(response.json['title'].startswith(
            'COMBINE/OMEX archive could not be loaded'))

        if hasattr(self, "response_validator"):
            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/combine/file',
                method='get',
                mimetype=None,
                parameters=RequestParameters(url='x', location='Figure1.jpg'),
            )
            response = OpenAPIResponse(data=json.dumps(response.json),
                                       status_code=400,
                                       mimetype='image/jpeg')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()

        archive_filename = os.path.join(
            self.FIXTURES_DIR,
            'Ciliberto-J-Cell-Biol-2003-morphogenesis-checkpoint-continuous.omex'
        )
        with open(archive_filename, 'rb') as file:
            archive_url_content = file.read()

        archive_url = 'https://archive.combine.org'
        resolve_archive_response = mock.Mock(
            raise_for_status=lambda: None,
            content=archive_url_content,
        )
        endpoint = '/combine/file?url={}&location={}'.format(
            urllib.parse.quote(archive_url),
            urllib.parse.quote('undefined'),
        )
        with mock.patch('requests.get', return_value=resolve_archive_response):
            with app.app.app.test_client() as client:
                response = client.get(endpoint)
        self.assertEqual(response.status_code, 400, response.json)
        self.assertIn('not a valid location', response.json['title'])
Exemplo n.º 10
0
    def test_get_metadata_for_combine_archive_error_handling(self):
        endpoint = '/combine/metadata/biosimulations'
        data = MultiDict([
            ('omexMetadataFormat', OmexMetadataInputFormat.rdfxml.value),
        ])
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type='multipart/form-data')
        self.assertEqual(response.status_code, 400, response.json)
        self.assertIn('must be used', response.json['title'])

        if hasattr(self, "response_validator"):
            request = OpenAPIRequest(
                full_url_pattern=
                'https://127.0.0.1/combine/metadata/biosimulations',
                method='post',
                body={
                    'url': 'x',
                    'omexMetadataFormat': OmexMetadataInputFormat.rdfxml.value,
                },
                mimetype=None,
                parameters=RequestParameters(),
            )
            response = OpenAPIResponse(data=json.dumps(response.json),
                                       status_code=400,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()

        archive_filename = os.path.join(self.FIXTURES_DIR,
                                        'invalid-metadata.omex')
        fid = open(archive_filename, 'rb')
        data = MultiDict([
            ('file', fid),
            ('omexMetadataFormat', OmexMetadataInputFormat.rdfxml.value),
        ])
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type="multipart/form-data")
        self.assertEqual(response.status_code, 400, response.json)
        self.assertIn('is not valid', response.json['title'])
        fid.close()
Exemplo n.º 11
0
    def test_get_parameters_variables_for_simulation_from_file(self):
        endpoint = '/sed-ml/get-parameters-variables-for-simulation'

        model_filename = os.path.abspath(
            os.path.join(self.FIXTURES_DIR,
                         'Chaouiya-BMC-Syst-Biol-2013-EGF-TNFa-signaling.xml'))
        model_fid = open(model_filename, 'rb')

        data = MultiDict([
            ('modelLanguage', 'urn:sedml:language:sbml'),
            ('modelingFramework', 'SBO_0000547'),
            ('simulationType', 'SedUniformTimeCourseSimulation'),
            ('simulationAlgorithm', 'KISAO_0000450'),
            ('modelFile', model_fid),
        ])
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type="multipart/form-data")

        model_fid.close()

        self.assertEqual(response.status_code, 200, response.json)
        sed_doc = response.json
        vars = [
            data_gen['variables'][0] for data_gen in sed_doc['dataGenerators']
        ]

        self.assertEqual(vars[0]['id'], 'time')
        self.assertEqual(vars[0]['name'], 'Time')
        self.assertEqual(vars[0]['symbol'], Symbol.time)
        self.assertNotIn('target', vars[0])

        self.assertEqual(vars[-1]['id'], 'level_species_nik')
        self.assertEqual(vars[-1]['name'], 'Level of species "nik"')
        self.assertNotIn('symbol', vars[-1])

        vars[-1]['target']['namespaces'].sort(key=lambda ns: ns['prefix'])
        self.assertEqual(
            vars[-1]['target'],
            {
                "_type":
                "SedTarget",
                "value":
                "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='nik']",
                "namespaces": [
                    {
                        "_type":
                        "Namespace",
                        "prefix":
                        "qual",
                        "uri":
                        "http://www.sbml.org/sbml/level3/version1/qual/version1"
                    },
                    {
                        "_type": "Namespace",
                        "prefix": "sbml",
                        "uri": "http://www.sbml.org/sbml/level3/version1/core"
                    },
                ]
            },
        )

        # validate request and response
        if hasattr(self, "request_validator"):
            with open(model_filename, 'rb') as file:
                model_content = file.read()
            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/' + endpoint,
                method='post',
                body={
                    'modelLanguage': 'urn:sedml:language:sbml',
                    'modelingFramework': 'SBO_0000547',
                    'simulationType': 'SedUniformTimeCourseSimulation',
                    'simulationAlgorithm': 'KISAO_0000029',
                    'modelFile': model_content,
                },
                mimetype='multipart/form-data',
                parameters=RequestParameters(),
            )

            result = self.request_validator.validate(request)
            result.raise_for_errors()

            response = OpenAPIResponse(data=json.dumps(sed_doc),
                                       status_code=200,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()
    def test_get_manifest_for_combine_archive_error_handling(self):
        endpoint = '/combine/manifest'
        data = MultiDict([
            ('url', 'x'),
        ])
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type="multipart/form-data")
        self.assertEqual(response.status_code, 400, response.json)
        self.assertTrue(
            response.json['title'].startswith('File could not be loaded from'))

        if hasattr(self, "response_validator"):
            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/combine/manifest',
                method='post',
                body={
                    'url': 'x',
                },
                mimetype=None,
                parameters=RequestParameters(),
            )
            response = OpenAPIResponse(data=json.dumps(response.json),
                                       status_code=400,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()

        response = mock.Mock(
            raise_for_status=lambda: None,
            content=b'.',
        )
        with mock.patch('requests.get', return_value=response):
            with app.app.app.test_client() as client:
                response = client.post(endpoint,
                                       data=data,
                                       content_type="multipart/form-data")
        self.assertEqual(response.status_code, 400, response.json)
        self.assertIn(
            'File is not a valid manifest or a COMBINE/OMEX which contains a valid manifest',
            response.json['title'])

        archive_filename = os.path.join(self.FIXTURES_DIR, 'no-manifest.omex')
        with open(archive_filename, 'rb') as file:
            archive_url_content = file.read()
        response = mock.Mock(
            raise_for_status=lambda: None,
            content=archive_url_content,
        )
        with mock.patch('requests.get', return_value=response):
            with app.app.app.test_client() as client:
                response = client.post(endpoint,
                                       data=data,
                                       content_type="multipart/form-data")
        self.assertEqual(response.status_code, 400, response.json)
        self.assertIn('does not contain a manifest', response.json['title'])

        archive_filename = os.path.join(self.FIXTURES_DIR, 'bad-manifest.omex')
        with open(archive_filename, 'rb') as file:
            archive_url_content = file.read()
        response = mock.Mock(
            raise_for_status=lambda: None,
            content=archive_url_content,
        )
        with mock.patch('requests.get', return_value=response):
            with app.app.app.test_client() as client:
                response = client.post(endpoint,
                                       data=data,
                                       content_type="multipart/form-data")
        self.assertEqual(response.status_code, 400, response.json)
        self.assertIn(
            'File is not a valid manifest or a COMBINE/OMEX which contains a valid manifest',
            response.json['title'])
Exemplo n.º 13
0
    def test_get_metadata_for_combine_archive_file_as_rdf_triples(self):
        archive_filename = os.path.join(
            self.FIXTURES_DIR,
            'Ciliberto-J-Cell-Biol-2003-morphogenesis-checkpoint-continuous.omex'
        )
        fid = open(archive_filename, 'rb')

        data = MultiDict([
            ('file', fid),
            ('omexMetadataFormat', OmexMetadataInputFormat.rdfxml.value),
        ])
        endpoint = '/combine/metadata/rdf'
        with app.app.app.test_client() as client:
            response = client.post(endpoint,
                                   data=data,
                                   content_type="multipart/form-data")
        self.assertEqual(response.status_code, 200, response.json)
        metadata = response.json

        self.assertEqual(
            metadata[0], {
                '_type': 'RdfTriple',
                'subject': {
                    '_type':
                    'RdfUriNode',
                    'value':
                    'http://omex-library.org/Ciliberto-J-Cell-Biol-2003-morphogenesis-checkpoint-continuous.omex',
                },
                'predicate': {
                    '_type': 'RdfUriNode',
                    'value': 'http://purl.org/dc/elements/1.1/title',
                },
                'object': {
                    '_type':
                    'RdfLiteralNode',
                    'value':
                    'Morphogenesis checkpoint in budding yeast (continuous) (Ciliberto et al., Journal Cell Biology, 2003)',
                }
            })

        fid.close()

        # validate request and response
        if hasattr(self, "request_validator"):
            with open(archive_filename, 'rb') as file:
                file_content = file.read()

            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/combine/metadata/rdf',
                method='post',
                body={
                    'file': file_content,
                    'omexMetadataFormat': OmexMetadataInputFormat.rdfxml.value,
                },
                mimetype='multipart/form-data',
                parameters=RequestParameters(),
            )

            result = self.request_validator.validate(request)
            result.raise_for_errors()

            response = OpenAPIResponse(data=json.dumps(metadata),
                                       status_code=200,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()
    def test_get_manifest_for_combine_archive_url(self):
        archive_filename = os.path.join(self.FIXTURES_DIR,
                                        self.TEST_CASE + '.omex')
        with open(archive_filename, 'rb') as file:
            archive_url_content = file.read()

        archive_url = 'https://archive.combine.org'
        data = MultiDict([
            ('url', archive_url),
        ])
        response = mock.Mock(
            raise_for_status=lambda: None,
            content=archive_url_content,
        )
        endpoint = '/combine/manifest'
        with mock.patch('requests.get', return_value=response):
            with app.app.app.test_client() as client:
                response = client.post(endpoint,
                                       data=data,
                                       content_type="multipart/form-data")
        self.assertEqual(response.status_code, 200, response.json)
        manifest = response.json

        expected_manifest = {
            '_type':
            'CombineArchiveManifest',
            'contents': [{
                '_type': 'CombineArchiveManifestContent',
                'format': 'http://identifiers.org/combine.specifications/sbml',
                'location': {
                    '_type': 'CombineArchiveManifestLocation',
                    'path': './Caravagna2010.xml',
                    'value': {
                        '_type': 'CombineArchiveContentFile',
                        'filename': 'Caravagna2010.xml',
                    },
                },
                'master': False
            }, {
                '_type': 'CombineArchiveManifestContent',
                'format':
                'http://identifiers.org/combine.specifications/sed-ml',
                'location': {
                    '_type': 'CombineArchiveManifestLocation',
                    'path': './BIOMD0000000912_sim.sedml',
                    'value': {
                        '_type': 'CombineArchiveContentFile',
                        'filename': 'BIOMD0000000912_sim.sedml',
                    },
                },
                'master': True
            }, {
                '_type': 'CombineArchiveManifestContent',
                'format': 'http://identifiers.org/combine.specifications/omex',
                'location': {
                    '_type': 'CombineArchiveManifestLocation',
                    'path': '.',
                    'value': {
                        '_type': 'CombineArchiveContentFile',
                        'filename': '.',
                    },
                },
                'master': False
            }, {
                '_type': 'CombineArchiveManifestContent',
                'format':
                'http://identifiers.org/combine.specifications/omex-metadata',
                'location': {
                    '_type': 'CombineArchiveManifestLocation',
                    'path': 'metadata.rdf',
                    'value': {
                        '_type': 'CombineArchiveContentFile',
                        'filename': 'metadata.rdf',
                    },
                },
                'master': False
            }]
        }
        self.assertEqual(manifest, expected_manifest, manifest)

        # validate request and response
        if hasattr(self, "request_validator"):
            request = OpenAPIRequest(
                full_url_pattern='https://127.0.0.1/combine/manifest',
                method='post',
                body={
                    'url': archive_url,
                },
                mimetype='multipart/form-data',
                parameters=RequestParameters(),
            )
            result = self.request_validator.validate(request)
            result.raise_for_errors()

            response = OpenAPIResponse(data=json.dumps(expected_manifest),
                                       status_code=200,
                                       mimetype='application/json')
            result = self.response_validator.validate(request, response)
            result.raise_for_errors()
Exemplo n.º 15
0
 def create(cls, response):
     return OpenAPIResponse(
         data=response.data,
         status_code=response._status_code,
         mimetype=response.mimetype,
     )
Exemplo n.º 16
0
 def create(cls, data, status_code=200, mimetype='application/json'):
     return OpenAPIResponse(
         data=data,
         status_code=status_code,
         mimetype=mimetype,
     )
Exemplo n.º 17
0
def _bottle_response_to_openapi_response(resp: Response) -> OpenAPIResponse:
    return OpenAPIResponse(
        data=resp.body,
        status_code=resp.status_code,
        mimetype=_get_mimetype(resp.content_type)
    )
Exemplo n.º 18
0
 def create(cls, response):
     return OpenAPIResponse(
         data=response.body,
         status_code=response.status_code,
         mimetype=response.headers.get("content-type"),
     )