Skip to content

Commit 87c5672

Browse files
Set tests to use corresponding operating system path
1 parent e853e62 commit 87c5672

File tree

3 files changed

+87
-16
lines changed

3 files changed

+87
-16
lines changed

frouros/tests/integration/test_real.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ def test_elec2_file_not_found_error(elec2_raw: Elec2) -> None:
2323
_ = elec2_raw.load()
2424

2525

26-
# FIXME: PermissionError not raised on Windows or MacOS.
26+
# FIXME: PermissionError not raised on Windows and MacOS.
2727
@pytest.mark.skipif(
28-
sys.platform.startswith("win"), reason="PermissionError not raised on Windows.",
28+
sys.platform.startswith("win"),
29+
reason="PermissionError not raised on Windows.",
2930
)
3031
@pytest.mark.skipif(
31-
sys.platform.startswith("darwin"), reason="PermissionError not raised on MacOS.",
32+
sys.platform.startswith("darwin"),
33+
reason="PermissionError not raised on MacOS.",
3234
)
3335
def test_elec2_permission_error() -> None:
3436
"""Test Elec2 permission error."""

frouros/tests/unit/utils/test_persistence.py

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
from frouros.detectors.concept_drift import DDM, DDMConfig
1111
from frouros.detectors.data_drift import MMD # type: ignore
1212
from frouros.utils import load, save
13+
from frouros.utils.decorators import set_os_filename
1314

1415

1516
@pytest.fixture(
16-
scope="module",
17+
scope="session",
1718
params=[
1819
DDM(
1920
config=DDMConfig(),
@@ -35,7 +36,7 @@ def detector(
3536

3637

3738
@pytest.fixture(
38-
scope="module",
39+
scope="session",
3940
params=[
4041
HistoryConceptDrift(),
4142
PermutationTestDistanceBased(
@@ -56,65 +57,97 @@ def callback(
5657
return request.param
5758

5859

60+
@set_os_filename("detector.pkl")
5961
def test_save_load_with_valid_detector(
62+
request: pytest.FixtureRequest,
6063
detector: BaseDetector,
6164
) -> None:
6265
"""Test save and load with valid detector.
6366
67+
:param request: Request
68+
:type request: pytest.FixtureRequest
6469
:param detector: Detector
6570
:type detector: BaseDetector
6671
"""
67-
filename = "/tmp/detector.pkl"
68-
save(detector, filename)
69-
loaded_detector = load(filename)
72+
filename = request.node.get_closest_marker("filename").args[0]
73+
save(
74+
obj=detector,
75+
filename=filename,
76+
)
77+
loaded_detector = load(
78+
filename=filename,
79+
)
7080
assert isinstance(loaded_detector, detector.__class__)
7181

7282

83+
@set_os_filename("callback.pkl")
7384
def test_save_load_with_valid_callback(
85+
request: pytest.FixtureRequest,
7486
callback: BaseCallback,
7587
) -> None:
7688
"""Test save and load with valid callback.
7789
90+
:param request: Request
91+
:type request: pytest.FixtureRequest
7892
:param callback: Callback
7993
:type callback: BaseCallback
8094
"""
81-
filename = "/tmp/callback.pkl"
82-
save(callback, filename)
83-
loaded_callback = load(filename)
95+
filename = request.node.get_closest_marker("filename").args[0]
96+
save(
97+
obj=callback,
98+
filename=filename,
99+
)
100+
loaded_callback = load(
101+
filename=filename,
102+
)
84103
assert isinstance(loaded_callback, BaseCallback)
85104

86105

87-
def test_save_with_invalid_object() -> None:
106+
@set_os_filename("invalid.pkl")
107+
def test_save_with_invalid_object(
108+
request: pytest.FixtureRequest,
109+
) -> None:
88110
"""Test save with invalid object.
89111
112+
:param request: Request
113+
:type request: pytest.FixtureRequest
90114
:raises TypeError: Type error exception
91115
"""
92116
invalid_object = "invalid"
93-
filename = "/tmp/invalid.pkl"
117+
filename = request.node.get_closest_marker("filename").args[0]
94118
with pytest.raises(TypeError):
95119
save(invalid_object, filename)
96120

97121

122+
@set_os_filename("detector.pkl")
98123
def test_save_with_invalid_protocol(
124+
request: pytest.FixtureRequest,
99125
detector: BaseDetector,
100126
) -> None:
101127
"""Test save with invalid protocol.
102128
129+
:param request: Request
130+
:type request: pytest.FixtureRequest
103131
:param detector: Detector
104132
:type detector: BaseDetector
105133
:raises ValueError: Value error exception
106134
"""
107-
filename = "/tmp/detector.pkl"
108135
invalid_protocol = pickle.HIGHEST_PROTOCOL + 1
136+
filename = request.node.get_closest_marker("filename").args[0]
109137
with pytest.raises(ValueError):
110138
save(detector, filename, invalid_protocol)
111139

112140

113-
def test_load_with_non_existent_file() -> None:
141+
@set_os_filename("non_existent.pkl")
142+
def test_load_with_non_existent_file(
143+
request: pytest.FixtureRequest,
144+
) -> None:
114145
"""Test load with non-existent file.
115146
147+
:param request: Request
148+
:type request: pytest.FixtureRequest
116149
:raises FileNotFoundError: File not found error exception
117150
"""
118-
filename = "/tmp/non_existent.pkl"
151+
filename = request.node.get_closest_marker("filename").args[0]
119152
with pytest.raises(FileNotFoundError):
120153
load(filename)

frouros/utils/decorators.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""Decorators module."""
2+
3+
import functools
4+
import os
5+
from typing import Any
6+
7+
import pytest
8+
9+
10+
def set_os_filename(base_filename: str) -> Any:
11+
"""Set OS filename.
12+
13+
:param base_filename: Base filename
14+
:type base_filename: str
15+
:return: Decorator
16+
:rtype: Any
17+
"""
18+
19+
def decorator(func: Any) -> Any:
20+
if os.name == "nt": # Windows
21+
temp_dir = os.environ.get("TEMP") or os.environ.get("TMP")
22+
filename = f"{temp_dir}\\{base_filename}"
23+
elif os.name == "posix": # Linux or macOS
24+
temp_dir = "/tmp"
25+
filename = f"{temp_dir}/{base_filename}"
26+
else:
27+
raise Exception("Unsupported operating system.")
28+
29+
@functools.wraps(func)
30+
@pytest.mark.filename(filename)
31+
def wrapper(*args: Any, **kwargs: Any) -> Any:
32+
func(*args, **kwargs)
33+
34+
return wrapper
35+
36+
return decorator

0 commit comments

Comments
 (0)