tests.integrations.test_starlette   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 123
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 78
dl 0
loc 123
rs 10
c 0
b 0
f 0
wmc 18

5 Methods

Rating   Name   Duplication   Size   Complexity  
A ComplexDep.__init__() 0 2 1
A SomeWebSocketHandler.on_connect() 0 3 1
A SomeEndpointHandler.get() 0 2 1
A SomeWebSocketHandler.on_receive() 0 2 1
A SomeWebSocketHandler.on_disconnect() 0 2 1

10 Functions

Rating   Name   Duplication   Size   Complexity  
A some_handler() 0 2 1
A some_async_handler() 0 2 1
A two_dep_handler() 0 2 2
A test_starlette_container_can_handle_websocket_endpoints() 0 16 2
A test_starlette_container_can_handle_websocket_funcs() 0 11 2
A test_the_starlette_container_handles_async_handlers() 0 8 1
A some_websocket_handler() 0 4 1
A test_a_special_starlette_container_can_be_used_and_provides_routes() 0 5 1
A test_the_starlette_container_can_define_request_level_singletons() 0 4 1
A test_the_starlette_container_can_handle_endpoint_classes() 0 11 1
1
import pytest
2
3
from starlette.routing import Route, WebSocketRoute
4
from starlette.endpoints import HTTPEndpoint, WebSocketEndpoint
5
from starlette.responses import PlainTextResponse
6
from starlette.testclient import TestClient
7
8
from lagom import injectable
9
from lagom.integrations.starlette import StarletteIntegration
10
11
12
class MyDep:
13
    pass
14
15
16
class ComplexDep:
17
    def __init__(self, something):
18
        pass
19
20
21
def some_handler(request, dep: MyDep = injectable):
22
    return "ok"
23
24
25
def two_dep_handler(request, dep_one: MyDep = injectable, dep_two: MyDep = injectable):
26
    return "singleton" if dep_one is dep_two else "new instances"
27
28
29
async def some_async_handler(request, dep: MyDep = injectable):
30
    return "ok"
31
32
33
async def some_websocket_handler(session, dep: MyDep = injectable):
34
    await session.accept()
35
    await session.send_text("ok")
36
    await session.close()
37
38
39
class SomeEndpointHandler(HTTPEndpoint):
40
    async def get(self, request, dep: MyDep = injectable):
41
        return PlainTextResponse("ok")
42
43
44
class SomeWebSocketHandler(WebSocketEndpoint):
45
    encoding = "text"
46
47
    async def on_connect(self, websocket, dep: MyDep = injectable):
48
        await websocket.accept()
49
        await websocket.send_text("connected")
50
51
    async def on_receive(self, websocket, data, dep: MyDep = injectable):
52
        await websocket.send_text("received")
53
54
    async def on_disconnect(self, websocket, close_code, dep: MyDep = injectable):
55
        pass
56
57
58
def test_a_special_starlette_container_can_be_used_and_provides_routes(container):
59
    sc = StarletteIntegration(container)
60
    route = sc.route("/", some_handler)
61
    assert isinstance(route, Route)
62
    assert route.endpoint({}) == "ok"
63
64
65
def test_the_starlette_container_can_define_request_level_singletons(container):
66
    sc = StarletteIntegration(container, request_singletons=[MyDep])
67
    route = sc.route("/two", two_dep_handler)
68
    assert route.endpoint({}) == "singleton"
69
70
71
@pytest.mark.asyncio
72
async def test_the_starlette_container_handles_async_handlers(container):
73
    sc = StarletteIntegration(container, request_singletons=[MyDep])
74
75
    route = sc.route("/", some_async_handler)
76
77
    assert isinstance(route, Route)
78
    assert await route.endpoint({}) == "ok"
79
80
81
@pytest.mark.asyncio
82
async def test_the_starlette_container_can_handle_endpoint_classes(container):
83
    sc = StarletteIntegration(container)
84
    route = sc.route("/", SomeEndpointHandler)
85
    assert isinstance(route, Route)
86
87
    client = TestClient(route)
88
    response = client.get("/")
89
90
    assert response.status_code == 200
91
    assert response.text == "ok"
92
93
94
def test_starlette_container_can_handle_websocket_funcs(container):
95
    sc = StarletteIntegration(container)
96
    route = sc.ws_route("/", some_websocket_handler)
97
98
    assert isinstance(route, WebSocketRoute)
99
100
    client = TestClient(route)
101
102
    with client.websocket_connect("/") as session:
103
        text = session.receive_text()
104
        assert text == "ok"
105
106
107
def test_starlette_container_can_handle_websocket_endpoints(container):
108
    sc = StarletteIntegration(container)
109
    route = sc.ws_route("/", SomeWebSocketHandler)
110
111
    assert isinstance(route, WebSocketRoute)
112
113
    client = TestClient(route)
114
115
    with client.websocket_connect("/") as session:
116
        connect_msg = session.receive_text()
117
        assert connect_msg == "connected"
118
119
        session.send_text("hello")
120
        receive_msg = session.receive_text()
121
122
        assert receive_msg == "received"
123