Skip to content
This repository was archived by the owner on Apr 2, 2025. It is now read-only.

Commit db236c5

Browse files
committed
refactor (tests): move backend functions to ... backends.py
1 parent 8c96be3 commit db236c5

File tree

2 files changed

+146
-129
lines changed

2 files changed

+146
-129
lines changed

tests/application.py

Lines changed: 9 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,162 +1,42 @@
11
from collections import defaultdict
22
from collections.abc import AsyncIterator
33
from contextlib import asynccontextmanager
4-
from datetime import datetime, timezone
54
from typing import Any, Literal, Self
6-
from uuid import uuid4
75

8-
from fastapi import FastAPI, Request
6+
from fastapi import FastAPI
97
from pydantic import BaseModel, Field, model_validator
10-
from returns.maybe import Maybe, Nothing, Some
11-
from returns.result import Failure, ResultE, Success
128

139
from stapi_fastapi.models.conformance import CORE
1410
from stapi_fastapi.models.opportunity import (
15-
Opportunity,
1611
OpportunityProperties,
17-
OpportunityRequest,
1812
)
1913
from stapi_fastapi.models.order import (
2014
Order,
2115
OrderParameters,
22-
OrderPayload,
23-
OrderProperties,
24-
OrderSearchParameters,
2516
OrderStatus,
26-
OrderStatusCode,
2717
)
2818
from stapi_fastapi.models.product import (
2919
Product,
3020
Provider,
3121
ProviderRole,
3222
)
33-
from stapi_fastapi.routers.product_router import ProductRouter
3423
from stapi_fastapi.routers.root_router import RootRouter
3524

25+
from .backends import (
26+
mock_create_order,
27+
mock_get_order,
28+
mock_get_order_statuses,
29+
mock_get_orders,
30+
mock_search_opportunities,
31+
)
32+
3633

3734
class InMemoryOrderDB:
3835
def __init__(self) -> None:
3936
self._orders: dict[str, Order] = {}
4037
self._statuses: dict[str, list[OrderStatus]] = defaultdict(list)
4138

4239

43-
async def mock_get_orders(
44-
request: Request, next: str | None, limit: int
45-
) -> ResultE[tuple[list[Order], Maybe[str]]]:
46-
"""
47-
Return orders from backend. Handle pagination/limit if applicable
48-
"""
49-
try:
50-
start = 0
51-
limit = min(limit, 100)
52-
order_ids = [*request.state._orders_db._orders.keys()]
53-
54-
if next:
55-
start = order_ids.index(next)
56-
end = start + limit
57-
ids = order_ids[start:end]
58-
orders = [request.state._orders_db._orders[order_id] for order_id in ids]
59-
60-
if end > 0 and end < len(order_ids):
61-
return Success(
62-
(orders, Some(request.state._orders_db._orders[order_ids[end]].id))
63-
)
64-
return Success((orders, Nothing))
65-
except Exception as e:
66-
return Failure(e)
67-
68-
69-
async def mock_get_order(order_id: str, request: Request) -> ResultE[Maybe[Order]]:
70-
"""
71-
Show details for order with `order_id`.
72-
"""
73-
74-
return Success(Maybe.from_optional(request.state._orders_db._orders.get(order_id)))
75-
76-
77-
async def mock_get_order_statuses(
78-
order_id: str, request: Request, next: str | None, limit: int
79-
) -> ResultE[tuple[list[OrderStatus], Maybe[str]]]:
80-
try:
81-
start = 0
82-
limit = min(limit, 100)
83-
statuses = request.state._orders_db._statuses[order_id]
84-
85-
if next:
86-
start = int(next)
87-
end = start + limit
88-
stati = statuses[start:end]
89-
90-
if end > 0 and end < len(statuses):
91-
return Success((stati, Some(str(end))))
92-
return Success((stati, Nothing))
93-
except Exception as e:
94-
return Failure(e)
95-
96-
97-
async def mock_search_opportunities(
98-
product_router: ProductRouter,
99-
search: OpportunityRequest,
100-
request: Request,
101-
next: str | None,
102-
limit: int,
103-
) -> ResultE[tuple[list[Opportunity], Maybe[str]]]:
104-
try:
105-
start = 0
106-
limit = min(limit, 100)
107-
if next:
108-
start = int(next)
109-
end = start + limit
110-
opportunities = [
111-
o.model_copy(update=search.model_dump())
112-
for o in request.state._opportunities[start:end]
113-
]
114-
if end > 0 and end < len(request.state._opportunities):
115-
return Success((opportunities, Some(str(end))))
116-
return Success((opportunities, Nothing))
117-
except Exception as e:
118-
return Failure(e)
119-
120-
121-
async def mock_create_order(
122-
product_router: ProductRouter, payload: OrderPayload, request: Request
123-
) -> ResultE[Order]:
124-
"""
125-
Create a new order.
126-
"""
127-
try:
128-
status = OrderStatus(
129-
timestamp=datetime.now(timezone.utc),
130-
status_code=OrderStatusCode.received,
131-
)
132-
order = Order(
133-
id=str(uuid4()),
134-
geometry=payload.geometry,
135-
properties=OrderProperties(
136-
product_id=product_router.product.id,
137-
created=datetime.now(timezone.utc),
138-
status=status,
139-
search_parameters=OrderSearchParameters(
140-
geometry=payload.geometry,
141-
datetime=payload.datetime,
142-
filter=payload.filter,
143-
),
144-
order_parameters=payload.order_parameters.model_dump(),
145-
opportunity_properties={
146-
"datetime": "2024-01-29T12:00:00Z/2024-01-30T12:00:00Z",
147-
"off_nadir": 10,
148-
},
149-
),
150-
links=[],
151-
)
152-
153-
request.state._orders_db._orders[order.id] = order
154-
request.state._orders_db._statuses[order.id].insert(0, status)
155-
return Success(order)
156-
except Exception as e:
157-
return Failure(e)
158-
159-
16040
class MyProductConstraints(BaseModel):
16141
off_nadir: int
16242

tests/backends.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
from datetime import datetime, timezone
2+
from uuid import uuid4
3+
4+
from fastapi import Request
5+
from returns.maybe import Maybe, Nothing, Some
6+
from returns.result import Failure, ResultE, Success
7+
8+
from stapi_fastapi.models.opportunity import (
9+
Opportunity,
10+
OpportunityRequest,
11+
)
12+
from stapi_fastapi.models.order import (
13+
Order,
14+
OrderPayload,
15+
OrderProperties,
16+
OrderSearchParameters,
17+
OrderStatus,
18+
OrderStatusCode,
19+
)
20+
from stapi_fastapi.routers.product_router import ProductRouter
21+
22+
23+
async def mock_get_orders(
24+
request: Request, next: str | None, limit: int
25+
) -> ResultE[tuple[list[Order], Maybe[str]]]:
26+
"""
27+
Return orders from backend. Handle pagination/limit if applicable
28+
"""
29+
try:
30+
start = 0
31+
limit = min(limit, 100)
32+
order_ids = [*request.state._orders_db._orders.keys()]
33+
34+
if next:
35+
start = order_ids.index(next)
36+
end = start + limit
37+
ids = order_ids[start:end]
38+
orders = [request.state._orders_db._orders[order_id] for order_id in ids]
39+
40+
if end > 0 and end < len(order_ids):
41+
return Success(
42+
(orders, Some(request.state._orders_db._orders[order_ids[end]].id))
43+
)
44+
return Success((orders, Nothing))
45+
except Exception as e:
46+
return Failure(e)
47+
48+
49+
async def mock_get_order(order_id: str, request: Request) -> ResultE[Maybe[Order]]:
50+
"""
51+
Show details for order with `order_id`.
52+
"""
53+
54+
return Success(Maybe.from_optional(request.state._orders_db._orders.get(order_id)))
55+
56+
57+
async def mock_get_order_statuses(
58+
order_id: str, request: Request, next: str | None, limit: int
59+
) -> ResultE[tuple[list[OrderStatus], Maybe[str]]]:
60+
try:
61+
start = 0
62+
limit = min(limit, 100)
63+
statuses = request.state._orders_db._statuses[order_id]
64+
65+
if next:
66+
start = int(next)
67+
end = start + limit
68+
stati = statuses[start:end]
69+
70+
if end > 0 and end < len(statuses):
71+
return Success((stati, Some(str(end))))
72+
return Success((stati, Nothing))
73+
except Exception as e:
74+
return Failure(e)
75+
76+
77+
async def mock_search_opportunities(
78+
product_router: ProductRouter,
79+
search: OpportunityRequest,
80+
request: Request,
81+
next: str | None,
82+
limit: int,
83+
) -> ResultE[tuple[list[Opportunity], Maybe[str]]]:
84+
try:
85+
start = 0
86+
limit = min(limit, 100)
87+
if next:
88+
start = int(next)
89+
end = start + limit
90+
opportunities = [
91+
o.model_copy(update=search.model_dump())
92+
for o in request.state._opportunities[start:end]
93+
]
94+
if end > 0 and end < len(request.state._opportunities):
95+
return Success((opportunities, Some(str(end))))
96+
return Success((opportunities, Nothing))
97+
except Exception as e:
98+
return Failure(e)
99+
100+
101+
async def mock_create_order(
102+
product_router: ProductRouter, payload: OrderPayload, request: Request
103+
) -> ResultE[Order]:
104+
"""
105+
Create a new order.
106+
"""
107+
try:
108+
status = OrderStatus(
109+
timestamp=datetime.now(timezone.utc),
110+
status_code=OrderStatusCode.received,
111+
)
112+
order = Order(
113+
id=str(uuid4()),
114+
geometry=payload.geometry,
115+
properties=OrderProperties(
116+
product_id=product_router.product.id,
117+
created=datetime.now(timezone.utc),
118+
status=status,
119+
search_parameters=OrderSearchParameters(
120+
geometry=payload.geometry,
121+
datetime=payload.datetime,
122+
filter=payload.filter,
123+
),
124+
order_parameters=payload.order_parameters.model_dump(),
125+
opportunity_properties={
126+
"datetime": "2024-01-29T12:00:00Z/2024-01-30T12:00:00Z",
127+
"off_nadir": 10,
128+
},
129+
),
130+
links=[],
131+
)
132+
133+
request.state._orders_db._orders[order.id] = order
134+
request.state._orders_db._statuses[order.id].insert(0, status)
135+
return Success(order)
136+
except Exception as e:
137+
return Failure(e)

0 commit comments

Comments
 (0)