Skip to content

Commit 9a312d9

Browse files
fix(tests): resolve configuration validation flow test issues
- Fixed Pydantic model construction in settings (`DefaultFastMcpServerSettings` and `DefaultFailoverSettings()`). - Added robust checks for `UNSET` and `None` when configuring profiles in `root_settings.py`. - Fixed `AttributeError` for `__pydantic_private__` within `CodeWeaverCoreSettings._set_unset_fields`. - Standardized mock method names in `tests/integration/test_config_validation_flow.py` by replacing `.load_checkpoint()` with `.load()`. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com>
1 parent 16512cb commit 9a312d9

File tree

6 files changed

+21
-28
lines changed

6 files changed

+21
-28
lines changed

src/codeweaver/core/config/core_settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,8 @@ async def _finalize(self) -> None:
460460

461461
def _set_unset_fields(self, **kwargs: Any) -> None:
462462
"""Update the set of unset fields based on provided kwargs."""
463-
self._unset_fields = self._unset_fields or set()
463+
if not hasattr(self, "_unset_fields") or self._unset_fields is None:
464+
self._unset_fields = set()
464465
self._unset_fields |= {
465466
key for key in kwargs if kwargs[key] is UNSET and key in type(self).model_fields
466467
}

src/codeweaver/engine/config/root_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def __init__(
9494
data["failover"] = (
9595
failover
9696
if failover is not UNSET and failover is not None
97-
else FailoverSettings.model_construct(**DefaultFailoverSettings)
97+
else FailoverSettings.model_construct(**DefaultFailoverSettings())
9898
)
9999
super().__init__(**data)
100100

src/codeweaver/providers/config/root_settings.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,11 @@ def __init__(
103103
else:
104104
data["provider"] = provider
105105
else:
106+
actual_profile = profile if profile is not UNSET and profile is not None else (
107+
ProviderProfile.TESTING if is_test_environment() else ProviderProfile.RECOMMENDED
108+
)
106109
data["provider"] = ProviderSettings.model_construct(
107-
**cast(
108-
ProviderProfile,
109-
(
110-
profile
111-
or (
112-
ProviderProfile.TESTING
113-
if is_test_environment()
114-
else ProviderProfile.RECOMMENDED
115-
)
116-
),
117-
).as_provider_settings()
110+
**cast(ProviderProfile, actual_profile).as_provider_settings()
118111
)
119112
super().__init__(**data)
120113

src/codeweaver/server/config/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ def __init__(
329329
data["stdio_server"] = (
330330
stdio_server
331331
if stdio_server is not UNSET and stdio_server is not None
332-
else FastMcpStdioServerSettings.model_construct(**BaseFastMcpServerSettings)
332+
else FastMcpStdioServerSettings.model_construct(**DefaultFastMcpServerSettings)
333333
)
334334
data["middleware"] = (
335335
middleware

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import pytest
1919

20-
from pydantic.types import UUID7
20+
from pydantic import UUID7
2121
from qdrant_client import AsyncQdrantClient
2222

2323
from codeweaver.core import (

tests/integration/test_config_validation_flow.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ def mock_checkpoint_manager(test_checkpoint_data: dict) -> Mock:
113113
manager.load = AsyncMock(return_value=checkpoint)
114114
manager.save = AsyncMock()
115115
manager.delete = AsyncMock()
116-
# Some tests may call `load_checkpoint()` instead of `load()`;
117-
# make it an alias so both return the same checkpoint object.
116+
# Alias provided for backwards compatibility if needed.
118117
if hasattr(manager, "load_checkpoint"):
119118
manager.load_checkpoint = manager.load
120119
if hasattr(manager, "validate_checkpoint_compatibility"):
@@ -336,7 +335,7 @@ async def test_compatible_query_model_change(
336335
new_config.datatype = "float32"
337336

338337
# Get checkpoint metadata
339-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
338+
checkpoint = await mock_checkpoint_manager.load()
340339

341340
# Create fingerprint from checkpoint metadata
342341
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -382,7 +381,7 @@ async def test_transformable_dimension_reduction(
382381
new_config.dimension = 1024 # Reduced from 2048
383382
new_config.datatype = "float32"
384383

385-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
384+
checkpoint = await mock_checkpoint_manager.load()
386385

387386
# Create fingerprint from checkpoint metadata
388387
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -430,7 +429,7 @@ async def test_breaking_model_change(
430429
new_config.dimension = 2048
431430
new_config.datatype = "float32"
432431

433-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
432+
checkpoint = await mock_checkpoint_manager.load()
434433

435434
# Create fingerprint from checkpoint metadata
436435
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -556,7 +555,7 @@ async def test_uses_voyage_3_empirical_data(
556555
new_config.dimension = 512
557556
new_config.datatype = "float32"
558557

559-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
558+
checkpoint = await mock_checkpoint_manager.load()
560559

561560
# Create fingerprint
562561
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -605,7 +604,7 @@ async def test_falls_back_to_generic_for_unmapped_dimensions(
605604
new_config.dimension = 768 # Uncommon dimension
606605
new_config.datatype = "float32"
607606

608-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
607+
checkpoint = await mock_checkpoint_manager.load()
609608

610609
# Create fingerprint
611610
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -656,7 +655,7 @@ async def test_handles_very_large_collection(
656655
from codeweaver.engine.services.config_analyzer import ConfigChangeAnalyzer
657656

658657
# Update checkpoint with large vector count
659-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
658+
checkpoint = await mock_checkpoint_manager.load()
660659
checkpoint.total_vectors = 10_000_000
661660

662661
analyzer = ConfigChangeAnalyzer(
@@ -703,7 +702,7 @@ async def test_handles_zero_vectors(
703702
test_settings: Mock,
704703
) -> None:
705704
"""Test handling of collection with zero vectors."""
706-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
705+
checkpoint = await mock_checkpoint_manager.load()
707706
checkpoint.total_vectors = 0
708707

709708
from codeweaver.engine.services.config_analyzer import ConfigChangeAnalyzer
@@ -778,7 +777,7 @@ async def test_breaking_change_provides_recovery_steps(
778777
new_config.dimension = 2048
779778
new_config.datatype = "float32"
780779

781-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
780+
checkpoint = await mock_checkpoint_manager.load()
782781

783782
# Create fingerprint
784783
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -827,7 +826,7 @@ async def test_transformable_change_provides_strategy(
827826
new_config.dimension = 512 # Reduction
828827
new_config.datatype = "float32"
829828

830-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
829+
checkpoint = await mock_checkpoint_manager.load()
831830

832831
# Create fingerprint
833832
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -888,7 +887,7 @@ async def test_estimates_scale_with_vector_count(
888887
new_config.dimension = 1024
889888
new_config.datatype = "float32"
890889

891-
await mock_checkpoint_manager.load_checkpoint()
890+
await mock_checkpoint_manager.load()
892891

893892
# Create fingerprint
894893
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint
@@ -940,7 +939,7 @@ async def test_no_change_has_zero_estimates(
940939
new_config.dimension = 2048
941940
new_config.datatype = "float32"
942941

943-
checkpoint = await mock_checkpoint_manager.load_checkpoint()
942+
checkpoint = await mock_checkpoint_manager.load()
944943

945944
# Create fingerprint
946945
from codeweaver.engine.managers.checkpoint_manager import CheckpointSettingsFingerprint

0 commit comments

Comments
 (0)