Skip to content

Commit 82f688a

Browse files
committed
fix: make path assertions platform-agnostic for Windows CI
Tests hard-coded forward-slash path strings while production uses ``Path``/``os.path.join`` which emit native separators (``\`` on Windows). Switch the literal assertions to ``os.path.join`` and patch ``Path.home`` in ``test_fallback_home_cache`` so the empty-env scenario does not crash on Windows where ``Path.home()`` requires ``USERPROFILE``. - tests/test_model_management.py: collect-metadata key uses os.path.join - tests/test_onnx_model_loading.py: EXPECTED_MODEL_PATH constant via os.path.join - tests/test_utils.py: pre-resolve Path.home() and patch it before clearing env
1 parent 5248b3d commit 82f688a

3 files changed

Lines changed: 26 additions & 11 deletions

File tree

tests/test_model_management.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import hashlib
55
import io
66
import json
7+
import os
78
import tarfile
89
from pathlib import Path
910
from typing import Any
@@ -923,8 +924,9 @@ def test_collect_file_metadata_logic(self, mock_snap, mock_info, mock_tree, tmp_
923924
assert "model.onnx" in metadata
924925
assert metadata["model.onnx"] == {"size": 500, "blob_id": "aaa"}
925926

926-
assert "sub/config.json" in metadata
927-
assert metadata["sub/config.json"] == {"size": 100, "blob_id": "bbb"}
927+
sub_key = os.path.join("sub", "config.json")
928+
assert sub_key in metadata
929+
assert metadata[sub_key] == {"size": 100, "blob_id": "bbb"}
928930

929931
assert "extra.txt" not in metadata
930932
assert ModelManagement.METADATA_FILE not in metadata

tests/test_onnx_model_loading.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
from pathlib import Path
23
from typing import Any
34
from unittest.mock import MagicMock, patch
@@ -7,6 +8,11 @@
78
from qwen3_embed.common.onnx_model import OnnxModel, OnnxOutputContext
89
from qwen3_embed.common.types import Device
910

11+
# Production code builds the model path via ``Path(model_dir) / model_file``,
12+
# which renders with the platform-native separator (``\`` on Windows, ``/`` on
13+
# POSIX). Using ``os.path.join`` keeps the assertion accurate on every OS.
14+
EXPECTED_MODEL_PATH = os.path.join("dummy", "model.onnx")
15+
1016

1117
# Concrete implementation for testing
1218
class ConcreteOnnxModel(OnnxModel[Any]):
@@ -52,7 +58,7 @@ def test_load_defaults(model: ConcreteOnnxModel, mock_ort):
5258

5359
# Should use CPUExecutionProvider
5460
mock_ort.InferenceSession.assert_called_with(
55-
"dummy/model.onnx",
61+
EXPECTED_MODEL_PATH,
5662
providers=["CPUExecutionProvider"],
5763
sess_options=mock_ort.SessionOptions.return_value,
5864
)
@@ -71,7 +77,7 @@ def test_load_cuda_explicit(model: ConcreteOnnxModel, mock_ort):
7177
model._load_onnx_model(Path("dummy"), "model.onnx", threads=None, cuda=True)
7278

7379
mock_ort.InferenceSession.assert_called_with(
74-
"dummy/model.onnx",
80+
EXPECTED_MODEL_PATH,
7581
providers=["CUDAExecutionProvider"],
7682
sess_options=mock_ort.SessionOptions.return_value,
7783
)
@@ -90,7 +96,7 @@ def test_load_cuda_auto_available(model: ConcreteOnnxModel, mock_ort):
9096
model._load_onnx_model(Path("dummy"), "model.onnx", threads=None, cuda=Device.AUTO)
9197

9298
mock_ort.InferenceSession.assert_called_with(
93-
"dummy/model.onnx",
99+
EXPECTED_MODEL_PATH,
94100
providers=["CUDAExecutionProvider"],
95101
sess_options=mock_ort.SessionOptions.return_value,
96102
)
@@ -104,7 +110,7 @@ def test_load_cuda_auto_unavailable(model: ConcreteOnnxModel, mock_ort):
104110

105111
# Should fallback to CPU
106112
mock_ort.InferenceSession.assert_called_with(
107-
"dummy/model.onnx",
113+
EXPECTED_MODEL_PATH,
108114
providers=["CPUExecutionProvider"],
109115
sess_options=mock_ort.SessionOptions.return_value,
110116
)
@@ -125,7 +131,7 @@ def test_load_explicit_providers(model: ConcreteOnnxModel, mock_ort):
125131
)
126132

127133
mock_ort.InferenceSession.assert_called_with(
128-
"dummy/model.onnx",
134+
EXPECTED_MODEL_PATH,
129135
providers=["CUDAExecutionProvider"],
130136
sess_options=mock_ort.SessionOptions.return_value,
131137
)
@@ -171,7 +177,7 @@ def test_load_dml_auto(model: ConcreteOnnxModel, mock_ort):
171177
model._load_onnx_model(Path("dummy"), "model.onnx", threads=None, cuda=Device.AUTO)
172178

173179
mock_ort.InferenceSession.assert_called_with(
174-
"dummy/model.onnx",
180+
EXPECTED_MODEL_PATH,
175181
providers=["DmlExecutionProvider"],
176182
sess_options=mock_ort.SessionOptions.return_value,
177183
)

tests/test_utils.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,17 @@ def test_xdg_cache_home(self, mock_chmod, mock_mkdir):
363363

364364
@patch("qwen3_embed.common.utils.Path.mkdir")
365365
@patch("qwen3_embed.common.utils.Path.chmod")
366-
@patch.dict(os.environ, {}, clear=True)
367366
def test_fallback_home_cache(self, mock_chmod, mock_mkdir):
368-
res = define_cache_dir()
369-
assert res == Path.home() / ".cache/qwen3_embed"
367+
# Resolve the expected home dir BEFORE clearing the environment, since
368+
# ``Path.home()`` on Windows depends on env vars (USERPROFILE etc.) that
369+
# ``clear=True`` would wipe and cause a RuntimeError.
370+
fake_home = Path.home()
371+
with (
372+
patch.dict(os.environ, {}, clear=True),
373+
patch("qwen3_embed.common.utils.Path.home", return_value=fake_home),
374+
):
375+
res = define_cache_dir()
376+
assert res == fake_home / ".cache/qwen3_embed"
370377
mock_mkdir.assert_called_once_with(mode=0o700, parents=True, exist_ok=True)
371378
mock_chmod.assert_called_once_with(0o700)
372379

0 commit comments

Comments
 (0)