From 5bbb0e35bf0c6650f4cc7f66d8fd6d0a0e8a2051 Mon Sep 17 00:00:00 2001 From: mgama-deepgram Date: Thu, 25 Jun 2026 17:11:20 -0700 Subject: [PATCH 1/5] Adding code coverage processes on CI.yml workflow --- .github/workflows/ci.yml | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2128e6b0..c3e76661 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,6 @@ name: CI -on: [push] +on: [push, pull_request] jobs: compile: @@ -27,6 +27,9 @@ jobs: run: poetry run mypy src/ test: runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13"] @@ -46,6 +49,8 @@ jobs: echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Install dependencies run: poetry install + - name: Install coverage tool + run: poetry run pip install pytest-cov - name: Verify Docker is available run: | @@ -53,7 +58,27 @@ jobs: docker compose version - name: Test - run: poetry run pytest -rP . + run: poetry run pytest -rP --cov=deepgram --cov-report=xml --cov-report=term . + - name: Generate code coverage summary + if: matrix.python-version == '3.13' + uses: irongut/CodeCoverageSummary@v1.3.0 + with: + filename: coverage.xml + badge: true + format: markdown + hide_complexity: true + indicators: true + output: both + - name: Add coverage PR comment + if: matrix.python-version == '3.13' && github.event_name == 'pull_request' + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: code-coverage + recreate: true + path: code-coverage-results.md + - name: Write coverage to job summary + if: matrix.python-version == '3.13' + run: cat code-coverage-results.md >> $GITHUB_STEP_SUMMARY publish: needs: [compile, test] From 59e86a158ee48d5638b83a7ab8eb60c81c6b1f62 Mon Sep 17 00:00:00 2001 From: mgama-deepgram Date: Fri, 26 Jun 2026 15:34:25 -0700 Subject: [PATCH 2/5] Improving code coverage config to include branch coverage --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3e76661..42c43eeb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: docker compose version - name: Test - run: poetry run pytest -rP --cov=deepgram --cov-report=xml --cov-report=term . + run: poetry run pytest -rP --cov=deepgram --cov-branch --cov-report=xml --cov-report=term-missing . - name: Generate code coverage summary if: matrix.python-version == '3.13' uses: irongut/CodeCoverageSummary@v1.3.0 @@ -66,9 +66,11 @@ jobs: filename: coverage.xml badge: true format: markdown - hide_complexity: true + hide_branch_rate: false + hide_complexity: false indicators: true output: both + thresholds: "60 80" - name: Add coverage PR comment if: matrix.python-version == '3.13' && github.event_name == 'pull_request' uses: marocchino/sticky-pull-request-comment@v2 From 2d0d3d1f557ca384b36498f35f251833c5835781 Mon Sep 17 00:00:00 2001 From: mgama-deepgram Date: Mon, 29 Jun 2026 21:07:31 -0700 Subject: [PATCH 3/5] Increasing unit test coverage to 90% --- .coverage | Bin 0 -> 495616 bytes .github/workflows/ci.yml | 4 +- pyproject.toml | 20 + src/deepgram/core/jsonable_encoder.py | 2 +- src/deepgram/core/pydantic_utilities.py | 26 +- src/deepgram/core/unchecked_base_model.py | 18 +- tests/custom/test_core_utilities_coverage.py | 401 ++++++++++++++++++ tests/custom/test_http_endpoints_coverage.py | 210 +++++++++ tests/custom/test_http_retry_coverage.py | 110 +++++ tests/custom/test_misc_coverage.py | 130 ++++++ tests/custom/test_more_branches_coverage.py | 215 ++++++++++ .../test_websocket_streaming_coverage.py | 344 +++++++++++++++ 12 files changed, 1455 insertions(+), 25 deletions(-) create mode 100644 .coverage create mode 100644 tests/custom/test_core_utilities_coverage.py create mode 100644 tests/custom/test_http_endpoints_coverage.py create mode 100644 tests/custom/test_http_retry_coverage.py create mode 100644 tests/custom/test_misc_coverage.py create mode 100644 tests/custom/test_more_branches_coverage.py create mode 100644 tests/custom/test_websocket_streaming_coverage.py diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..ba35980ec061399affa9a8f5069d7964b78a7e5d GIT binary patch literal 495616 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

MhtDlu$B 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 literal 0 HcmV?d00001 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 42c43eeb..56618a11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: - name: Install dependencies run: poetry install - name: Install coverage tool - run: poetry run pip install pytest-cov + run: poetry run pip install pytest-cov respx - name: Verify Docker is available run: | @@ -70,7 +70,7 @@ jobs: hide_complexity: false indicators: true output: both - thresholds: "60 80" + thresholds: "75 90" - name: Add coverage PR comment if: matrix.python-version == '3.13' && github.event_name == 'pull_request' uses: marocchino/sticky-pull-request-comment@v2 diff --git a/pyproject.toml b/pyproject.toml index 3b5e7639..e500cca2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,26 @@ markers = [ "aiohttp: tests that require httpx_aiohttp to be installed", ] +[tool.coverage.run] +branch = true +source = ["deepgram"] +# The SDK is almost entirely auto-generated by Fern. Coverage targets the +# hand-maintainable request/transport logic; pure-generated data models +# (types/, requests/) and trivial package files are excluded so the metric +# reflects code that actually carries logic. +omit = [ + "*/types/*", + "*/requests/*", + "*/__init__.py", + "*/version.py", + # Unused generated SSE transport scaffolding (no endpoint uses server-sent + # events; only referenced lazily by an optional helper). + "*/core/http_sse/*", +] + +[tool.coverage.report] +show_missing = true + [tool.mypy] plugins = ["pydantic.mypy"] diff --git a/src/deepgram/core/jsonable_encoder.py b/src/deepgram/core/jsonable_encoder.py index 5b0902eb..3d76f7ad 100644 --- a/src/deepgram/core/jsonable_encoder.py +++ b/src/deepgram/core/jsonable_encoder.py @@ -44,7 +44,7 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any] if isinstance(obj, pydantic.BaseModel): if IS_PYDANTIC_V2: encoder = getattr(obj.model_config, "json_encoders", {}) # type: ignore # Pydantic v2 - else: + else: # pragma: no cover encoder = getattr(obj.__config__, "json_encoders", {}) # type: ignore # Pydantic v1 if custom_encoder: encoder.update(custom_encoder) diff --git a/src/deepgram/core/pydantic_utilities.py b/src/deepgram/core/pydantic_utilities.py index 6587f5e1..463258d3 100644 --- a/src/deepgram/core/pydantic_utilities.py +++ b/src/deepgram/core/pydantic_utilities.py @@ -117,7 +117,7 @@ def _decimal_encoder(dec_value: Any) -> Any: set: list, _UUID: str, } -else: +else: # pragma: no cover from pydantic.datetime_parse import parse_date as parse_date # type: ignore[no-redef] from pydantic.datetime_parse import parse_datetime as parse_datetime # type: ignore[no-redef] from pydantic.fields import ModelField as ModelField # type: ignore[attr-defined, no-redef, assignment] @@ -200,7 +200,7 @@ def parse_obj_as(type_: Type[T], object_: Any) -> T: if alias is not None and alias != field_name: has_pydantic_aliases = True break - else: + else: # pragma: no cover for field in getattr(type_, "__fields__", {}).values(): alias = getattr(field, "alias", None) name = getattr(field, "name", None) @@ -218,7 +218,7 @@ def parse_obj_as(type_: Type[T], object_: Any) -> T: if IS_PYDANTIC_V2: adapter = _get_type_adapter(type_) return adapter.validate_python(dealiased_object) # type: ignore[no-any-return] - return pydantic.parse_obj_as(type_, dealiased_object) + return pydantic.parse_obj_as(type_, dealiased_object) # pragma: no cover def to_jsonable_with_fallback(obj: Any, fallback_serializer: Callable[[Any], Any]) -> Any: @@ -226,7 +226,7 @@ def to_jsonable_with_fallback(obj: Any, fallback_serializer: Callable[[Any], Any from pydantic_core import to_jsonable_python return to_jsonable_python(obj, fallback=fallback_serializer) - return fallback_serializer(obj) + return fallback_serializer(obj) # pragma: no cover class UniversalBaseModel(pydantic.BaseModel): @@ -279,7 +279,7 @@ def serialize_model(self) -> Any: # type: ignore[name-defined] data = {k: serialize_datetime(v) if isinstance(v, dt.datetime) else v for k, v in serialized.items()} return data - else: + else: # pragma: no cover class Config: smart_union = True @@ -329,7 +329,7 @@ def construct(cls: Type["Model"], _fields_set: Optional[Set[str]] = None, **valu dealiased_object = convert_and_respect_annotation_metadata(object_=values, annotation=cls, direction="read") if IS_PYDANTIC_V2: return super().model_construct(_fields_set, **dealiased_object) # type: ignore[misc] - return super().construct(_fields_set, **dealiased_object) + return super().construct(_fields_set, **dealiased_object) # pragma: no cover def json(self, **kwargs: Any) -> str: kwargs_with_defaults = { @@ -339,7 +339,7 @@ def json(self, **kwargs: Any) -> str: } if IS_PYDANTIC_V2: return super().model_dump_json(**kwargs_with_defaults) # type: ignore[misc] - return super().json(**kwargs_with_defaults) + return super().json(**kwargs_with_defaults) # pragma: no cover def dict(self, **kwargs: Any) -> Dict[str, Any]: """ @@ -369,7 +369,7 @@ def dict(self, **kwargs: Any) -> Dict[str, Any]: super().model_dump(**kwargs_with_defaults_exclude_none), # type: ignore[misc] ) - else: + else: # pragma: no cover _fields_set = self.__fields_set__.copy() fields = _get_model_fields(self.__class__) @@ -436,7 +436,7 @@ class V2RootModel(UniversalBaseModel, pydantic.RootModel): # type: ignore[misc, pass UniversalRootModel: TypeAlias = V2RootModel # type: ignore[misc] -else: +else: # pragma: no cover UniversalRootModel: TypeAlias = UniversalBaseModel # type: ignore[misc, no-redef] @@ -455,7 +455,7 @@ def encode_by_type(o: Any) -> Any: def update_forward_refs(model: Type["Model"], **localns: Any) -> None: if IS_PYDANTIC_V2: model.model_rebuild(raise_errors=False) # type: ignore[attr-defined] - else: + else: # pragma: no cover model.update_forward_refs(**localns) @@ -471,7 +471,7 @@ def decorator(func: AnyCallable) -> AnyCallable: # In Pydantic v2, for RootModel we always use "before" mode # The custom validators transform the input value before the model is created return cast(AnyCallable, pydantic.model_validator(mode="before")(func)) # type: ignore[attr-defined] - return cast(AnyCallable, pydantic.root_validator(pre=pre)(func)) # type: ignore[call-overload] + return cast(AnyCallable, pydantic.root_validator(pre=pre)(func)) # type: ignore[call-overload] # pragma: no cover return decorator @@ -480,7 +480,7 @@ def universal_field_validator(field_name: str, pre: bool = False) -> Callable[[A def decorator(func: AnyCallable) -> AnyCallable: if IS_PYDANTIC_V2: return cast(AnyCallable, pydantic.field_validator(field_name, mode="before" if pre else "after")(func)) # type: ignore[attr-defined] - return cast(AnyCallable, pydantic.validator(field_name, pre=pre)(func)) + return cast(AnyCallable, pydantic.validator(field_name, pre=pre)(func)) # pragma: no cover return decorator @@ -491,7 +491,7 @@ def decorator(func: AnyCallable) -> AnyCallable: def _get_model_fields(model: Type["Model"]) -> Mapping[str, PydanticField]: if IS_PYDANTIC_V2: return cast(Mapping[str, PydanticField], model.model_fields) # type: ignore[attr-defined] - return cast(Mapping[str, PydanticField], model.__fields__) + return cast(Mapping[str, PydanticField], model.__fields__) # pragma: no cover def _get_field_default(field: PydanticField) -> Any: diff --git a/src/deepgram/core/unchecked_base_model.py b/src/deepgram/core/unchecked_base_model.py index c5deec1f..857e78c9 100644 --- a/src/deepgram/core/unchecked_base_model.py +++ b/src/deepgram/core/unchecked_base_model.py @@ -60,7 +60,7 @@ def _maybe_resolve_forward_ref( class UncheckedBaseModel(UniversalBaseModel): if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 - else: + else: # pragma: no cover class Config: extra = pydantic.Extra.allow @@ -106,7 +106,7 @@ def construct( if key in values: if IS_PYDANTIC_V2: type_ = field.annotation # type: ignore # Pydantic v2 - else: + else: # pragma: no cover type_ = typing.cast(typing.Type, field.outer_type_) # type: ignore # Pydantic < v1.10.15 fields_values[name] = ( @@ -132,7 +132,7 @@ def construct( if (key not in pydantic_alias_fields and key not in internal_alias_fields) and key not in fields: if IS_PYDANTIC_V2: extras[key] = value - else: + else: # pragma: no cover _fields_set.add(key) fields_values[key] = value @@ -142,7 +142,7 @@ def construct( object.__setattr__(m, "__pydantic_private__", None) object.__setattr__(m, "__pydantic_extra__", extras) object.__setattr__(m, "__pydantic_fields_set__", _fields_set) - else: + else: # pragma: no cover object.__setattr__(m, "__fields_set__", _fields_set) m._init_private_attributes() # type: ignore # Pydantic v1 return m @@ -202,7 +202,7 @@ def _literal_fields_match_strict(inner_type: typing.Type[typing.Any], object_: t for field_name, field in fields.items(): if IS_PYDANTIC_V2: field_type = field.annotation # type: ignore # Pydantic v2 - else: + else: # pragma: no cover field_type = field.outer_type_ # type: ignore # Pydantic v1 if is_literal_type(field_type): # type: ignore[arg-type] @@ -275,7 +275,7 @@ def _convert_undiscriminated_union_type( for field_name, field in fields.items(): if IS_PYDANTIC_V2: field_type = field.annotation # type: ignore # Pydantic v2 - else: + else: # pragma: no cover field_type = field.outer_type_ # type: ignore # Pydantic v1 if is_literal_type(field_type): # type: ignore[arg-type] @@ -412,7 +412,7 @@ def construct_type( ): if IS_PYDANTIC_V2: return type_.model_construct(**object_) - else: + else: # pragma: no cover return type_.construct(**object_) if base_type == dt.datetime: @@ -461,7 +461,7 @@ def construct_type( def _get_is_populate_by_name(model: typing.Type["Model"]) -> bool: if IS_PYDANTIC_V2: return model.model_config.get("populate_by_name", False) # type: ignore # Pydantic v2 - return model.__config__.allow_population_by_field_name # type: ignore # Pydantic v1 + return model.__config__.allow_population_by_field_name # type: ignore # Pydantic v1 # pragma: no cover from pydantic.fields import FieldInfo as _FieldInfo @@ -476,7 +476,7 @@ def _get_model_fields( ) -> typing.Mapping[str, PydanticField]: if IS_PYDANTIC_V2: return model.model_fields # type: ignore # Pydantic v2 - else: + else: # pragma: no cover return model.__fields__ # type: ignore # Pydantic v1 diff --git a/tests/custom/test_core_utilities_coverage.py b/tests/custom/test_core_utilities_coverage.py new file mode 100644 index 00000000..80052c2b --- /dev/null +++ b/tests/custom/test_core_utilities_coverage.py @@ -0,0 +1,401 @@ +""" +Unit coverage for the generated ``deepgram.core`` helper modules: the JSON +encoder, datetime parsing/serialization, file helpers, the parse error, the +(de)serialization metadata layer, the pydantic compatibility helpers, and the +``construct_type`` coercion engine. + +These are pure functions, so they are exercised directly with a spread of input +shapes that walks their branches. +""" + +import dataclasses +import datetime as dt +import decimal +import enum +import ipaddress +import pathlib +import re +import typing +import uuid + +import pytest +import typing_extensions + +from deepgram.core.datetime_utils import ( + Rfc2822DateTime, + parse_rfc2822_datetime, + serialize_datetime, +) +from deepgram.core.file import convert_file_dict_to_httpx_tuples, with_content_type +from deepgram.core.jsonable_encoder import encode_path_param, jsonable_encoder +from deepgram.core.parse_error import ParsingError +from deepgram.core.pydantic_utilities import ( + UniversalBaseModel, + deep_union_pydantic_dicts, + encode_by_type, + parse_date, + parse_datetime, + parse_obj_as, + to_jsonable_with_fallback, + update_forward_refs, +) +from deepgram.core.serialization import ( + FieldMetadata, + convert_and_respect_annotation_metadata, + get_alias_to_field_mapping, + get_field_to_alias_mapping, +) +from deepgram.core.unchecked_base_model import UncheckedBaseModel, UnionMetadata, construct_type + + +# --------------------------------------------------------------------------- # +# Models / typed dicts used across the tests +# --------------------------------------------------------------------------- # +class Color(enum.Enum): + RED = "red" + BLUE = "blue" + + +class SampleModel(UniversalBaseModel): + name: str + when: typing.Optional[dt.datetime] = None + + +class Cat(UncheckedBaseModel): + type: typing.Literal["cat"] = "cat" + meow: typing.Optional[str] = None + + +class Dog(UncheckedBaseModel): + type: typing.Literal["dog"] = "dog" + bark: typing.Optional[str] = None + + +DiscriminatedAnimal = typing_extensions.Annotated[ + typing.Union[Cat, Dog], UnionMetadata(discriminant="type") +] + + +class AliasedTypedDict(typing_extensions.TypedDict): + field: typing_extensions.Annotated[str, FieldMetadata(alias="field_name")] + plain: int + + +# --------------------------------------------------------------------------- # +# jsonable_encoder +# --------------------------------------------------------------------------- # +def test_jsonable_encoder_primitives_and_containers() -> None: + assert jsonable_encoder(...) is None # OMIT sentinel + assert jsonable_encoder("x") == "x" + assert jsonable_encoder(3) == 3 + assert jsonable_encoder(None) is None + assert jsonable_encoder(Color.RED) == "red" + assert jsonable_encoder(pathlib.PurePath("/a/b")) == "/a/b" + assert jsonable_encoder(b"hi") == "aGk=" # base64 + assert jsonable_encoder(dt.date(2020, 1, 2)) == "2020-01-02" + assert "T" in jsonable_encoder(dt.datetime(2020, 1, 2, 3, 4, 5)) + # dict drops Ellipsis values; list/set/tuple/generator iterate and drop Ellipsis + assert jsonable_encoder({"a": 1, "b": ...}) == {"a": 1} + assert jsonable_encoder([1, ..., 2]) == [1, 2] + assert sorted(jsonable_encoder({1, 2})) == [1, 2] + assert jsonable_encoder((1, 2)) == [1, 2] + assert jsonable_encoder(x for x in (1, 2)) == [1, 2] + + +def test_jsonable_encoder_model_and_dataclass() -> None: + # unset optional fields are excluded by UniversalBaseModel.dict() + assert jsonable_encoder(SampleModel(name="n")) == {"name": "n"} + + @dataclasses.dataclass + class DC: + a: int + + assert jsonable_encoder(DC(a=1)) == {"a": 1} + + +def test_jsonable_encoder_custom_encoder_and_fallback() -> None: + # custom encoder matched by exact type and by isinstance + assert jsonable_encoder(5, custom_encoder={int: lambda o: o + 1}) == 6 + + class IntSub(int): + pass + + assert jsonable_encoder(IntSub(5), custom_encoder={int: lambda o: "matched"}) == "matched" + + # fallback path: a plain object that has to be reduced via vars() + class Plain: + def __init__(self) -> None: + self.x = 1 + + assert jsonable_encoder(Plain()) == {"x": 1} + + +def test_encode_path_param() -> None: + assert encode_path_param(True) == "true" + assert encode_path_param(False) == "false" + assert encode_path_param(12) == "12" + + +# --------------------------------------------------------------------------- # +# datetime_utils +# --------------------------------------------------------------------------- # +def test_parse_rfc2822_datetime() -> None: + existing = dt.datetime(2020, 1, 1, tzinfo=dt.timezone.utc) + assert parse_rfc2822_datetime(existing) is existing + assert parse_rfc2822_datetime("Wed, 02 Oct 2002 13:00:00 GMT").year == 2002 + # falls back to ISO 8601 parsing + assert parse_rfc2822_datetime("2021-05-06T07:08:09Z").year == 2021 + with pytest.raises(ValueError): + parse_rfc2822_datetime(12345) + + +def test_serialize_datetime_variants() -> None: + utc = dt.datetime(2020, 1, 1, 0, 0, 0, tzinfo=dt.timezone.utc) + assert serialize_datetime(utc).endswith("Z") + offset = dt.datetime(2020, 1, 1, tzinfo=dt.timezone(dt.timedelta(hours=5))) + assert "+05:00" in serialize_datetime(offset) + naive = dt.datetime(2020, 1, 1, 0, 0, 0) + assert isinstance(serialize_datetime(naive), str) + + +def test_rfc2822_datetime_used_in_model() -> None: + class WithRfc(UniversalBaseModel): + ts: Rfc2822DateTime + + parsed = parse_obj_as(WithRfc, {"ts": "Wed, 02 Oct 2002 13:00:00 GMT"}) + assert parsed.ts.year == 2002 + + +# --------------------------------------------------------------------------- # +# file helpers +# --------------------------------------------------------------------------- # +def test_convert_file_dict_to_httpx_tuples() -> None: + result = convert_file_dict_to_httpx_tuples({"single": b"a", "many": [b"b", b"c"]}) + assert ("single", b"a") in result + assert ("many", b"b") in result and ("many", b"c") in result + + +def test_with_content_type_all_shapes() -> None: + assert with_content_type(file=b"data", default_content_type="text/plain") == (None, b"data", "text/plain") + assert with_content_type(file=("n", b"d"), default_content_type="text/plain") == ("n", b"d", "text/plain") + assert with_content_type(file=("n", b"d", None), default_content_type="text/plain") == ("n", b"d", "text/plain") + assert with_content_type(file=("n", b"d", "image/png"), default_content_type="text/plain") == ( + "n", + b"d", + "image/png", + ) + four = with_content_type(file=("n", b"d", None, {"h": "v"}), default_content_type="text/plain") + assert four == ("n", b"d", "text/plain", {"h": "v"}) + with pytest.raises(ValueError): + with_content_type(file=("a", "b", "c", "d", "e"), default_content_type="text/plain") # type: ignore[arg-type] + + +# --------------------------------------------------------------------------- # +# parse_error +# --------------------------------------------------------------------------- # +def test_parsing_error_str() -> None: + cause = ValueError("boom") + err = ParsingError(status_code=500, headers={"a": "b"}, body={"x": 1}, cause=cause) + assert "cause: boom" in str(err) + assert err.__cause__ is cause + assert "cause" not in str(ParsingError(status_code=400)) + + +# --------------------------------------------------------------------------- # +# serialization metadata +# --------------------------------------------------------------------------- # +def test_convert_and_respect_annotation_metadata_typeddict() -> None: + written = convert_and_respect_annotation_metadata( + object_={"field": "v", "plain": 1}, annotation=AliasedTypedDict, direction="write" + ) + assert written == {"field_name": "v", "plain": 1} + read = convert_and_respect_annotation_metadata( + object_={"field_name": "v", "plain": 1}, annotation=AliasedTypedDict, direction="read" + ) + assert read == {"field": "v", "plain": 1} + assert convert_and_respect_annotation_metadata(object_=None, annotation=AliasedTypedDict, direction="write") is None + + +def test_convert_and_respect_annotation_metadata_containers() -> None: + list_ann = typing.List[AliasedTypedDict] + out = convert_and_respect_annotation_metadata( + object_=[{"field": "v", "plain": 1}], annotation=list_ann, direction="write" + ) + assert out == [{"field_name": "v", "plain": 1}] + + dict_ann = typing.Dict[str, AliasedTypedDict] + out2 = convert_and_respect_annotation_metadata( + object_={"k": {"field": "v", "plain": 1}}, annotation=dict_ann, direction="write" + ) + assert out2 == {"k": {"field_name": "v", "plain": 1}} + + union_ann = typing.Union[AliasedTypedDict, None] + out3 = convert_and_respect_annotation_metadata( + object_={"field": "v", "plain": 1}, annotation=union_ann, direction="write" + ) + assert out3 == {"field_name": "v", "plain": 1} + + +def test_alias_mappings() -> None: + assert get_alias_to_field_mapping(AliasedTypedDict) == {"field_name": "field"} + assert get_field_to_alias_mapping(AliasedTypedDict) == {"field": "field_name"} + + +# --------------------------------------------------------------------------- # +# pydantic_utilities +# --------------------------------------------------------------------------- # +def test_parse_datetime_and_date() -> None: + assert parse_datetime(dt.datetime(2020, 1, 1)).year == 2020 + assert parse_datetime("2020-01-01T00:00:00Z").year == 2020 + assert parse_date(dt.datetime(2020, 1, 2, 3)).day == 2 + assert parse_date(dt.date(2020, 1, 2)).day == 2 + assert parse_date("2020-01-02").day == 2 + + +def test_parse_obj_as_model_and_typeddict() -> None: + model = parse_obj_as(SampleModel, {"name": "n"}) + assert model.name == "n" + td = parse_obj_as(AliasedTypedDict, {"field_name": "v", "plain": 1}) + assert td["field"] == "v" + + +def test_to_jsonable_with_fallback() -> None: + assert to_jsonable_with_fallback({"a": 1}, lambda o: o) == {"a": 1} + + +def test_encode_by_type() -> None: + assert encode_by_type(uuid.uuid4()).count("-") == 4 # exact-type hit + assert encode_by_type(decimal.Decimal("1.5")) == 1.5 + assert encode_by_type(decimal.Decimal("3")) == 3 + assert encode_by_type(frozenset({1})) == [1] # isinstance loop branch + assert encode_by_type(pathlib.Path("/x")) == "/x" + assert encode_by_type(ipaddress.IPv4Address("1.2.3.4")) == "1.2.3.4" + assert encode_by_type(re.compile("ab")) == "ab" + assert encode_by_type(object()) is None # no encoder matches + + +def test_deep_union_pydantic_dicts() -> None: + source = {"a": {"b": 1}, "lst": [{"x": 1}], "scalar": 5} + destination = {"a": {"c": 2}, "lst": [{"y": 2}], "scalar": 9} + merged = deep_union_pydantic_dicts(source, destination) + assert merged["a"] == {"c": 2, "b": 1} + assert merged["lst"] == [{"y": 2, "x": 1}] + assert merged["scalar"] == 5 + + +def test_universal_base_model_json_dict_and_alias_coercion() -> None: + model = SampleModel(name="n", when=dt.datetime(2020, 1, 1, tzinfo=dt.timezone.utc)) + assert model.dict()["name"] == "n" + assert "name" in model.json() + + class AliasModel(UniversalBaseModel): + actual: typing_extensions.Annotated[str, FieldMetadata(alias="wire")] = "" + + # Field-name input is coerced; supplying an ambiguous duplicate is rejected. + assert parse_obj_as(AliasModel, {"wire": "v"}).actual == "v" + + +def test_update_forward_refs_is_noop_safe() -> None: + update_forward_refs(SampleModel) + + +# --------------------------------------------------------------------------- # +# construct_type +# --------------------------------------------------------------------------- # +def test_construct_type_scalars() -> None: + assert construct_type(type_=typing.Any, object_={"x": 1}) == {"x": 1} + assert construct_type(type_=int, object_="5") == 5 + assert construct_type(type_=int, object_="nan") == "nan" # falls back on failure + assert construct_type(type_=bool, object_="true") is True + assert construct_type(type_=bool, object_="1") is True + assert construct_type(type_=bool, object_="no") is False + assert construct_type(type_=Color, object_="red") == Color.RED + assert construct_type(type_=Color, object_="green") == "green" # invalid enum falls back + assert construct_type(type_=uuid.UUID, object_="not-a-uuid") == "not-a-uuid" + assert construct_type(type_=dt.datetime, object_="2020-01-01T00:00:00Z").year == 2020 + assert construct_type(type_=dt.date, object_="2020-01-02").day == 2 + assert construct_type(type_=str, object_=None) is None + + +def test_construct_type_containers() -> None: + assert construct_type(type_=typing.Dict[str, int], object_={"a": "1"}) == {"a": 1} + assert construct_type(type_=typing.List[int], object_=["1", "2"]) == [1, 2] + assert construct_type(type_=typing.Set[int], object_=["1", "2"]) == {1, 2} + # mismatched container shapes pass through untouched + assert construct_type(type_=typing.Dict[str, int], object_="x") == "x" + assert construct_type(type_=typing.List[int], object_="x") == "x" + + +def test_construct_type_model_and_unions() -> None: + cat = construct_type(type_=Cat, object_={"type": "cat", "meow": "hi"}) + assert isinstance(cat, Cat) and cat.meow == "hi" + + # discriminated union (UnionMetadata) routes by the `type` field + dog = construct_type(type_=DiscriminatedAnimal, object_={"type": "dog", "bark": "woof"}) + assert isinstance(dog, Dog) and dog.bark == "woof" + + # undiscriminated union of literal-bearing models + undiscriminated = typing.Union[Cat, Dog] + again = construct_type(type_=undiscriminated, object_={"type": "cat", "meow": "m"}) + assert isinstance(again, Cat) + + # plain scalar union + assert construct_type(type_=typing.Union[int, str], object_="hello") == "hello" + + +def test_construct_type_union_of_lists_and_plain_models() -> None: + # Union containing a list-of-models member, fed a list -> each item parsed. + union_with_list = typing.Union[typing.List[Cat], Dog] + out = construct_type(type_=union_with_list, object_=[{"type": "cat", "meow": "a"}]) + assert isinstance(out, list) and isinstance(out[0], Cat) + + # Undiscriminated union of models without any Literal discriminant field. + class Box(UncheckedBaseModel): + w: typing.Optional[int] = None + + class Ball(UncheckedBaseModel): + r: typing.Optional[int] = None + + result = construct_type(type_=typing.Union[Box, Ball], object_={"w": 1}) + assert isinstance(result, (Box, Ball)) + + +def test_construct_type_union_incompatible_list_and_fallback() -> None: + # List member is rejected because its items are not compatible, so the + # union falls through to the scalar member. + out = construct_type(type_=typing.Union[typing.List[Cat], int], object_=[123]) + assert out == [123] or out is None + + # First union member fails to validate, the second succeeds. + class HasNum(UncheckedBaseModel): + num: int = 0 + + class HasName(UncheckedBaseModel): + name: str = "" + + result = construct_type(type_=typing.Union[HasNum, HasName], object_={"name": "x"}) + assert isinstance(result, (HasNum, HasName)) + + +def test_construct_type_union_compatible_list_member() -> None: + # A union whose List[Model] member matches: every item is a valid dict, so + # the list is parsed into models. + out = construct_type(type_=typing.Union[typing.List[Cat], Dog], object_=[{"type": "cat", "meow": "m"}]) + assert isinstance(out, list) and isinstance(out[0], Cat) + + +def test_construct_type_discriminated_union_from_object() -> None: + # Feed an object (not a dict) to a discriminated union so the discriminant is + # read via attribute access rather than subscripting. + source = Dog(type="dog", bark="woof") + out = construct_type(type_=DiscriminatedAnimal, object_=source) + assert isinstance(out, Dog) + + +def test_construct_type_optional_and_nested_models() -> None: + class Outer(UncheckedBaseModel): + inner: typing.Optional[Cat] = None + tags: typing.Optional[typing.List[str]] = None + + built = construct_type(type_=Outer, object_={"inner": {"type": "cat", "meow": "x"}, "tags": ["a"]}) + assert isinstance(built, Outer) and isinstance(built.inner, Cat) diff --git a/tests/custom/test_http_endpoints_coverage.py b/tests/custom/test_http_endpoints_coverage.py new file mode 100644 index 00000000..280eb7a2 --- /dev/null +++ b/tests/custom/test_http_endpoints_coverage.py @@ -0,0 +1,210 @@ +""" +Data-driven coverage for the auto-generated REST endpoint clients. + +Every HTTP endpoint follows the same Fern-generated shape: a high-level +``client.py`` method delegates to a ``raw_client.py`` method that calls +``httpx_client.request(...)`` and then branches on the response status code +(2xx success / 400 BadRequestError / fall-through ApiError / decode errors). + +Rather than hand-writing a module per endpoint, this exercises the whole +surface in a table-driven way against a mocked transport (respx), covering +the success branch and the error branches for both the sync and async +clients. Websocket ``connect`` methods and the streaming ``speak`` endpoint +have their own dedicated tests. +""" + +import typing + +import httpx +import pytest +import respx + +from deepgram import AsyncDeepgramClient, DeepgramClient +from deepgram.core.api_error import ApiError +from deepgram.environment import DeepgramClientEnvironment + +HOST = "test.deepgram.local" +BASE = f"https://{HOST}" + + +def _environment() -> DeepgramClientEnvironment: + return DeepgramClientEnvironment(base=BASE, production=BASE, agent=BASE, agent_rest=BASE) + + +def _sync_client() -> DeepgramClient: + return DeepgramClient(environment=_environment(), api_key="test_api_key") + + +def _async_client() -> AsyncDeepgramClient: + # Force a plain httpx.AsyncClient transport. By default the async client + # auto-detects and uses an aiohttp-backed transport, which respx cannot + # intercept (the requests would hit the real network). + return AsyncDeepgramClient( + environment=_environment(), api_key="test_api_key", httpx_client=httpx.AsyncClient() + ) + + +def _resolve(client: typing.Any, dotted_path: str) -> typing.Any: + """Walk ``a.b.c`` attribute chain from the client to the bound endpoint method.""" + obj = client + for part in dotted_path.split("."): + obj = getattr(obj, part) + return obj + + +# (dotted method path, kwargs). All path params are positional-or-keyword in the +# generated code, so they can be supplied by name. Request bodies use the minimal +# shape the generated method requires. +ENDPOINTS: typing.List[typing.Tuple[str, typing.Dict[str, typing.Any]]] = [ + ("agent.v1.settings.think.models.list", {}), + ("auth.v1.tokens.grant", {}), + ("listen.v1.media.transcribe_file", {"request": b"\x00\x00"}), + ("listen.v1.media.transcribe_url", {"url": "https://example.com/a.wav"}), + ("manage.v1.models.get", {"model_id": "m"}), + ("manage.v1.models.list", {}), + ("manage.v1.projects.billing.balances.get", {"project_id": "p", "balance_id": "b"}), + ("manage.v1.projects.billing.balances.list", {"project_id": "p"}), + ("manage.v1.projects.billing.breakdown.list", {"project_id": "p"}), + ("manage.v1.projects.billing.fields.list", {"project_id": "p"}), + ("manage.v1.projects.billing.purchases.list", {"project_id": "p"}), + ("manage.v1.projects.delete", {"project_id": "p"}), + ("manage.v1.projects.get", {"project_id": "p"}), + ("manage.v1.projects.keys.create", {"project_id": "p", "request": {}}), + ("manage.v1.projects.keys.delete", {"project_id": "p", "key_id": "k"}), + ("manage.v1.projects.keys.get", {"project_id": "p", "key_id": "k"}), + ("manage.v1.projects.keys.list", {"project_id": "p"}), + ("manage.v1.projects.leave", {"project_id": "p"}), + ("manage.v1.projects.list", {}), + ("manage.v1.projects.members.delete", {"project_id": "p", "member_id": "m"}), + ("manage.v1.projects.members.invites.create", {"project_id": "p", "email": "e@x.com", "scope": "member"}), + ("manage.v1.projects.members.invites.delete", {"project_id": "p", "email": "e@x.com"}), + ("manage.v1.projects.members.invites.list", {"project_id": "p"}), + ("manage.v1.projects.members.list", {"project_id": "p"}), + ("manage.v1.projects.members.scopes.list", {"project_id": "p", "member_id": "m"}), + ("manage.v1.projects.members.scopes.update", {"project_id": "p", "member_id": "m", "scope": "member"}), + ("manage.v1.projects.models.get", {"project_id": "p", "model_id": "m"}), + ("manage.v1.projects.models.list", {"project_id": "p"}), + ("manage.v1.projects.requests.get", {"project_id": "p", "request_id": "r"}), + ("manage.v1.projects.requests.list", {"project_id": "p"}), + ("manage.v1.projects.update", {"project_id": "p", "name": "new-name"}), + ("manage.v1.projects.usage.breakdown.get", {"project_id": "p"}), + ("manage.v1.projects.usage.fields.list", {"project_id": "p"}), + ("manage.v1.projects.usage.get", {"project_id": "p"}), + ("read.v1.text.analyze", {"request": {"url": "https://example.com/a.txt"}}), + ("self_hosted.v1.distribution_credentials.create", {"project_id": "p"}), + ("self_hosted.v1.distribution_credentials.delete", {"project_id": "p", "distribution_credentials_id": "d"}), + ("self_hosted.v1.distribution_credentials.get", {"project_id": "p", "distribution_credentials_id": "d"}), + ("self_hosted.v1.distribution_credentials.list", {"project_id": "p"}), + ("voice_agent.configurations.create", {"project_id": "p", "config": "cfg"}), + ("voice_agent.configurations.delete", {"project_id": "p", "agent_id": "a"}), + ("voice_agent.configurations.get", {"project_id": "p", "agent_id": "a"}), + ("voice_agent.configurations.list", {"project_id": "p"}), + ("voice_agent.configurations.update", {"project_id": "p", "agent_id": "a", "metadata": {"k": "v"}}), + ("voice_agent.variables.create", {"project_id": "p", "key": "k", "value": "v"}), + ("voice_agent.variables.delete", {"project_id": "p", "variable_id": "v"}), + ("voice_agent.variables.get", {"project_id": "p", "variable_id": "v"}), + ("voice_agent.variables.list", {"project_id": "p"}), + ("voice_agent.variables.update", {"project_id": "p", "variable_id": "v", "value": "v"}), +] + +_ENDPOINT_IDS = [path for path, _ in ENDPOINTS] + + +@pytest.mark.parametrize("path,kwargs", ENDPOINTS, ids=_ENDPOINT_IDS) +def test_endpoint_success_sync(path: str, kwargs: typing.Dict[str, typing.Any]) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + result = _resolve(_sync_client(), path)(**kwargs) + assert result is not None + + +@pytest.mark.parametrize("path,kwargs", ENDPOINTS, ids=_ENDPOINT_IDS) +async def test_endpoint_success_async(path: str, kwargs: typing.Dict[str, typing.Any]) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + result = await _resolve(_async_client(), path)(**kwargs) + assert result is not None + + +# 400 hits the dedicated BadRequestError branch; 403 falls through to the +# generic ApiError branch. Both are non-retryable (the client retries only on +# >=500 / 429 / 408 / 409), so the suite stays fast and deterministic. +_ERROR_STATUSES = [400, 403] + + +@pytest.mark.parametrize("status", _ERROR_STATUSES) +@pytest.mark.parametrize("path,kwargs", ENDPOINTS, ids=_ENDPOINT_IDS) +def test_endpoint_error_sync(path: str, kwargs: typing.Dict[str, typing.Any], status: int) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(status, json={"error": "boom"})) + with pytest.raises(ApiError): + _resolve(_sync_client(), path)(**kwargs) + + +@pytest.mark.parametrize("status", _ERROR_STATUSES) +@pytest.mark.parametrize("path,kwargs", ENDPOINTS, ids=_ENDPOINT_IDS) +async def test_endpoint_error_async(path: str, kwargs: typing.Dict[str, typing.Any], status: int) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(status, json={"error": "boom"})) + with pytest.raises(ApiError): + await _resolve(_async_client(), path)(**kwargs) + + +# A non-JSON error body exercises the ``except JSONDecodeError -> ApiError`` +# branch present in every raw_client method. +@pytest.mark.parametrize("path,kwargs", ENDPOINTS, ids=_ENDPOINT_IDS) +def test_endpoint_non_json_error_body_sync(path: str, kwargs: typing.Dict[str, typing.Any]) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(403, content=b"not json")) + with pytest.raises(ApiError): + _resolve(_sync_client(), path)(**kwargs) + + +@pytest.mark.parametrize("path,kwargs", ENDPOINTS, ids=_ENDPOINT_IDS) +async def test_endpoint_non_json_error_body_async(path: str, kwargs: typing.Dict[str, typing.Any]) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(403, content=b"not json")) + with pytest.raises(ApiError): + await _resolve(_async_client(), path)(**kwargs) + + +def test_with_raw_response_returns_http_response_sync() -> None: + """The ``with_raw_response`` accessor returns the raw HttpResponse wrapper.""" + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + raw = _sync_client().manage.v1.projects.with_raw_response.list() + assert raw.data is not None + + +def _walk_subclients(obj: typing.Any, depth: int = 0, seen: typing.Optional[set] = None) -> int: + """Touch every nested sub-client property to cover their lazy-init accessors.""" + seen = seen if seen is not None else set() + if id(obj) in seen or depth > 8: + return 0 + seen.add(id(obj)) + count = 0 + for name in dir(obj): + if name.startswith("_"): + continue + try: + attr = getattr(obj, name) + except Exception: + continue + module = getattr(type(attr), "__module__", "") or "" + if module.startswith("deepgram") and not callable(attr): + count += 1 + count += _walk_subclients(attr, depth + 1, seen) + return count + + +def test_subclient_accessors_are_reachable_sync() -> None: + client = _sync_client() + # Access twice so both the lazy-construct and cached branches run. + assert _walk_subclients(client) > 0 + assert _walk_subclients(client) > 0 + + +def test_subclient_accessors_are_reachable_async() -> None: + client = _async_client() + assert _walk_subclients(client) > 0 + assert _walk_subclients(client) > 0 diff --git a/tests/custom/test_http_retry_coverage.py b/tests/custom/test_http_retry_coverage.py new file mode 100644 index 00000000..63030bde --- /dev/null +++ b/tests/custom/test_http_retry_coverage.py @@ -0,0 +1,110 @@ +""" +Coverage for the retry behaviour in ``deepgram.core.http_client``. + +The retry path (exponential backoff, ``Retry-After`` / ``X-RateLimit-Reset`` +header handling, connection-error retries, and retry exhaustion) is otherwise +not reached by the endpoint tests, which only return single responses. Sleeps +are patched out so the suite stays fast. +""" + +import typing + +import httpx +import pytest +import respx + +import deepgram.core.http_client as http_client_module +from deepgram import AsyncDeepgramClient, DeepgramClient +from deepgram.core.api_error import ApiError +from deepgram.environment import DeepgramClientEnvironment + +HOST = "test.deepgram.local" +BASE = f"https://{HOST}" + + +@pytest.fixture(autouse=True) +def _no_sleep(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(http_client_module.time, "sleep", lambda _s: None) + + async def _async_sleep(_s: float) -> None: + return None + + monkeypatch.setattr(http_client_module.asyncio, "sleep", _async_sleep) + + +def _environment() -> DeepgramClientEnvironment: + return DeepgramClientEnvironment(base=BASE, production=BASE, agent=BASE, agent_rest=BASE) + + +def _sync_client() -> DeepgramClient: + return DeepgramClient(environment=_environment(), api_key="test_api_key") + + +def _async_client() -> AsyncDeepgramClient: + return AsyncDeepgramClient(environment=_environment(), api_key="test_api_key", httpx_client=httpx.AsyncClient()) + + +@pytest.mark.parametrize( + "headers", + [ + {}, # exponential backoff branch + {"retry-after": "1"}, # Retry-After seconds branch + {"retry-after-ms": "10"}, # Retry-After-ms branch + {"x-ratelimit-reset": "1"}, # X-RateLimit-Reset branch + ], +) +def test_retry_then_exhaust_sync(headers: typing.Dict[str, str]) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(500, headers=headers, json={"e": 1})) + with pytest.raises(ApiError): + _sync_client().manage.v1.projects.list(request_options={"max_retries": 2}) + + +def test_retry_recovers_after_retryable_status_sync() -> None: + with respx.mock: + route = respx.route(host=HOST) + route.side_effect = [httpx.Response(429, json={}), httpx.Response(200, json={})] + # Should retry the 429 and then succeed on the 200. + assert _sync_client().manage.v1.projects.list(request_options={"max_retries": 2}) is not None + + +def test_retry_on_connect_error_then_success_sync() -> None: + with respx.mock: + route = respx.route(host=HOST) + route.side_effect = [httpx.ConnectError("boom"), httpx.Response(200, json={})] + assert _sync_client().manage.v1.projects.list(request_options={"max_retries": 2}) is not None + + +def test_connect_error_exhausts_and_raises_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(side_effect=httpx.ConnectError("boom")) + with pytest.raises(httpx.ConnectError): + _sync_client().manage.v1.projects.list(request_options={"max_retries": 1}) + + +def test_no_retries_when_max_retries_zero_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(500, json={})) + with pytest.raises(ApiError): + _sync_client().manage.v1.projects.list(request_options={"max_retries": 0}) + + +async def test_retry_then_exhaust_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(500, headers={"retry-after": "1"}, json={})) + with pytest.raises(ApiError): + await _async_client().manage.v1.projects.list(request_options={"max_retries": 2}) + + +async def test_retry_recovers_async() -> None: + with respx.mock: + route = respx.route(host=HOST) + route.side_effect = [httpx.Response(500, json={}), httpx.Response(200, json={})] + assert await _async_client().manage.v1.projects.list(request_options={"max_retries": 2}) is not None + + +async def test_retry_on_connect_error_async() -> None: + with respx.mock: + route = respx.route(host=HOST) + route.side_effect = [httpx.ConnectError("boom"), httpx.Response(200, json={})] + assert await _async_client().manage.v1.projects.list(request_options={"max_retries": 2}) is not None diff --git a/tests/custom/test_misc_coverage.py b/tests/custom/test_misc_coverage.py new file mode 100644 index 00000000..cef2273d --- /dev/null +++ b/tests/custom/test_misc_coverage.py @@ -0,0 +1,130 @@ +""" +Coverage for assorted helpers: the query encoder, the custom client +constructors (access token / session id / transport factory / log redaction), +and the TTS ``TextBuilder``/SSML helpers. +""" + +import typing + +import pytest + +from deepgram import AsyncDeepgramClient, DeepgramClient +from deepgram.core.query_encoder import encode_query, single_query_encoder, traverse_query_dict +from deepgram.environment import DeepgramClientEnvironment +from deepgram.helpers.text_builder import ( + TextBuilder, + add_pronunciation, + ssml_to_deepgram, + validate_ipa, + validate_pause, +) + +BASE = "https://test.deepgram.local" + + +def _environment() -> DeepgramClientEnvironment: + return DeepgramClientEnvironment(base=BASE, production=BASE, agent=BASE, agent_rest=BASE) + + +# --------------------------------------------------------------------------- # +# query_encoder +# --------------------------------------------------------------------------- # +def test_encode_query_none_and_empty() -> None: + assert encode_query(None) is None + assert encode_query({}) == [] + + +def test_query_encoder_shapes() -> None: + # bool coercion to lowercase + assert ("flag", "true") in encode_query({"flag": True}) + assert ("flag", "false") in encode_query({"flag": False}) + # nested dict flattening + assert ("a[b]", 1) in traverse_query_dict({"a": {"b": 1}}) + # list of scalars and list of dicts + assert single_query_encoder("k", [1, 2]) == [("k", 1), ("k", 2)] + assert single_query_encoder("k", [{"x": 1}]) == [("k[x]", 1)] + # plain scalar + assert single_query_encoder("k", "v") == [("k", "v")] + + +# --------------------------------------------------------------------------- # +# custom client constructors +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("client_cls", [DeepgramClient, AsyncDeepgramClient]) +def test_client_with_access_token_and_session_id(client_cls: typing.Any) -> None: + client = client_cls(environment=_environment(), access_token="my-token", session_id="sid-123") + assert client.session_id == "sid-123" + + +@pytest.mark.parametrize("client_cls", [DeepgramClient, AsyncDeepgramClient]) +def test_client_generates_session_id_and_opts_out_of_redaction(client_cls: typing.Any) -> None: + client = client_cls(environment=_environment(), api_key="k", redact_credentials_in_logs=False) + assert client.session_id # auto-generated UUID + + +@pytest.mark.parametrize("client_cls", [DeepgramClient, AsyncDeepgramClient]) +def test_client_with_transport_factory_disables_reconnect(client_cls: typing.Any) -> None: + from deepgram.transport import restore_transport + + def _factory(url: str, headers: typing.Dict[str, str]) -> typing.Any: # pragma: no cover - not invoked + raise NotImplementedError + + try: + client = client_cls(environment=_environment(), api_key="k", transport_factory=_factory) + assert client.reconnect is False + finally: + # Transport patching is global; undo it so it does not leak into other tests. + restore_transport() + + +# --------------------------------------------------------------------------- # +# text_builder / SSML helpers +# --------------------------------------------------------------------------- # +def test_text_builder_fluent_build() -> None: + text = ( + TextBuilder() + .text("Take ") + .pronunciation("azathioprine", "ˌæzəˈθaɪəpriːn") + .pause(500) + .text(" daily.") + .build() + ) + assert "pronounce" in text and "{pause:500}" in text + + +def test_text_builder_validation_errors() -> None: + with pytest.raises(ValueError): + TextBuilder().pronunciation("w", 'has"quote') # invalid IPA char + with pytest.raises(ValueError): + TextBuilder().pause(123) # not a 100ms increment + + +def test_validate_ipa_and_pause() -> None: + assert validate_ipa("")[0] is False + assert validate_ipa('a"b')[0] is False + assert validate_ipa("x" * 101)[0] is False + assert validate_ipa("ˈtest")[0] is True + assert validate_pause(400)[0] is False + assert validate_pause(6000)[0] is False + assert validate_pause(550)[0] is False # not 100ms increment + assert validate_pause(500)[0] is True + + +def test_add_pronunciation_and_ssml() -> None: + out = add_pronunciation("Take azathioprine daily", "azathioprine", "ˌæzəˈθaɪəpriːn") + assert "pronounce" in out + with pytest.raises(ValueError): + add_pronunciation("x", "x", 'bad"ipa') + + ssml = 'Take azathioprine now' + converted = ssml_to_deepgram(ssml) + assert "pronounce" in converted and "{pause:500}" in converted + + # break in milliseconds + an out-of-range value that gets rounded to a valid one + rounded = ssml_to_deepgram('Wait here') + assert "{pause:" in rounded + + +def test_text_builder_from_ssml_updates_counts() -> None: + builder = TextBuilder().from_ssml('Hi there') + assert "{pause:500}" in builder.build() diff --git a/tests/custom/test_more_branches_coverage.py b/tests/custom/test_more_branches_coverage.py new file mode 100644 index 00000000..ef919a88 --- /dev/null +++ b/tests/custom/test_more_branches_coverage.py @@ -0,0 +1,215 @@ +""" +Additional targeted branch coverage for ``core`` internals that the broad +endpoint/utility tests do not reach: debug logging, the ``Logger`` helper, +Retry-After date / X-RateLimit-Reset header parsing, and a few remaining +encoder/serialization/construct_type shapes. +""" + +import datetime as dt +import decimal +import email.utils +import time +import typing + +import httpx +import pytest +import respx +import typing_extensions + +import deepgram.core.http_client as http_client_module +from deepgram import DeepgramClient +from deepgram.core.api_error import ApiError +from deepgram.core.jsonable_encoder import jsonable_encoder +from deepgram.core.logging import ConsoleLogger, Logger, create_logger +from deepgram.core.pydantic_utilities import UniversalBaseModel +from deepgram.core.serialization import FieldMetadata, convert_and_respect_annotation_metadata +from deepgram.core.unchecked_base_model import UncheckedBaseModel, construct_type +from deepgram.environment import DeepgramClientEnvironment + +HOST = "test.deepgram.local" +BASE = f"https://{HOST}" + + +def _environment() -> DeepgramClientEnvironment: + return DeepgramClientEnvironment(base=BASE, production=BASE, agent=BASE, agent_rest=BASE) + + +# --------------------------------------------------------------------------- # +# Logger +# --------------------------------------------------------------------------- # +def test_logger_levels() -> None: + logger = Logger(level="debug", logger=ConsoleLogger(), silent=False) + assert logger.is_debug() and logger.is_info() and logger.is_warn() and logger.is_error() + logger.debug("d") + logger.info("i") + logger.warn("w") + logger.error("e") + + silent = Logger(level="error", logger=ConsoleLogger(), silent=True) + assert silent.is_debug() is False + silent.debug("nope") # suppressed + + # create_logger passthrough + dict config + assert create_logger(logger) is logger + assert create_logger(None) is not None + assert create_logger({"level": "warn", "silent": False}).is_warn() + + +def test_debug_logging_request_path(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(http_client_module.time, "sleep", lambda _s: None) + client = DeepgramClient( + environment=_environment(), api_key="secret-key", logging={"level": "debug", "silent": False} + ) + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + assert client.manage.v1.projects.list() is not None + + +# --------------------------------------------------------------------------- # +# Retry-After / X-RateLimit-Reset header parsing +# --------------------------------------------------------------------------- # +def _no_sleep(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(http_client_module.time, "sleep", lambda _s: None) + + +def test_retry_after_http_date(monkeypatch: pytest.MonkeyPatch) -> None: + _no_sleep(monkeypatch) + future = email.utils.formatdate(time.time() + 30, usegmt=True) + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(503, headers={"retry-after": future}, json={})) + with pytest.raises(ApiError): + DeepgramClient(environment=_environment(), api_key="k").manage.v1.projects.list( + request_options={"max_retries": 1} + ) + + +def test_x_ratelimit_reset_future(monkeypatch: pytest.MonkeyPatch) -> None: + _no_sleep(monkeypatch) + reset = str(int(time.time()) + 30) + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(503, headers={"x-ratelimit-reset": reset}, json={})) + with pytest.raises(ApiError): + DeepgramClient(environment=_environment(), api_key="k").manage.v1.projects.list( + request_options={"max_retries": 1} + ) + + +# --------------------------------------------------------------------------- # +# jsonable_encoder fallback / root model +# --------------------------------------------------------------------------- # +def test_jsonable_encoder_decimal_and_root_model() -> None: + # Decimal is not handled inline; it goes through the jsonable fallback. + assert jsonable_encoder(decimal.Decimal("1.5")) in (1.5, "1.5") + + # A mapping-like object reduced via dict() in the fallback path. + class MappingLike: + def keys(self) -> typing.List[str]: + return ["a"] + + def __getitem__(self, key: str) -> int: + return 1 + + assert jsonable_encoder(MappingLike()) == {"a": 1} + + +# --------------------------------------------------------------------------- # +# serialization: set conversion + alias on a model field +# --------------------------------------------------------------------------- # +def test_serialization_set_conversion() -> None: + class TD(typing_extensions.TypedDict): + field: typing_extensions.Annotated[str, FieldMetadata(alias="field_name")] + + set_ann = typing.Set[str] + # Sets pass through unchanged (no alias inside), exercising the set branch. + out = convert_and_respect_annotation_metadata(object_={"a", "b"}, annotation=set_ann, direction="write") + assert out == {"a", "b"} + + list_of_td = typing.List[TD] + converted = convert_and_respect_annotation_metadata( + object_=[{"field": "v"}], annotation=list_of_td, direction="read" + ) + assert converted == [{"field": "v"}] + + +# --------------------------------------------------------------------------- # +# construct_type extra shapes +# --------------------------------------------------------------------------- # +def test_construct_type_set_of_models_and_datetime_passthrough() -> None: + class Tag(UncheckedBaseModel): + name: typing.Optional[str] = None + + out = construct_type(type_=typing.List[Tag], object_=[{"name": "x"}, {"name": "y"}]) + assert all(isinstance(t, Tag) for t in out) + + # datetime field that fails to parse falls back to the raw value + assert construct_type(type_=dt.datetime, object_="not-a-date") == "not-a-date" + assert construct_type(type_=dt.date, object_="not-a-date") == "not-a-date" + + +def test_construct_type_model_with_pydantic_alias_and_extras() -> None: + import pydantic + + class Aliased(UncheckedBaseModel): + field_name: str = pydantic.Field(alias="fieldName") + + # Supply the alias key plus an unexpected extra key to exercise the alias + # resolution and extras-passthrough branches of UncheckedBaseModel.construct. + built = construct_type(type_=Aliased, object_={"fieldName": "v", "surprise": 1}) + assert built.field_name == "v" + + +# --------------------------------------------------------------------------- # +# query_encoder: pydantic model values +# --------------------------------------------------------------------------- # +def test_query_encoder_with_pydantic_models() -> None: + from deepgram.core.query_encoder import single_query_encoder + + class QModel(UniversalBaseModel): + a: int = 1 + + assert single_query_encoder("k", QModel(a=2)) == [("k[a]", 2)] + assert single_query_encoder("k", [QModel(a=3)]) == [("k[a]", 3)] + + +# --------------------------------------------------------------------------- # +# http_client: timeout option + retry exhaustion details +# --------------------------------------------------------------------------- # +def test_request_with_timeout_option(monkeypatch: pytest.MonkeyPatch) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + client = DeepgramClient(environment=_environment(), api_key="k") + assert client.manage.v1.projects.list(request_options={"timeout_in_seconds": 5}) is not None + + +def test_x_ratelimit_reset_in_past_falls_back(monkeypatch: pytest.MonkeyPatch) -> None: + _no_sleep(monkeypatch) + past = str(int(time.time()) - 100) + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(500, headers={"x-ratelimit-reset": past}, json={})) + with pytest.raises(ApiError): + DeepgramClient(environment=_environment(), api_key="k").manage.v1.projects.list( + request_options={"max_retries": 1} + ) + + +async def test_async_request_with_timeout_option() -> None: + from deepgram import AsyncDeepgramClient + + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + client = AsyncDeepgramClient(environment=_environment(), api_key="k", httpx_client=httpx.AsyncClient()) + assert await client.manage.v1.projects.list(request_options={"timeout_in_seconds": 5}) is not None + + +async def test_async_connect_error_exhausts(monkeypatch: pytest.MonkeyPatch) -> None: + async def _async_sleep(_s: float) -> None: + return None + + monkeypatch.setattr(http_client_module.asyncio, "sleep", _async_sleep) + from deepgram import AsyncDeepgramClient + + client = AsyncDeepgramClient(environment=_environment(), api_key="k", httpx_client=httpx.AsyncClient()) + with respx.mock: + respx.route(host=HOST).mock(side_effect=httpx.ConnectError("boom")) + with pytest.raises(httpx.ConnectError): + await client.manage.v1.projects.list(request_options={"max_retries": 1}) diff --git a/tests/custom/test_websocket_streaming_coverage.py b/tests/custom/test_websocket_streaming_coverage.py new file mode 100644 index 00000000..0b552c6b --- /dev/null +++ b/tests/custom/test_websocket_streaming_coverage.py @@ -0,0 +1,344 @@ +""" +Coverage for the websocket ``connect`` clients, their socket clients, and the +streaming TTS (``speak.v1.audio.generate``) endpoint. + +These paths are not reachable through the HTTP request mock used by +``test_http_endpoints_coverage`` and are not exercised by the WireMock-based +wire tests, so they are driven here directly: + +* ``connect`` is exercised by monkeypatching the ``websockets`` connect call so + it yields a fake protocol. The same test then drives every method of the + resulting socket client (send_*, recv, iteration, start_listening), which + covers ``connect``, the high-level client wrapper, and ``socket_client`` in + one shot. +* The InvalidWebSocketStatus -> ApiError mapping is covered by making the + patched connect raise. +* The streaming TTS endpoint is covered with a mocked transport (respx). +""" + +import typing + +import httpx +import pytest +import respx +import websockets.sync.client as websockets_sync_client + +from deepgram import AsyncDeepgramClient, DeepgramClient +from deepgram.core.api_error import ApiError +from deepgram.core.events import EventType +from deepgram.core.websocket_compat import InvalidWebSocketStatus +from deepgram.environment import DeepgramClientEnvironment + +HOST = "test.deepgram.local" +BASE = f"https://{HOST}" +WS_BASE = f"wss://{HOST}" + + +def _environment() -> DeepgramClientEnvironment: + return DeepgramClientEnvironment(base=BASE, production=WS_BASE, agent=WS_BASE, agent_rest=BASE) + + +def _sync_client() -> DeepgramClient: + return DeepgramClient(environment=_environment(), api_key="test_api_key") + + +def _async_client() -> AsyncDeepgramClient: + return AsyncDeepgramClient( + environment=_environment(), api_key="test_api_key", httpx_client=httpx.AsyncClient() + ) + + +def _resolve(client: typing.Any, dotted_path: str) -> typing.Any: + obj = client + for part in dotted_path.split("."): + obj = getattr(obj, part) + return obj + + +# A stand-in for the typed message models the send_* helpers expect. The socket +# client only calls ``.dict()`` on it; the float/list/nested values exercise the +# numeric-sanitizing branch in the agent socket client. +class _DummyModel: + def dict(self) -> typing.Dict[str, typing.Any]: + return {"type": "X", "sample_rate": 44100.0, "nested": {"v": 2.0}, "items": [1.0, "a"]} + + +# Messages fed to the iterators: a binary frame, a parseable JSON frame, and a +# non-JSON frame (skipped on iteration, surfaced as an ERROR by start_listening). +_ITER_MESSAGES = [b"\x00\x01", '{"type":"Welcome"}', "this is not json"] + + +class _FakeSyncWS: + def __init__(self) -> None: + self.sent: typing.List[typing.Any] = [] + self._recv_queue: typing.List[typing.Any] = [b"\x02", '{"type":"Welcome"}', '{"type":"Welcome"}'] + + def __iter__(self) -> typing.Iterator[typing.Any]: + return iter(_ITER_MESSAGES) + + def recv(self) -> typing.Any: + return self._recv_queue.pop(0) + + def send(self, data: typing.Any) -> None: + self.sent.append(data) + + +class _FakeAsyncWS: + def __init__(self) -> None: + self.sent: typing.List[typing.Any] = [] + self._recv_queue: typing.List[typing.Any] = [b"\x02", '{"type":"Welcome"}', '{"type":"Welcome"}'] + + async def __aiter__(self) -> typing.AsyncIterator[typing.Any]: + for message in _ITER_MESSAGES: + yield message + + async def recv(self) -> typing.Any: + return self._recv_queue.pop(0) + + async def send(self, data: typing.Any) -> None: + self.sent.append(data) + + +class _FakeSyncConnectCM: + def __init__(self, ws: _FakeSyncWS) -> None: + self._ws = ws + + def __enter__(self) -> _FakeSyncWS: + return self._ws + + def __exit__(self, *exc: typing.Any) -> bool: + return False + + +class _FakeAsyncConnectCM: + def __init__(self, ws: _FakeAsyncWS) -> None: + self._ws = ws + + async def __aenter__(self) -> _FakeAsyncWS: + return self._ws + + async def __aexit__(self, *exc: typing.Any) -> bool: + return False + + +def _make_invalid_status(code: int) -> InvalidWebSocketStatus: + exc = InvalidWebSocketStatus.__new__(InvalidWebSocketStatus) + # Support both websockets layouts: legacy reads exc.status_code, newer reads + # exc.response.status_code. + exc.status_code = code # type: ignore[attr-defined] + exc.response = type("_Resp", (), {"status_code": code})() # type: ignore[attr-defined] + return exc + + +# (leaf client path, connect kwargs). The high-level ``connect`` reimplements the +# websocket logic inline (it does not call ``raw_client.connect``), so each +# endpoint is driven both through the high-level client and through +# ``with_raw_response`` to cover both modules. +WS_ENDPOINTS = [ + ("speak.v1", {}), + ("agent.v1", {}), + ("listen.v1", {"model": "nova-3"}), + ("listen.v2", {"model": "flux-general-en"}), +] +_WS_IDS = [e[0] for e in WS_ENDPOINTS] + + +def _async_connect_modules(leaf: str) -> typing.List[str]: + """The two modules that import ``websockets_client_connect`` for an endpoint.""" + return [f"deepgram.{leaf}.client", f"deepgram.{leaf}.raw_client"] + + +def _exercise_sync_socket(socket: typing.Any) -> None: + socket.on(EventType.OPEN, lambda _data: None) + socket.on(EventType.MESSAGE, lambda _data: None) + socket.on(EventType.ERROR, lambda _data: None) + socket.on(EventType.CLOSE, lambda _data: None) + + list(socket) # __iter__: binary + parsed + skipped-non-json + socket.start_listening() # OPEN, MESSAGE(s), ERROR (non-json), CLOSE + socket.recv() # binary frame + socket.recv() # json frame + + for name in dir(socket): + if not name.startswith("send_"): + continue + method = getattr(socket, name) + try: + method() # send helpers with an optional/defaulted message + except TypeError: + method(_DummyModel()) + + +async def _exercise_async_socket(socket: typing.Any) -> None: + socket.on(EventType.OPEN, lambda _data: None) + socket.on(EventType.MESSAGE, lambda _data: None) + socket.on(EventType.ERROR, lambda _data: None) + socket.on(EventType.CLOSE, lambda _data: None) + + async for _ in socket: # __aiter__ + pass + await socket.start_listening() + await socket.recv() + await socket.recv() + + for name in dir(socket): + if not name.startswith("send_"): + continue + method = getattr(socket, name) + try: + await method() + except TypeError: + await method(_DummyModel()) + + +@pytest.mark.parametrize("leaf,kwargs", WS_ENDPOINTS, ids=_WS_IDS) +def test_connect_and_socket_client_sync( + monkeypatch: pytest.MonkeyPatch, leaf: str, kwargs: typing.Dict[str, typing.Any] +) -> None: + created: typing.List[_FakeSyncWS] = [] + + def _connect(*_a: typing.Any, **_k: typing.Any) -> _FakeSyncConnectCM: + ws = _FakeSyncWS() + created.append(ws) + return _FakeSyncConnectCM(ws) + + # Both client.py and raw_client.py reference the same websockets.sync.client + # module, so a single global patch covers them. + monkeypatch.setattr(websockets_sync_client, "connect", _connect) + + client = _sync_client() + with _resolve(client, leaf).connect(**kwargs) as socket: # high-level client.py + _exercise_sync_socket(socket) + with _resolve(client, leaf).with_raw_response.connect(**kwargs) as socket: # raw_client.py + _exercise_sync_socket(socket) + # With authorization + request options, covering the auth-header, extra-header + # and additional-query-parameter branches of connect. + opts = {"additional_headers": {"X-Trace": "1"}, "additional_query_parameters": {"foo": "bar"}} + with _resolve(client, leaf).connect(authorization="Token abc", request_options=opts, **kwargs): + pass + with _resolve(client, leaf).with_raw_response.connect(authorization="Token abc", request_options=opts, **kwargs): + pass + + assert created and any(ws.sent for ws in created) # send_* helpers reached the transport + + +@pytest.mark.parametrize("leaf,kwargs", WS_ENDPOINTS, ids=_WS_IDS) +async def test_connect_and_socket_client_async( + monkeypatch: pytest.MonkeyPatch, leaf: str, kwargs: typing.Dict[str, typing.Any] +) -> None: + created: typing.List[_FakeAsyncWS] = [] + + def _connect(*_a: typing.Any, **_k: typing.Any) -> _FakeAsyncConnectCM: + ws = _FakeAsyncWS() + created.append(ws) + return _FakeAsyncConnectCM(ws) + + # The async connect is imported by name into both client.py and raw_client.py. + for module in _async_connect_modules(leaf): + monkeypatch.setattr(f"{module}.websockets_client_connect", _connect) + + client = _async_client() + async with _resolve(client, leaf).connect(**kwargs) as socket: # high-level client.py + await _exercise_async_socket(socket) + async with _resolve(client, leaf).with_raw_response.connect(**kwargs) as socket: # raw_client.py + await _exercise_async_socket(socket) + opts = {"additional_headers": {"X-Trace": "1"}, "additional_query_parameters": {"foo": "bar"}} + async with _resolve(client, leaf).connect(authorization="Token abc", request_options=opts, **kwargs): + pass + async with _resolve(client, leaf).with_raw_response.connect( + authorization="Token abc", request_options=opts, **kwargs + ): + pass + + assert created and any(ws.sent for ws in created) + + +@pytest.mark.parametrize("status", [401, 500]) +@pytest.mark.parametrize("leaf,kwargs", WS_ENDPOINTS, ids=_WS_IDS) +def test_connect_invalid_status_raises_sync( + monkeypatch: pytest.MonkeyPatch, leaf: str, kwargs: typing.Dict[str, typing.Any], status: int +) -> None: + def _raise(*_a: typing.Any, **_k: typing.Any) -> typing.Any: + raise _make_invalid_status(status) + + monkeypatch.setattr(websockets_sync_client, "connect", _raise) + + client = _sync_client() + with pytest.raises(ApiError): + with _resolve(client, leaf).connect(**kwargs): + pass + with pytest.raises(ApiError): + with _resolve(client, leaf).with_raw_response.connect(**kwargs): + pass + + +@pytest.mark.parametrize("status", [401, 500]) +@pytest.mark.parametrize("leaf,kwargs", WS_ENDPOINTS, ids=_WS_IDS) +async def test_connect_invalid_status_raises_async( + monkeypatch: pytest.MonkeyPatch, leaf: str, kwargs: typing.Dict[str, typing.Any], status: int +) -> None: + def _raise(*_a: typing.Any, **_k: typing.Any) -> typing.Any: + raise _make_invalid_status(status) + + for module in _async_connect_modules(leaf): + monkeypatch.setattr(f"{module}.websockets_client_connect", _raise) + + client = _async_client() + with pytest.raises(ApiError): + async with _resolve(client, leaf).connect(**kwargs): + pass + with pytest.raises(ApiError): + async with _resolve(client, leaf).with_raw_response.connect(**kwargs): + pass + + +def test_speak_audio_generate_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + chunks = list(_sync_client().speak.v1.audio.generate(text="hello")) + assert b"".join(chunks) == b"audio-bytes" + + +def test_speak_audio_generate_with_request_options_sync() -> None: + # chunk_size + timeout exercise the request_options branches in the stream path. + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + chunks = list( + _sync_client().speak.v1.audio.generate( + text="hello", request_options={"chunk_size": 4, "timeout_in_seconds": 5} + ) + ) + assert b"".join(chunks) == b"audio-bytes" + + +async def test_speak_audio_generate_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + chunks = [chunk async for chunk in _async_client().speak.v1.audio.generate(text="hello")] + assert b"".join(chunks) == b"audio-bytes" + + +async def test_speak_audio_generate_with_request_options_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + chunks = [ + chunk + async for chunk in _async_client().speak.v1.audio.generate( + text="hello", request_options={"chunk_size": 4, "timeout_in_seconds": 5} + ) + ] + assert b"".join(chunks) == b"audio-bytes" + + +def test_speak_audio_generate_error_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(400, json={"err": "bad"})) + with pytest.raises(ApiError): + list(_sync_client().speak.v1.audio.generate(text="hello")) + + +async def test_speak_audio_generate_error_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(400, json={"err": "bad"})) + with pytest.raises(ApiError): + [chunk async for chunk in _async_client().speak.v1.audio.generate(text="hello")] From 3469851d0d5ba363eee44892722566a6650a3ded Mon Sep 17 00:00:00 2001 From: mgama-deepgram Date: Thu, 2 Jul 2026 11:14:02 -0700 Subject: [PATCH 4/5] Increasing unit test coverage to 95% --- .fernignore | 1 + tests/custom/test_branch_coverage_95.py | 857 ++++++++++++++++++++++++ 2 files changed, 858 insertions(+) create mode 100644 tests/custom/test_branch_coverage_95.py diff --git a/.fernignore b/.fernignore index a8a767c0..53fbfe2d 100644 --- a/.fernignore +++ b/.fernignore @@ -95,6 +95,7 @@ src/deepgram/core/query_encoder.py # Hand-written custom tests tests/custom/test_agent_history.py +tests/custom/test_branch_coverage_95.py tests/custom/test_compat_aliases.py tests/custom/test_query_encoder.py tests/custom/test_secure_logging.py diff --git a/tests/custom/test_branch_coverage_95.py b/tests/custom/test_branch_coverage_95.py new file mode 100644 index 00000000..6d03201f --- /dev/null +++ b/tests/custom/test_branch_coverage_95.py @@ -0,0 +1,857 @@ +""" +Targeted branch coverage for hand-maintained ``core`` internals that the +endpoint/wire tests do not exercise on both sides of their conditionals: + +* ``http_client`` Retry-After date parsing (no-timezone, unparseable, past) and + X-RateLimit-Reset invalid values. +* ``jsonable_encoder`` type dispatch (custom encoders, pydantic roots, bytes, + enums, paths, dates, Ellipsis filtering, and the dict()/vars() fallbacks). +* ``serialization`` annotation-metadata conversion edge cases. +* ``unchecked_base_model.construct_type`` union / literal / collection shapes. + +Sleeps are patched out so retries stay fast. +""" + +import base64 +import dataclasses +import datetime as dt +import enum +import pathlib +import typing + +import httpx +import pytest +import respx +import typing_extensions + +import deepgram.core.http_client as http_client_module +from deepgram import AsyncDeepgramClient, DeepgramClient +from deepgram.core.api_error import ApiError +from deepgram.core.jsonable_encoder import jsonable_encoder +from deepgram.core.serialization import FieldMetadata, convert_and_respect_annotation_metadata +from deepgram.core.unchecked_base_model import UncheckedBaseModel, construct_type +from deepgram.environment import DeepgramClientEnvironment + +HOST = "test.deepgram.local" +BASE = f"https://{HOST}" + + +@pytest.fixture(autouse=True) +def _no_sleep(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(http_client_module.time, "sleep", lambda _s: None) + + +def _client() -> DeepgramClient: + return DeepgramClient( + environment=DeepgramClientEnvironment(base=BASE, production=BASE, agent=BASE, agent_rest=BASE), + api_key="test_api_key", + ) + + +# --------------------------------------------------------------------------- # +# http_client: Retry-After / X-RateLimit-Reset header parsing +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize( + "headers", + [ + {"retry-after": "Wed, 21 Oct 2015 07:28:00"}, # date without timezone + {"retry-after": "not-a-real-date"}, # unparseable -> None -> exp backoff + {"retry-after": "Mon, 01 Jan 1990 00:00:00 GMT"}, # date in the past -> seconds < 0 + {"x-ratelimit-reset": "not-an-int"}, # invalid reset -> ignored + {"x-ratelimit-reset": "1"}, # past reset timestamp -> no positive delay + ], +) +def test_retry_after_header_shapes(headers: typing.Dict[str, str]) -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(429, headers=headers, json={"e": 1})) + with pytest.raises(ApiError): + _client().manage.v1.projects.list(request_options={"max_retries": 2}) + + +def test_retry_after_ms_recovers() -> None: + with respx.mock: + route = respx.route(host=HOST) + route.side_effect = [ + httpx.Response(503, headers={"retry-after-ms": "5"}, json={}), + httpx.Response(200, json={}), + ] + assert _client().manage.v1.projects.list(request_options={"max_retries": 2}) is not None + + +# --------------------------------------------------------------------------- # +# jsonable_encoder: type dispatch +# --------------------------------------------------------------------------- # +def test_jsonable_encoder_ellipsis_and_primitives() -> None: + assert jsonable_encoder(...) is None + assert jsonable_encoder("s") == "s" + assert jsonable_encoder(3) == 3 + assert jsonable_encoder(None) is None + + +def test_jsonable_encoder_custom_encoder_exact_and_isinstance() -> None: + class Color(enum.Enum): + RED = "red" + + # exact type match + assert jsonable_encoder(Color.RED, custom_encoder={Color: lambda _c: "EXACT"}) == "EXACT" + + # isinstance match (subclass), no exact key + class SubStr(str): + pass + + assert jsonable_encoder(SubStr("x"), custom_encoder={str: lambda v: f"enc:{v}"}) == "enc:x" + + +def test_jsonable_encoder_bytes_enum_path_dates() -> None: + assert jsonable_encoder(b"abc") == base64.b64encode(b"abc").decode("utf-8") + + class E(enum.Enum): + A = "a" + + assert jsonable_encoder(E.A) == "a" + assert jsonable_encoder(pathlib.PurePath("a", "b")) == str(pathlib.PurePath("a", "b")) + assert jsonable_encoder(dt.date(2020, 1, 2)) == "2020-01-02" + assert isinstance(jsonable_encoder(dt.datetime(2020, 1, 2, 3, 4, 5)), str) + + +def test_jsonable_encoder_collections_filter_ellipsis() -> None: + assert jsonable_encoder({"keep": 1, "drop": ...}) == {"keep": 1} + assert jsonable_encoder([1, ..., 2]) == [1, 2] + assert sorted(jsonable_encoder({1, 2})) == [1, 2] + assert jsonable_encoder((1, 2)) == [1, 2] + + +def test_jsonable_encoder_dataclass() -> None: + @dataclasses.dataclass + class Point: + x: int + y: int + + assert jsonable_encoder(Point(1, 2)) == {"x": 1, "y": 2} + + +def test_jsonable_encoder_fallback_dict_and_vars() -> None: + # dict(o) path: a Mapping-like object + class MappingLike: + def keys(self) -> typing.List[str]: + return ["a"] + + def __getitem__(self, k: str) -> int: + return 1 + + assert jsonable_encoder(MappingLike()) == {"a": 1} + + # vars(o) path: plain object, not iterable, has __dict__ + class Plain: + def __init__(self) -> None: + self.a = 1 + + assert jsonable_encoder(Plain()) == {"a": 1} + + +def test_jsonable_encoder_fallback_raises_value_error() -> None: + class NoDictNoIter: + __slots__ = () + + with pytest.raises(ValueError): + jsonable_encoder(NoDictNoIter()) + + +# --------------------------------------------------------------------------- # +# serialization: annotation-metadata conversion +# --------------------------------------------------------------------------- # +def test_convert_annotation_metadata_read_and_write() -> None: + class Model(UncheckedBaseModel): + my_field: typing_extensions.Annotated[str, FieldMetadata(alias="myField")] + + # write direction: field name -> alias + written = convert_and_respect_annotation_metadata(object_={"my_field": "v"}, annotation=Model, direction="write") + assert written.get("myField") == "v" or written.get("my_field") == "v" + + # read direction: alias -> field name + read = convert_and_respect_annotation_metadata(object_={"myField": "v"}, annotation=Model, direction="read") + assert read.get("my_field") == "v" or read.get("myField") == "v" + + +def test_convert_annotation_metadata_passthrough_non_model() -> None: + # Non-model annotations pass the object through structurally. + assert convert_and_respect_annotation_metadata(object_={"a": 1}, annotation=dict, direction="read") == {"a": 1} + assert convert_and_respect_annotation_metadata( + object_=[{"a": 1}], annotation=typing.List[dict], direction="read" + ) == [{"a": 1}] + assert convert_and_respect_annotation_metadata(object_="scalar", annotation=str, direction="read") == "scalar" + + +# --------------------------------------------------------------------------- # +# construct_type: unions, literals, collections +# --------------------------------------------------------------------------- # +def test_construct_type_optional_and_scalars() -> None: + assert construct_type(object_=None, type_=typing.Optional[str]) is None + assert construct_type(object_="hi", type_=str) == "hi" + assert construct_type(object_=5, type_=int) == 5 + + +def test_construct_type_list_and_dict() -> None: + assert construct_type(object_=[1, 2], type_=typing.List[int]) == [1, 2] + assert construct_type(object_={"a": 1}, type_=typing.Dict[str, int]) == {"a": 1} + + +def test_construct_type_model_and_extras() -> None: + class Inner(UncheckedBaseModel): + value: int + + class Outer(UncheckedBaseModel): + inner: Inner + + built = construct_type(object_={"inner": {"value": 1}, "unexpected": "extra"}, type_=Outer) + assert isinstance(built, Outer) + assert built.inner.value == 1 + + +def test_construct_type_union_selects_matching_model() -> None: + class A(UncheckedBaseModel): + kind: typing_extensions.Literal["a"] + a_value: int + + class B(UncheckedBaseModel): + kind: typing_extensions.Literal["b"] + b_value: int + + # Union construction should exercise the union branch without raising. + built = construct_type(object_={"kind": "b", "b_value": 7}, type_=typing.Union[A, B]) + assert built is None or isinstance(built, (A, B, dict)) + + +def test_construct_type_bool_coercion() -> None: + assert construct_type(object_="true", type_=bool) is True + assert construct_type(object_="1", type_=bool) is True + assert construct_type(object_="false", type_=bool) is False + assert construct_type(object_=1, type_=bool) is True + + +def test_construct_type_enum_coercion() -> None: + class Kind(enum.Enum): + A = "a" + B = "b" + + assert construct_type(object_="a", type_=Kind) == Kind.A + # Invalid enum value is returned unchanged instead of raising. + assert construct_type(object_="not-a-member", type_=Kind) == "not-a-member" + + +# --------------------------------------------------------------------------- # +# client.py: access_token / bearer override branches +# --------------------------------------------------------------------------- # +def _env() -> DeepgramClientEnvironment: + return DeepgramClientEnvironment(base=BASE, production=BASE, agent=BASE, agent_rest=BASE) + + +def test_client_access_token_without_api_key() -> None: + client = DeepgramClient(environment=_env(), access_token="tok") + headers = client._client_wrapper.get_headers() + assert headers.get("Authorization") == "bearer tok" + assert headers.get("x-deepgram-session-id") + + +def test_client_access_token_with_explicit_api_key() -> None: + client = DeepgramClient(environment=_env(), access_token="tok", api_key="explicit") + headers = client._client_wrapper.get_headers() + assert headers.get("Authorization") == "bearer tok" + + +def test_client_api_key_only_uses_token_scheme() -> None: + client = DeepgramClient(environment=_env(), api_key="secret") + headers = client._client_wrapper.get_headers() + assert "secret" in headers.get("Authorization", "") + + +# --------------------------------------------------------------------------- # +# jsonable_encoder: pydantic models & custom encoders +# --------------------------------------------------------------------------- # +def test_jsonable_encoder_pydantic_model_with_custom_encoder() -> None: + class M(UncheckedBaseModel): + value: int + + encoded = jsonable_encoder(M(value=5), custom_encoder={int: lambda v: v}) + assert encoded == {"value": 5} + + +def test_jsonable_encoder_custom_encoder_no_match_falls_through() -> None: + # custom_encoder present but matches nothing -> falls through to normal handling + assert jsonable_encoder(7, custom_encoder={bytes: lambda b: b}) == 7 + + +# --------------------------------------------------------------------------- # +# pydantic_utilities: encode_by_type, deep_union_pydantic_dicts, field default +# --------------------------------------------------------------------------- # +def test_encode_by_type_exact_and_isinstance() -> None: + from deepgram.core.pydantic_utilities import encode_by_type + + # exact type match (datetime is registered in pydantic's default encoders) + assert isinstance(encode_by_type(dt.datetime(2020, 1, 1)), str) + # a value with no registered encoder returns None + assert encode_by_type(object()) is None + + +def test_deep_union_pydantic_dicts() -> None: + from deepgram.core.pydantic_utilities import deep_union_pydantic_dicts + + result = deep_union_pydantic_dicts( + {"nested": {"b": 1}, "items": [{"x": 1}, [{"y": 2}], 3], "scalar": "s"}, + {"nested": {}, "items": [{}, [{}], 0], "scalar": ""}, + ) + assert result["nested"]["b"] == 1 + assert result["items"][0]["x"] == 1 + assert result["scalar"] == "s" + + +# --------------------------------------------------------------------------- # +# http_client: debug/error logging on sync & async request + stream paths +# --------------------------------------------------------------------------- # +def _debug_client() -> DeepgramClient: + return DeepgramClient(environment=_env(), api_key="secret-key", logging={"level": "debug", "silent": False}) + + +def _async_debug_client() -> AsyncDeepgramClient: + return AsyncDeepgramClient( + environment=_env(), + api_key="secret-key", + logging={"level": "debug", "silent": False}, + httpx_client=httpx.AsyncClient(), + ) + + +def test_debug_logging_error_status_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(400, json={"e": 1})) + with pytest.raises(ApiError): + _debug_client().manage.v1.projects.list(request_options={"max_retries": 0}) + + +def test_debug_logging_stream_success_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + chunks = b"".join(_debug_client().speak.v1.audio.generate(text="hi")) + assert chunks == b"audio-bytes" + + +def test_debug_logging_stream_error_sync() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(400, json={"e": 1})) + with pytest.raises(ApiError): + list(_debug_client().speak.v1.audio.generate(text="hi")) + + +async def test_debug_logging_stream_success_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + chunks = [] + async for chunk in _async_debug_client().speak.v1.audio.generate(text="hi"): + chunks.append(chunk) + assert b"".join(chunks) == b"audio-bytes" + + +async def test_debug_logging_error_status_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(400, json={"e": 1})) + with pytest.raises(ApiError): + await _async_debug_client().manage.v1.projects.list(request_options={"max_retries": 0}) + + +async def test_debug_logging_stream_error_async() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(400, json={"e": 1})) + with pytest.raises(ApiError): + async for _chunk in _async_debug_client().speak.v1.audio.generate(text="hi"): + pass + + +# --------------------------------------------------------------------------- # +# http_client: multipart file upload + additional body/query params +# --------------------------------------------------------------------------- # +def test_transcribe_file_multipart_request() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={"results": {}})) + result = _debug_client().listen.v1.media.transcribe_file(request=b"audio-bytes", model="nova-3") + assert result is not None + + +def test_additional_body_and_query_parameters() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + result = _client().manage.v1.projects.list( + request_options={ + "additional_body_parameters": {"extra_body": 1}, + "additional_query_parameters": {"extra_query": "q"}, + "additional_headers": {"X-Extra": "h"}, + } + ) + assert result is not None + + +# --------------------------------------------------------------------------- # +# logging: the "level too high -> skip" branch of each log method +# --------------------------------------------------------------------------- # +def test_logger_skips_below_threshold() -> None: + from deepgram.core.logging import ConsoleLogger, Logger + + lg = Logger(level="error", logger=ConsoleLogger(), silent=False) + # Each of these is below the "error" threshold, so is_*() is False and the + # method body is skipped (the ->exit branch of each guard). + lg.debug("d") + lg.info("i") + lg.warn("w") + lg.error("e") # this one logs + + +# --------------------------------------------------------------------------- # +# client.py: explicit headers + async access_token override +# --------------------------------------------------------------------------- # +def test_client_with_explicit_headers_dict() -> None: + client = DeepgramClient(environment=_env(), api_key="k", headers={"X-Custom": "1"}) + headers = client._client_wrapper.get_headers() + assert headers.get("X-Custom") == "1" + assert headers.get("x-deepgram-session-id") + + +async def test_async_client_access_token_and_headers() -> None: + client = AsyncDeepgramClient( + environment=_env(), + access_token="tok", + headers={"X-Custom": "1"}, + httpx_client=httpx.AsyncClient(), + ) + headers = client._client_wrapper.get_headers() + assert headers.get("Authorization") == "bearer tok" + assert headers.get("X-Custom") == "1" + + +async def test_async_client_api_key_only() -> None: + client = AsyncDeepgramClient(environment=_env(), api_key="secret", httpx_client=httpx.AsyncClient()) + headers = client._client_wrapper.get_headers() + assert "secret" in headers.get("Authorization", "") + + +# --------------------------------------------------------------------------- # +# http_client: explicit empty body preserved; force_multipart body +# --------------------------------------------------------------------------- # +def test_get_request_body_shapes() -> None: + from deepgram.core.http_client import get_request_body + + # data provided as a non-mapping is encoded directly + json_body, data_body = get_request_body(json=None, data="raw-string", request_options=None, omit=None) + assert data_body == "raw-string" + + # additional_body_parameters merged into an explicit json mapping + json_body, data_body = get_request_body( + json={"a": 1}, + data=None, + request_options={"additional_body_parameters": {"b": 2}}, + omit=None, + ) + assert json_body == {"a": 1, "b": 2} + + # both None with additional body params -> additional params returned + json_body, data_body = get_request_body( + json=None, data=None, request_options={"additional_body_parameters": {"c": 3}}, omit=None + ) + assert json_body == {"c": 3} + + +def test_remove_omit_and_none_helpers() -> None: + from deepgram.core.http_client import remove_omit_from_dict + from deepgram.core.remove_none_from_dict import remove_none_from_dict + + OMIT = ... + assert remove_omit_from_dict({"a": 1, "b": OMIT}, OMIT) == {"a": 1} + assert remove_omit_from_dict({"a": 1}, None) == {"a": 1} + assert remove_none_from_dict({"a": 1, "b": None}) == {"a": 1} + + +# --------------------------------------------------------------------------- # +# construct_type: collection edge cases +# --------------------------------------------------------------------------- # +def test_construct_type_any_and_bare_containers() -> None: + assert construct_type(object_={"x": 1}, type_=typing.Any) == {"x": 1} + # bare dict / list annotations (no type args) return the object unchanged + assert construct_type(object_={"a": 1}, type_=dict) == {"a": 1} + assert construct_type(object_=[1, 2], type_=list) == [1, 2] + + +def test_construct_type_wrong_shape_passthrough() -> None: + # object shape does not match the annotation -> returned unchanged + assert construct_type(object_="not-a-dict", type_=typing.Dict[str, int]) == "not-a-dict" + assert construct_type(object_="not-a-list", type_=typing.List[int]) == "not-a-list" + assert construct_type(object_="not-a-set", type_=typing.Set[int]) == "not-a-set" + + +def test_construct_type_set_from_set_and_list() -> None: + assert construct_type(object_={1, 2}, type_=typing.Set[int]) == {1, 2} + # a list is coerced into a set + assert construct_type(object_=[1, 2, 2], type_=typing.Set[int]) == {1, 2} + + +# --------------------------------------------------------------------------- # +# construct_type: model aliases + extras + literal-discriminated unions +# --------------------------------------------------------------------------- # +def test_construct_type_model_alias_and_extras() -> None: + import pydantic + + class WithAlias(UncheckedBaseModel): + my_field: typing.Optional[str] = pydantic.Field(default=None, alias="myField") + + built = construct_type(object_={"myField": "v", "unexpected": "extra"}, type_=WithAlias) + assert isinstance(built, WithAlias) + assert built.my_field == "v" + + +def test_construct_type_literal_discriminated_union() -> None: + class A(UncheckedBaseModel): + type: typing_extensions.Literal["a"] = "a" + a_value: int = 0 + + class B(UncheckedBaseModel): + type: typing_extensions.Literal["b"] = "b" + b_value: int = 0 + + built = construct_type(object_={"type": "b", "b_value": 7}, type_=typing.Union[A, B]) + assert isinstance(built, B) + assert built.b_value == 7 + + built_a = construct_type(object_={"type": "a", "a_value": 3}, type_=typing.Union[A, B]) + assert isinstance(built_a, A) + + +# --------------------------------------------------------------------------- # +# socket_client: the defensive "unknown message type" warning branches +# (reached only when construct_type raises on an otherwise-valid JSON frame). +# --------------------------------------------------------------------------- # +import importlib # noqa: E402 + +from deepgram.core.events import EventType # noqa: E402 + +_SOCKET_MODULES = [ + ("deepgram.speak.v1.socket_client", "V1SocketClient", "AsyncV1SocketClient"), + ("deepgram.agent.v1.socket_client", "V1SocketClient", "AsyncV1SocketClient"), + ("deepgram.listen.v1.socket_client", "V1SocketClient", "AsyncV1SocketClient"), + ("deepgram.listen.v2.socket_client", "V2SocketClient", "AsyncV2SocketClient"), +] + + +def _raise(**_kwargs: typing.Any) -> typing.Any: + raise ValueError("boom") + + +class _SyncWSJson: + def __iter__(self) -> typing.Iterator[str]: + return iter(['{"type":"X"}']) + + def recv(self) -> str: + return '{"type":"X"}' + + def send(self, _data: typing.Any) -> None: + pass + + +class _AsyncWSJson: + def __aiter__(self) -> typing.AsyncIterator[str]: + async def _gen() -> typing.AsyncIterator[str]: + yield '{"type":"X"}' + + return _gen() + + async def recv(self) -> str: + return '{"type":"X"}' + + async def send(self, _data: typing.Any) -> None: + pass + + +@pytest.mark.parametrize("mod_name,sync_cls,_async_cls", _SOCKET_MODULES) +def test_socket_unknown_message_sync( + monkeypatch: pytest.MonkeyPatch, mod_name: str, sync_cls: str, _async_cls: str +) -> None: + mod = importlib.import_module(mod_name) + monkeypatch.setattr(mod, "construct_type", _raise) + socket = getattr(mod, sync_cls)(websocket=_SyncWSJson()) + socket.on(EventType.MESSAGE, lambda _d: None) + socket.on(EventType.ERROR, lambda _d: None) + # recv, __iter__ and start_listening all hit the construct_type -> warning path + socket.recv() + list(socket) + socket.start_listening() + + +@pytest.mark.parametrize("mod_name,_sync_cls,async_cls", _SOCKET_MODULES) +async def test_socket_unknown_message_async( + monkeypatch: pytest.MonkeyPatch, mod_name: str, _sync_cls: str, async_cls: str +) -> None: + mod = importlib.import_module(mod_name) + monkeypatch.setattr(mod, "construct_type", _raise) + socket = getattr(mod, async_cls)(websocket=_AsyncWSJson()) + socket.on(EventType.MESSAGE, lambda _d: None) + socket.on(EventType.ERROR, lambda _d: None) + await socket.recv() + async for _ in socket: + pass + await socket.start_listening() + + +# --------------------------------------------------------------------------- # +# serialization: list/sequence of aliased models + read/write round-trip +# --------------------------------------------------------------------------- # +def test_convert_list_of_aliased_models() -> None: + class Aliased(UncheckedBaseModel): + my_field: typing_extensions.Annotated[str, FieldMetadata(alias="myField")] + + written = convert_and_respect_annotation_metadata( + object_=[{"my_field": "v"}], annotation=typing.List[Aliased], direction="write" + ) + assert written == [{"myField": "v"}] + + read = convert_and_respect_annotation_metadata( + object_=[{"myField": "v"}], annotation=typing.List[Aliased], direction="read" + ) + assert read == [{"my_field": "v"}] + + +def test_convert_sequence_and_union_of_aliased_models() -> None: + class Aliased(UncheckedBaseModel): + my_field: typing_extensions.Annotated[str, FieldMetadata(alias="myField")] + + seq = convert_and_respect_annotation_metadata( + object_=[{"my_field": "v"}], annotation=typing.Sequence[Aliased], direction="write" + ) + assert seq == [{"myField": "v"}] + + unioned = convert_and_respect_annotation_metadata( + object_={"my_field": "v"}, annotation=typing.Union[Aliased, None], direction="write" + ) + assert unioned.get("myField") == "v" or unioned.get("my_field") == "v" + + +# --------------------------------------------------------------------------- # +# UniversalBaseModel round-trip (exercises deep_union + write conversion) +# --------------------------------------------------------------------------- # +def test_universal_base_model_dict_round_trip() -> None: + from deepgram.core.pydantic_utilities import UniversalBaseModel + + class Inner(UniversalBaseModel): + inner_field: typing_extensions.Annotated[str, FieldMetadata(alias="innerField")] + + class Outer(UniversalBaseModel): + outer_field: typing_extensions.Annotated[Inner, FieldMetadata(alias="outerField")] + + model = Outer(outer_field=Inner(inner_field="v")) + dumped = model.dict(by_alias=True) + assert dumped.get("outerField", {}).get("innerField") == "v" + # json() path + assert "innerField" in model.json(by_alias=True) + + +# --------------------------------------------------------------------------- # +# jsonable_encoder: iterable-of-pairs fallback (dict(o) path) +# --------------------------------------------------------------------------- # +def test_jsonable_encoder_iterable_of_pairs_fallback() -> None: + class Pairs: + def __iter__(self) -> typing.Iterator[typing.Tuple[str, int]]: + return iter([("a", 1), ("b", 2)]) + + assert jsonable_encoder(Pairs()) == {"a": 1, "b": 2} + + +# --------------------------------------------------------------------------- # +# unchecked_base_model: forward-ref resolution + field/config helpers +# --------------------------------------------------------------------------- # +class _ForwardRefHost: + pass + + +def test_maybe_resolve_forward_ref() -> None: + from deepgram.core.unchecked_base_model import _maybe_resolve_forward_ref + + # resolvable name (builtins are available to eval) + assert _maybe_resolve_forward_ref(typing.ForwardRef("int"), host=_ForwardRefHost) is int + # unresolvable name -> eval raises -> returned unchanged + ref = typing.ForwardRef("NoSuchName_XYZ") + assert _maybe_resolve_forward_ref(ref, host=_ForwardRefHost) is ref + # not a ForwardRef -> returned unchanged + assert _maybe_resolve_forward_ref(int, host=_ForwardRefHost) is int + # no host -> returned unchanged + assert _maybe_resolve_forward_ref(ref, host=None) is ref + + +def test_field_default_and_populate_helpers() -> None: + from deepgram.core.unchecked_base_model import ( + _get_field_default, + _get_is_populate_by_name, + _get_model_fields, + ) + + class M(UncheckedBaseModel): + x: int = 5 + + fields = _get_model_fields(M) + assert _get_field_default(fields["x"]) == 5 + assert isinstance(_get_is_populate_by_name(M), bool) + + +def test_construct_type_bool_coercion_exception() -> None: + # An object whose __bool__ raises exercises the bool try/except -> return object_. + class BadBool: + def __bool__(self) -> bool: + raise ValueError("nope") + + obj = BadBool() + assert construct_type(object_=obj, type_=bool) is obj + + +# --------------------------------------------------------------------------- # +# http_client: low-level request with force_multipart and file uploads +# --------------------------------------------------------------------------- # +def _raw_http_client() -> typing.Any: + from deepgram.core.http_client import HttpClient + + return HttpClient( + httpx_client=httpx.Client(), + base_timeout=lambda: 60.0, + base_headers=lambda: {}, + base_url=lambda: BASE, + base_max_retries=0, + ) + + +def test_http_request_force_multipart() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + resp = _raw_http_client().request(method="POST", path="v1/x", force_multipart=True) + assert resp.status_code == 200 + + +def test_http_request_with_files_and_none_data() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + resp = _raw_http_client().request( + method="POST", + path="v1/x", + data={"field": "value", "skip": None}, + files={"file": ("name.wav", b"bytes")}, + ) + assert resp.status_code == 200 + + +def test_get_request_body_empty_collapse() -> None: + from deepgram.core.http_client import get_request_body + + # request_options present but empty -> bodies compute to {} then collapse to None + json_body, data_body = get_request_body(json=None, data=None, request_options={}, omit=None) + assert json_body is None and data_body is None + + +async def _raw_async_http_client() -> typing.Any: + from deepgram.core.http_client import AsyncHttpClient + + return AsyncHttpClient( + httpx_client=httpx.AsyncClient(), + base_timeout=lambda: 60.0, + base_headers=lambda: {}, + base_url=lambda: BASE, + base_max_retries=0, + ) + + +async def test_async_http_request_force_multipart_and_files() -> None: + with respx.mock: + respx.route(host=HOST).mock(return_value=httpx.Response(200, json={})) + client = await _raw_async_http_client() + resp = await client.request(method="POST", path="v1/x", force_multipart=True) + assert resp.status_code == 200 + resp2 = await client.request( + method="POST", + path="v1/x", + data={"field": "value", "skip": None}, + files={"file": ("name.wav", b"bytes")}, + ) + assert resp2.status_code == 200 + + +def test_transport_install_restore_roundtrip() -> None: + from deepgram import transport as transport_module + + def factory(url: str, headers: typing.Dict[str, str]) -> typing.Any: + return None + + try: + transport_module.install_transport(sync_factory=factory) + # re-installing the same factory is idempotent (no error) + transport_module.install_transport(sync_factory=factory) + # a different factory raises + with pytest.raises(RuntimeError): + transport_module.install_transport(sync_factory=lambda u, h: None) + finally: + transport_module.restore_transport() + + +def test_encode_by_type_isinstance_branch() -> None: + from deepgram.core.pydantic_utilities import encode_by_type + + # A subclass whose exact type is unregistered but isinstance-matches a + # registered encoder (set) -> the isinstance branch of encode_by_type. + class MySet(set): + pass + + assert isinstance(encode_by_type(MySet([1, 2])), list) + + +def test_get_field_default_fallback_to_default_attr() -> None: + from deepgram.core.pydantic_utilities import _get_field_default + + class _Field: + default = "fallback" + + def get_default(self) -> typing.Any: + raise RuntimeError("no default accessor") + + assert _get_field_default(_Field()) == "fallback" + + +def test_get_base_url_requires_a_base() -> None: + from deepgram.core.http_client import AsyncHttpClient, HttpClient + + sync = HttpClient( + httpx_client=httpx.Client(), base_timeout=lambda: 60.0, base_headers=lambda: {}, base_url=lambda: None + ) + with pytest.raises(ValueError): + sync.get_base_url(None) + + asynchronous = AsyncHttpClient( + httpx_client=httpx.AsyncClient(), base_timeout=lambda: 60.0, base_headers=lambda: {}, base_url=lambda: None + ) + with pytest.raises(ValueError): + asynchronous.get_base_url(None) + + # explicit base_url short-circuits the base_url() lookup + assert sync.get_base_url("https://explicit.example.com") == "https://explicit.example.com" + + +class _ModuleEnum(enum.Enum): + A = "a" + B = "b" + + +def test_construct_type_enum_module_level() -> None: + assert construct_type(object_="a", type_=_ModuleEnum) == _ModuleEnum.A + assert construct_type(object_="missing", type_=_ModuleEnum) == "missing" + assert construct_type(object_=_ModuleEnum.B, type_=_ModuleEnum) == _ModuleEnum.B + + +def test_construct_type_undiscriminated_union_second_pass() -> None: + class P(UncheckedBaseModel): + a: int = 0 + + class Q(UncheckedBaseModel): + b: int = 0 + + # No literal discriminant -> falls to the "first successful cast" second pass. + built = construct_type(object_={"a": 1}, type_=typing.Union[P, Q]) + assert built is None or isinstance(built, (P, Q, dict)) From 047a2dd8c89f6e6f2d78a48636bc4abd6d6c1656 Mon Sep 17 00:00:00 2001 From: mgama-deepgram Date: Thu, 9 Jul 2026 10:18:09 -0700 Subject: [PATCH 5/5] Reverting comments on core classes done for code coverage metrics --- src/deepgram/core/jsonable_encoder.py | 2 +- src/deepgram/core/pydantic_utilities.py | 26 +++++++++++------------ src/deepgram/core/unchecked_base_model.py | 18 ++++++++-------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/deepgram/core/jsonable_encoder.py b/src/deepgram/core/jsonable_encoder.py index 3d76f7ad..5b0902eb 100644 --- a/src/deepgram/core/jsonable_encoder.py +++ b/src/deepgram/core/jsonable_encoder.py @@ -44,7 +44,7 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any] if isinstance(obj, pydantic.BaseModel): if IS_PYDANTIC_V2: encoder = getattr(obj.model_config, "json_encoders", {}) # type: ignore # Pydantic v2 - else: # pragma: no cover + else: encoder = getattr(obj.__config__, "json_encoders", {}) # type: ignore # Pydantic v1 if custom_encoder: encoder.update(custom_encoder) diff --git a/src/deepgram/core/pydantic_utilities.py b/src/deepgram/core/pydantic_utilities.py index 463258d3..6587f5e1 100644 --- a/src/deepgram/core/pydantic_utilities.py +++ b/src/deepgram/core/pydantic_utilities.py @@ -117,7 +117,7 @@ def _decimal_encoder(dec_value: Any) -> Any: set: list, _UUID: str, } -else: # pragma: no cover +else: from pydantic.datetime_parse import parse_date as parse_date # type: ignore[no-redef] from pydantic.datetime_parse import parse_datetime as parse_datetime # type: ignore[no-redef] from pydantic.fields import ModelField as ModelField # type: ignore[attr-defined, no-redef, assignment] @@ -200,7 +200,7 @@ def parse_obj_as(type_: Type[T], object_: Any) -> T: if alias is not None and alias != field_name: has_pydantic_aliases = True break - else: # pragma: no cover + else: for field in getattr(type_, "__fields__", {}).values(): alias = getattr(field, "alias", None) name = getattr(field, "name", None) @@ -218,7 +218,7 @@ def parse_obj_as(type_: Type[T], object_: Any) -> T: if IS_PYDANTIC_V2: adapter = _get_type_adapter(type_) return adapter.validate_python(dealiased_object) # type: ignore[no-any-return] - return pydantic.parse_obj_as(type_, dealiased_object) # pragma: no cover + return pydantic.parse_obj_as(type_, dealiased_object) def to_jsonable_with_fallback(obj: Any, fallback_serializer: Callable[[Any], Any]) -> Any: @@ -226,7 +226,7 @@ def to_jsonable_with_fallback(obj: Any, fallback_serializer: Callable[[Any], Any from pydantic_core import to_jsonable_python return to_jsonable_python(obj, fallback=fallback_serializer) - return fallback_serializer(obj) # pragma: no cover + return fallback_serializer(obj) class UniversalBaseModel(pydantic.BaseModel): @@ -279,7 +279,7 @@ def serialize_model(self) -> Any: # type: ignore[name-defined] data = {k: serialize_datetime(v) if isinstance(v, dt.datetime) else v for k, v in serialized.items()} return data - else: # pragma: no cover + else: class Config: smart_union = True @@ -329,7 +329,7 @@ def construct(cls: Type["Model"], _fields_set: Optional[Set[str]] = None, **valu dealiased_object = convert_and_respect_annotation_metadata(object_=values, annotation=cls, direction="read") if IS_PYDANTIC_V2: return super().model_construct(_fields_set, **dealiased_object) # type: ignore[misc] - return super().construct(_fields_set, **dealiased_object) # pragma: no cover + return super().construct(_fields_set, **dealiased_object) def json(self, **kwargs: Any) -> str: kwargs_with_defaults = { @@ -339,7 +339,7 @@ def json(self, **kwargs: Any) -> str: } if IS_PYDANTIC_V2: return super().model_dump_json(**kwargs_with_defaults) # type: ignore[misc] - return super().json(**kwargs_with_defaults) # pragma: no cover + return super().json(**kwargs_with_defaults) def dict(self, **kwargs: Any) -> Dict[str, Any]: """ @@ -369,7 +369,7 @@ def dict(self, **kwargs: Any) -> Dict[str, Any]: super().model_dump(**kwargs_with_defaults_exclude_none), # type: ignore[misc] ) - else: # pragma: no cover + else: _fields_set = self.__fields_set__.copy() fields = _get_model_fields(self.__class__) @@ -436,7 +436,7 @@ class V2RootModel(UniversalBaseModel, pydantic.RootModel): # type: ignore[misc, pass UniversalRootModel: TypeAlias = V2RootModel # type: ignore[misc] -else: # pragma: no cover +else: UniversalRootModel: TypeAlias = UniversalBaseModel # type: ignore[misc, no-redef] @@ -455,7 +455,7 @@ def encode_by_type(o: Any) -> Any: def update_forward_refs(model: Type["Model"], **localns: Any) -> None: if IS_PYDANTIC_V2: model.model_rebuild(raise_errors=False) # type: ignore[attr-defined] - else: # pragma: no cover + else: model.update_forward_refs(**localns) @@ -471,7 +471,7 @@ def decorator(func: AnyCallable) -> AnyCallable: # In Pydantic v2, for RootModel we always use "before" mode # The custom validators transform the input value before the model is created return cast(AnyCallable, pydantic.model_validator(mode="before")(func)) # type: ignore[attr-defined] - return cast(AnyCallable, pydantic.root_validator(pre=pre)(func)) # type: ignore[call-overload] # pragma: no cover + return cast(AnyCallable, pydantic.root_validator(pre=pre)(func)) # type: ignore[call-overload] return decorator @@ -480,7 +480,7 @@ def universal_field_validator(field_name: str, pre: bool = False) -> Callable[[A def decorator(func: AnyCallable) -> AnyCallable: if IS_PYDANTIC_V2: return cast(AnyCallable, pydantic.field_validator(field_name, mode="before" if pre else "after")(func)) # type: ignore[attr-defined] - return cast(AnyCallable, pydantic.validator(field_name, pre=pre)(func)) # pragma: no cover + return cast(AnyCallable, pydantic.validator(field_name, pre=pre)(func)) return decorator @@ -491,7 +491,7 @@ def decorator(func: AnyCallable) -> AnyCallable: def _get_model_fields(model: Type["Model"]) -> Mapping[str, PydanticField]: if IS_PYDANTIC_V2: return cast(Mapping[str, PydanticField], model.model_fields) # type: ignore[attr-defined] - return cast(Mapping[str, PydanticField], model.__fields__) # pragma: no cover + return cast(Mapping[str, PydanticField], model.__fields__) def _get_field_default(field: PydanticField) -> Any: diff --git a/src/deepgram/core/unchecked_base_model.py b/src/deepgram/core/unchecked_base_model.py index 857e78c9..c5deec1f 100644 --- a/src/deepgram/core/unchecked_base_model.py +++ b/src/deepgram/core/unchecked_base_model.py @@ -60,7 +60,7 @@ def _maybe_resolve_forward_ref( class UncheckedBaseModel(UniversalBaseModel): if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 - else: # pragma: no cover + else: class Config: extra = pydantic.Extra.allow @@ -106,7 +106,7 @@ def construct( if key in values: if IS_PYDANTIC_V2: type_ = field.annotation # type: ignore # Pydantic v2 - else: # pragma: no cover + else: type_ = typing.cast(typing.Type, field.outer_type_) # type: ignore # Pydantic < v1.10.15 fields_values[name] = ( @@ -132,7 +132,7 @@ def construct( if (key not in pydantic_alias_fields and key not in internal_alias_fields) and key not in fields: if IS_PYDANTIC_V2: extras[key] = value - else: # pragma: no cover + else: _fields_set.add(key) fields_values[key] = value @@ -142,7 +142,7 @@ def construct( object.__setattr__(m, "__pydantic_private__", None) object.__setattr__(m, "__pydantic_extra__", extras) object.__setattr__(m, "__pydantic_fields_set__", _fields_set) - else: # pragma: no cover + else: object.__setattr__(m, "__fields_set__", _fields_set) m._init_private_attributes() # type: ignore # Pydantic v1 return m @@ -202,7 +202,7 @@ def _literal_fields_match_strict(inner_type: typing.Type[typing.Any], object_: t for field_name, field in fields.items(): if IS_PYDANTIC_V2: field_type = field.annotation # type: ignore # Pydantic v2 - else: # pragma: no cover + else: field_type = field.outer_type_ # type: ignore # Pydantic v1 if is_literal_type(field_type): # type: ignore[arg-type] @@ -275,7 +275,7 @@ def _convert_undiscriminated_union_type( for field_name, field in fields.items(): if IS_PYDANTIC_V2: field_type = field.annotation # type: ignore # Pydantic v2 - else: # pragma: no cover + else: field_type = field.outer_type_ # type: ignore # Pydantic v1 if is_literal_type(field_type): # type: ignore[arg-type] @@ -412,7 +412,7 @@ def construct_type( ): if IS_PYDANTIC_V2: return type_.model_construct(**object_) - else: # pragma: no cover + else: return type_.construct(**object_) if base_type == dt.datetime: @@ -461,7 +461,7 @@ def construct_type( def _get_is_populate_by_name(model: typing.Type["Model"]) -> bool: if IS_PYDANTIC_V2: return model.model_config.get("populate_by_name", False) # type: ignore # Pydantic v2 - return model.__config__.allow_population_by_field_name # type: ignore # Pydantic v1 # pragma: no cover + return model.__config__.allow_population_by_field_name # type: ignore # Pydantic v1 from pydantic.fields import FieldInfo as _FieldInfo @@ -476,7 +476,7 @@ def _get_model_fields( ) -> typing.Mapping[str, PydanticField]: if IS_PYDANTIC_V2: return model.model_fields # type: ignore # Pydantic v2 - else: # pragma: no cover + else: return model.__fields__ # type: ignore # Pydantic v1