|
| 1 | +import io |
1 | 2 | from pathlib import Path |
2 | 3 |
|
3 | 4 | import anyio |
4 | 5 | import pytest |
5 | | -from dirty_equals import IsDict, IsList, IsBytes, IsTuple |
| 6 | +from dirty_equals import IsDict, IsList, IsTuple, IsInstance |
6 | 7 |
|
7 | 8 | from runloop_api_client._files import to_httpx_files, deepcopy_with_paths, async_to_httpx_files |
8 | 9 | from runloop_api_client._utils import extract_files |
9 | 10 |
|
10 | 11 | readme_path = Path(__file__).parent.parent.joinpath("README.md") |
11 | 12 |
|
12 | 13 |
|
| 14 | +def _close_file_handles(value: object) -> None: |
| 15 | + """Recursively close any open file handles in to_httpx_files output. |
| 16 | +
|
| 17 | + The transform returns streaming file handles, so tests that don't actually |
| 18 | + issue a request must close them to avoid resource warnings. |
| 19 | + """ |
| 20 | + if isinstance(value, io.IOBase): |
| 21 | + value.close() |
| 22 | + elif isinstance(value, dict): |
| 23 | + for v in value.values(): |
| 24 | + _close_file_handles(v) |
| 25 | + elif isinstance(value, (list, tuple)): |
| 26 | + for v in value: |
| 27 | + _close_file_handles(v) |
| 28 | + |
| 29 | + |
13 | 30 | def test_pathlib_includes_file_name() -> None: |
14 | 31 | result = to_httpx_files({"file": readme_path}) |
15 | | - print(result) |
16 | | - assert result == IsDict({"file": IsTuple("README.md", IsBytes())}) |
| 32 | + try: |
| 33 | + assert result == IsDict({"file": IsTuple("README.md", IsInstance(io.IOBase))}) |
| 34 | + finally: |
| 35 | + _close_file_handles(result) |
17 | 36 |
|
18 | 37 |
|
19 | 38 | def test_tuple_input() -> None: |
20 | 39 | result = to_httpx_files([("file", readme_path)]) |
21 | | - print(result) |
22 | | - assert result == IsList(IsTuple("file", IsTuple("README.md", IsBytes()))) |
| 40 | + try: |
| 41 | + assert result == IsList(IsTuple("file", IsTuple("README.md", IsInstance(io.IOBase)))) |
| 42 | + finally: |
| 43 | + _close_file_handles(result) |
23 | 44 |
|
24 | 45 |
|
25 | 46 | @pytest.mark.asyncio |
26 | 47 | async def test_async_pathlib_includes_file_name() -> None: |
27 | 48 | result = await async_to_httpx_files({"file": readme_path}) |
28 | | - print(result) |
29 | | - assert result == IsDict({"file": IsTuple("README.md", IsBytes())}) |
| 49 | + try: |
| 50 | + assert result == IsDict({"file": IsTuple("README.md", IsInstance(io.IOBase))}) |
| 51 | + finally: |
| 52 | + _close_file_handles(result) |
30 | 53 |
|
31 | 54 |
|
32 | 55 | @pytest.mark.asyncio |
33 | 56 | async def test_async_supports_anyio_path() -> None: |
34 | 57 | result = await async_to_httpx_files({"file": anyio.Path(readme_path)}) |
35 | | - print(result) |
36 | | - assert result == IsDict({"file": IsTuple("README.md", IsBytes())}) |
| 58 | + try: |
| 59 | + assert result == IsDict({"file": IsTuple("README.md", IsInstance(io.IOBase))}) |
| 60 | + finally: |
| 61 | + _close_file_handles(result) |
37 | 62 |
|
38 | 63 |
|
39 | 64 | @pytest.mark.asyncio |
40 | 65 | async def test_async_tuple_input() -> None: |
41 | 66 | result = await async_to_httpx_files([("file", readme_path)]) |
42 | | - print(result) |
43 | | - assert result == IsList(IsTuple("file", IsTuple("README.md", IsBytes()))) |
| 67 | + try: |
| 68 | + assert result == IsList(IsTuple("file", IsTuple("README.md", IsInstance(io.IOBase)))) |
| 69 | + finally: |
| 70 | + _close_file_handles(result) |
44 | 71 |
|
45 | 72 |
|
46 | 73 | def test_string_not_allowed() -> None: |
|
0 commit comments