Skip to content

Commit f5de68b

Browse files
Adding a stream test
1 parent 187a487 commit f5de68b

File tree

5 files changed

+171
-0
lines changed

5 files changed

+171
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Code generated by river.codegen. DO NOT EDIT.
2+
from pydantic import BaseModel
3+
from typing import Literal
4+
5+
import replit_river as river
6+
7+
8+
from .test_service import Test_ServiceService
9+
10+
11+
class StreamClient:
12+
def __init__(self, client: river.Client[Literal[None]]):
13+
self.test_service = Test_ServiceService(client)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Code generated by river.codegen. DO NOT EDIT.
2+
from collections.abc import AsyncIterable, AsyncIterator
3+
from typing import Any
4+
import datetime
5+
6+
from pydantic import TypeAdapter
7+
8+
from replit_river.error_schema import RiverError
9+
import replit_river as river
10+
11+
12+
from .stream_method import (
13+
encode_Stream_MethodInput,
14+
Stream_MethodOutput,
15+
Stream_MethodInput,
16+
)
17+
18+
19+
class Test_ServiceService:
20+
def __init__(self, client: river.Client[Any]):
21+
self.client = client
22+
23+
async def stream_method(
24+
self,
25+
inputStream: AsyncIterable[Stream_MethodInput],
26+
) -> AsyncIterator[Stream_MethodOutput | RiverError]:
27+
return self.client.send_stream(
28+
"test_service",
29+
"stream_method",
30+
None,
31+
inputStream,
32+
None,
33+
encode_Stream_MethodInput,
34+
lambda x: TypeAdapter(Stream_MethodOutput).validate_python(
35+
x # type: ignore[arg-type]
36+
),
37+
lambda x: TypeAdapter(RiverError).validate_python(
38+
x # type: ignore[arg-type]
39+
),
40+
)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# ruff: noqa
2+
# Code generated by river.codegen. DO NOT EDIT.
3+
from collections.abc import AsyncIterable, AsyncIterator
4+
import datetime
5+
from typing import (
6+
Any,
7+
Callable,
8+
Dict,
9+
List,
10+
Literal,
11+
Optional,
12+
Mapping,
13+
Union,
14+
Tuple,
15+
TypedDict,
16+
)
17+
18+
from pydantic import BaseModel, Field, TypeAdapter
19+
from replit_river.error_schema import RiverError
20+
21+
import replit_river as river
22+
23+
24+
encode_Stream_MethodInput: Callable[["Stream_MethodInput"], Any] = lambda x: {
25+
k: v
26+
for (k, v) in (
27+
{
28+
"data": x.get("data"),
29+
}
30+
).items()
31+
if v is not None
32+
}
33+
34+
35+
class Stream_MethodInput(TypedDict):
36+
data: str
37+
38+
39+
class Stream_MethodOutput(BaseModel):
40+
data: str

tests/codegen/stream/schema.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"services": {
3+
"test_service": {
4+
"procedures": {
5+
"stream_method": {
6+
"input": {
7+
"type": "object",
8+
"properties": {
9+
"data": {
10+
"type": "string"
11+
}
12+
},
13+
"required": ["data"]
14+
},
15+
"output": {
16+
"type": "object",
17+
"properties": {
18+
"data": {
19+
"type": "string"
20+
}
21+
},
22+
"required": ["data"]
23+
},
24+
"errors": {
25+
"not": {}
26+
},
27+
"type": "stream"
28+
}
29+
}
30+
}
31+
}
32+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import importlib
2+
import shutil
3+
from typing import AsyncIterable
4+
5+
import pytest
6+
7+
from replit_river.client import Client
8+
from replit_river.codegen.client import schema_to_river_client_codegen
9+
from tests.codegen.stream.generated.test_service.stream_method import (
10+
Stream_MethodInput,
11+
Stream_MethodOutput,
12+
)
13+
from tests.common_handlers import basic_stream
14+
15+
16+
@pytest.fixture(scope="session", autouse=True)
17+
def generate_stream_client() -> None:
18+
import tests.codegen.stream.generated
19+
20+
shutil.rmtree("tests/codegen/stream/generated")
21+
schema_to_river_client_codegen(
22+
"tests/codegen/stream/schema.json",
23+
"tests/codegen/stream/generated",
24+
"StreamClient",
25+
True,
26+
)
27+
importlib.reload(tests.codegen.stream.generated)
28+
29+
30+
@pytest.mark.asyncio
31+
@pytest.mark.parametrize("handlers", [{**basic_stream}])
32+
async def test_basic_stream(client: Client) -> None:
33+
from tests.codegen.stream.generated import StreamClient
34+
35+
async def emit() -> AsyncIterable[Stream_MethodInput]:
36+
for i in range(5):
37+
yield {"data": str(i)}
38+
39+
res = await StreamClient(client).test_service.stream_method(emit())
40+
41+
i = 0
42+
async for datum in res:
43+
assert isinstance(datum, Stream_MethodOutput)
44+
assert f"Stream response for {i}" == datum.data, f"{i} == {datum.data}"
45+
i = i + 1
46+
assert i == 5

0 commit comments

Comments
 (0)