Skip to content

Commit a261b7b

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

File tree

5 files changed

+169
-0
lines changed

5 files changed

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

0 commit comments

Comments
 (0)