Testing flasks in Python - creating one API in a repo with a lot of up to unit test via import_module

We have an ETL data API repository. We do all the etl processing inside it, and then spit out the data from the API. These APIs are run by one of a single command that passes the resource class through the server to create the API. the resource class is in the web directory in__init__.py.

This is a great deal and pretty easy to use, but the problem I came up with is trying to get one of 3 available APIs for testing. Our catalog structure looks like this (naming the project "tomato")

tomato

- category_api
    - web
    - etl
    - test
        - here is where we are writing some tests (test_category_api.py)
    - data
- article_api
    - web
    - etl
    - test
    - data
- recommendation_api
    - web
    - etl
    - test
    - data
- common
    - common shit

Inside this test, I have the following test class. On the seventh line below, you will see a comment about where it breaks. This is the method import_module.

    import unittest
    import sys
    import os
    import sys
    import json

    from importlib import import_module
    from flask import Flask
    from flask_restful import Api, abort, wraps
    from flask_restful.utils import cors
    from flask.ext.testing import TestCase

    #dir_above_top_level = os.path.join(os.path.abspath(__file__), '../../..    /')
    #sys.path.append(os.path.abspath(dir_above_top_level))

    _CATEGORY_ENDPOINT = '/v1/category/'
    _PACKAGE_NAME = os.environ['RECO_API_PACKAGE_NAME']
    _CORS = cors.crossdomain(origin='*',
                             headers=['Origin', 'X-Requested-With',
                                      'Content-Type', 'Accept'],
                             methods=['GET', 'HEAD', 'OPTIONS'],
                             max_age=3600)

    class CategoryTests(TestCase):
        def __init__(self):
            self.app = Flask(__name__)
            self._configure_app()
            for resource in self.resource_classes:
                self.api.add_resource(self.resource,
                                      self.resource.URI_TEMPLATE)
        def test_status_code(self):
            self.response = self.client.post(_CATEGORY_ENDPOINT,
                                         data=json.dumps(
                                         {'title': 'Enjoy this delicious food'}),
                                         headers=json.dumps(
                                         {'content-type':'application/json'}))
            self.assertEqual(self.response.status_code, 200)

        def test_version(self):
            self.response = self.client.post(_CATEGORY_ENDPOINT,
                                             data=json.dumps(
                                             {"title": "eat some delicious stuff"}),
                                             headers=json.dumps(
                                             {'content-type':'application/json'}))
            self.assertEqual(json.dumps(self.response['version']), '1')

        def _configure_app(self):
            self.app = Flask(__name__)
            self.app.config['TESTING'] = True
            self.app.debug = True
            self.decorators = [_CORS]
            self.app.Threaded = True
            self.web_package = 'tomato.category.web'
            self.package = import_module('.__init__', self.web_package) # WE BREAK HERE
            self.resources = package.RESOURCE_NAMES
            self.resource_classes = [ getattr(package, resource) for resource in resources ]
            self.api = Api(self.app, catch_all_404s=True, decorators=self.decorators)

    if __name__ == '__main__':
        unittest.main()

:

ImportError: No module named tomato.category.web.__init__

cd , ls tomato/category/web __init__.py .

, API ? , , ?

+4
2

__init__, , , from tomato.category.web import __init__. web.

self.web_package = 'tomato.category.web'
self.package = import_module(self.web_package)
+1

. . . , , .

dir_above_top_level = os.path.join(os.path.abspath(__file__), '../../../..')
sys.path.append(os.path.abspath(dir_above_top_level))

self.web_package = 'tomato.category.web'
self.package = import_module('.__init__', self.web_package)

, API

0

Source: https://habr.com/ru/post/1568196/


All Articles