tbe-mcs-app

Basic microservice setup for tbe project


Install
pip install tbe-mcs-app==0.1.7

Documentation

Rationale

Tbe ecosystem contains of a lot of microservices, which requires unification, reusability.

This package represents a common setup for any tbe microservice

Config

App configuration assumes to be setup via data class with validation

Current setup is:

@attr.s
class AppConfig:
    """Configuration of the aiohttp application."""

    REDIS_CACHE = attr.ib(
        default=env.str("REDIS_CACHE", default=""),
        validator=attr.validators.instance_of(str),
    )
    SENTRY_DSN = attr.ib(
        default=env.str("SENTRY_DSN", default=""),
        validator=attr.validators.instance_of(str),
    )
    DEBUG = attr.ib(
        default=env.bool("DEBUG", default=False),
        validator=attr.validators.instance_of(bool),
    )
    DEBUG_TOOLBAR = attr.ib(
        default=env.bool(
            "DEBUG_TOOLBAR", default=False
        ),
        validator=attr.validators.instance_of(bool),
    )
    HOST = attr.ib(
        default=env.str("HOST", default="0.0.0.0"),
        validator=attr.validators.instance_of(str),
    )
    PORT = attr.ib(
        default=env.int("PORT", default=80),
        validator=attr.validators.instance_of(int),
    )

Use

import pathlib
import os

import trafaret as t
import yaml
from aiohttp import web

from tbe_mcs_app import build_tbe_mcs_app
from tbe_mcs_app.structs import (
    WebRoute,
    Http,
    AppConfig,
)


async def health_check(request):
    return web.Response()


async def get_some_data(request):
    payload = await request.json()
    return web.json_response(data=payload)


async def test_tbe_mcs_app_(
    tmpdir, aiohttp_client, caplog
):
    app_config = AppConfig(DEBUG=True)
    web_routes = [
        WebRoute(
            endpoint="/health_check",
            https=[
                Http(
                    method="GET", handler=health_check
                )
            ],
        ),
        WebRoute(
            endpoint="/get_some_data",
            https=[
                Http(
                    method="POST",
                    handler=get_some_data,
                )
            ],
        ),
    ]

    app = build_tbe_mcs_app(
        web_routes, app_config=app_config
    )

    client = await aiohttp_client(app)
    resp = await client.get("/health_check")
    assert resp.status == 200
    resp = await client.get("/api/doc")
    assert resp.status == 200
    resp = await client.get("/_debugtoolbar")
    assert resp.status == 200

    resp = await client.post(
        "/get_some_data",
        json={"test_key": "test_value"},
    )
    assert await resp.json() == {
        "test_key": "test_value"
    }

    resp = await client.get("/not_exists")
    assert await resp.json() == {
        "error": "HTTPNotFound: ('Not Found',)"
    }

    resp = await client.get("/get_some_data")
    assert await resp.json() == {
        "error": "HTTPMethodNotAllowed: ('Method Not Allowed',)"
    }