Skip to content

Commit b312107

Browse files
committed
fix: updated for instance methods
1 parent 7f7c900 commit b312107

File tree

1 file changed

+45
-35
lines changed

1 file changed

+45
-35
lines changed

tests/unit/test_write_score_code.py

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,16 @@
44
# Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
55
# SPDX-License-Identifier: Apache-2.0
66

7-
import json
8-
import os
9-
import pickle
10-
import random
117
import tempfile
128
import unittest
139
from pathlib import Path
1410
from unittest.mock import DEFAULT, MagicMock, patch
1511

16-
import numpy as np
1712
import pandas as pd
1813
import pytest
1914

20-
import sasctl.pzmm as pzmm
2115
from sasctl import current_session
2216
from sasctl.core import RestObj, VersionInfo
23-
from sasctl.pzmm.write_score_code import ScoreCode as sc
2417
from sasctl.pzmm.write_score_code import ScoreCode
2518

2619

@@ -38,7 +31,7 @@ def score_code_mocks():
3831
_write_imports=MagicMock(),
3932
_viya35_model_load=DEFAULT,
4033
_viya4_model_load=DEFAULT,
41-
_check_valid_model_prefix=DEFAULT,
34+
sanitize_model_prefix=DEFAULT,
4235
_impute_missing_values=MagicMock(),
4336
_predict_method=MagicMock(),
4437
_predictions_to_metrics=MagicMock(),
@@ -54,6 +47,7 @@ def test_get_model_id():
5447
- Model not found
5548
- Model found
5649
"""
50+
sc = ScoreCode()
5751
with pytest.raises(ValueError):
5852
sc._get_model_id(None)
5953

@@ -74,6 +68,7 @@ def test_check_for_invalid_variable_names():
7468
- Valid variables only
7569
"""
7670
var_list = ["bad_variable", "good_variable", "awful variable"]
71+
sc = ScoreCode()
7772
with pytest.raises(SyntaxError):
7873
sc._check_for_invalid_variable_names(var_list)
7974
try:
@@ -97,21 +92,21 @@ def test_write_imports():
9792
current_session("example.com", "user", "password")
9893

9994
with patch("sasctl.core.Session.version_info") as version:
95+
sc = ScoreCode()
10096
version.return_value = VersionInfo(3)
10197
sc._write_imports(pickle_type="dill")
10298
assert "import settings" not in sc.score_code
10399
assert "import dill" in sc.score_code
104-
sc.score_code = ""
105100

101+
sc = ScoreCode()
106102
version.return_value = VersionInfo(4)
107103
sc._write_imports(mojo_model=True)
108104
assert "import settings" in sc.score_code
109105
assert "import h2o" in sc.score_code
110-
sc.score_code = ""
111106

107+
sc = ScoreCode()
112108
sc._write_imports(binary_string=b"test binary string")
113109
assert "import codecs" in sc.score_code
114-
sc.score_code = ""
115110

116111

117112
def test_viya35_model_load():
@@ -121,20 +116,20 @@ def test_viya35_model_load():
121116
- mojo model
122117
- binary h2o model
123118
"""
119+
sc = ScoreCode()
124120
load_text = sc._viya35_model_load("1234", "normal")
125121
assert "pickle.load(pickle_model)" in sc.score_code
126122
assert "pickle.load(pickle_model)" in load_text
127-
sc.score_code = ""
128123

124+
sc = ScoreCode()
129125
mojo_text = sc._viya35_model_load("2345", "mojo", mojo_model=True)
130126
assert "h2o.import_mojo" in sc.score_code
131127
assert "h2o.import_mojo" in mojo_text
132-
sc.score_code = ""
133128

129+
sc = ScoreCode()
134130
binary_text = sc._viya35_model_load("3456", "binary", binary_h2o_model=True)
135131
assert "h2o.load" in sc.score_code
136132
assert "h2o.load" in binary_text
137-
sc.score_code = ""
138133

139134

140135
def test_viya4_model_load():
@@ -145,21 +140,22 @@ def test_viya4_model_load():
145140
- binary h2o model
146141
- Tensorflow keras model
147142
"""
143+
sc = ScoreCode()
148144
load_text = sc._viya4_model_load("normal")
149145
assert "pickle.load(pickle_model)" in sc.score_code
150146
assert "pickle.load(pickle_model)" in load_text
151-
sc.score_code = ""
152147

148+
sc = ScoreCode()
153149
mojo_text = sc._viya4_model_load("mojo", mojo_model=True)
154150
assert "h2o.import_mojo" in sc.score_code
155151
assert "h2o.import_mojo" in mojo_text
156-
sc.score_code = ""
157152

153+
sc = ScoreCode()
158154
binary_text = sc._viya4_model_load("binary", binary_h2o_model=True)
159155
assert "h2o.load" in sc.score_code
160156
assert "h2o.load" in binary_text
161-
sc.score_code = ""
162157

158+
sc = ScoreCode()
163159
keras_text = sc._viya4_model_load("tensorflow", tf_keras_model=True)
164160
assert "tf.keras.models.load_model" in sc.score_code
165161
assert "tf.keras.models.load_model" in keras_text
@@ -174,20 +170,23 @@ def test_impute_missing_values():
174170
test_df = pd.DataFrame(
175171
data=[[0, "a", 1], [2, "b", 0]], columns=["num", "char", "bin"]
176172
)
173+
sc = ScoreCode()
177174
sc._impute_missing_values(test_df, True)
178-
assert "'num': 1" in sc.score_code
175+
assert "'num': 1" in sc.score_code or "'num': np.float64(1.0)" in sc.score_code
179176
assert "'char': ''" in sc.score_code
180-
assert "'bin': 0" in sc.score_code
177+
assert "'bin': 0" in sc.score_code or "'bin': np.int64(0)" in sc.score_code
181178

179+
sc = ScoreCode()
182180
sc._impute_missing_values(test_df, [5, "test", 1])
183-
assert "'num': 5" in sc.score_code
181+
assert "'num': 5" in sc.score_code or "'num': np.float64(5.0)" in sc.score_code
184182
assert "'char': 'test'" in sc.score_code
185-
assert "'bin': 1" in sc.score_code
183+
assert "'bin': 1" in sc.score_code or "'bin': np.int64(1)" in sc.score_code
186184

185+
sc = ScoreCode()
187186
sc._impute_missing_values(test_df, {"a": 5, "b": "test", "c": 1})
188-
assert "'a': 5" in sc.score_code
187+
assert "'a': 5" in sc.score_code or "'a': np.float64(5.0)" in sc.score_code
189188
assert "'b': 'test'" in sc.score_code
190-
assert "'c': 1" in sc.score_code
189+
assert "'c': 1" in sc.score_code or "'c': np.int64(1)" in sc.score_code
191190

192191

193192
def test_predict_method():
@@ -197,19 +196,19 @@ def test_predict_method():
197196
- h2o model, based of dtype_list input
198197
- statsmodels model
199198
"""
199+
sc = ScoreCode()
200200
var_list = ["first", "second", "third"]
201201
dtype_list = ["str", "int", "float"]
202202
sc._predict_method(predict_proba, var_list)
203203
assert '{"first": first, "second": second' in sc.score_code
204-
sc.score_code = ""
205204

205+
sc = ScoreCode()
206206
sc._predict_method(predict_proba, var_list, dtype_list=dtype_list)
207207
assert "column_types = " in sc.score_code
208-
sc.score_code = ""
209208

209+
sc = ScoreCode()
210210
sc._predict_method(predict_proba, var_list, statsmodels_model=True)
211211
assert '{"const": const, "first": first' in sc.score_code
212-
sc.score_code = ""
213212

214213

215214
def test_determine_returns_type():
@@ -220,6 +219,7 @@ def test_determine_returns_type():
220219
- mixture of values/types
221220
- unexpected types
222221
"""
222+
sc = ScoreCode()
223223
assert sc._determine_returns_type(["TestReturn", 1.2]) == [True, False]
224224
assert sc._determine_returns_type([int, float, str]) == [False, False, True]
225225
assert sc._determine_returns_type(["TestReturn", int, str]) == [True, False, True]
@@ -232,6 +232,7 @@ def test_yield_score_metrics():
232232
- Any order for classification/prediction values
233233
- No target variable provided
234234
"""
235+
sc = ScoreCode()
235236
metrics = sc._yield_score_metrics(
236237
[False, True, False], ["Math", "English"], "ClassyVar"
237238
)
@@ -251,6 +252,7 @@ def test_determine_score_metrics():
251252
- len(predict_returns == False) = [0, =len(tv), Any]
252253
- target_variable = [None, Any]
253254
"""
255+
sc = ScoreCode()
254256
assert sc._determine_score_metrics([float], "TestPredict", None) == [
255257
f"I_TestPredict"
256258
]
@@ -305,7 +307,7 @@ def test_determine_score_metrics():
305307

306308
class TestNoTargetsNoThresholds(unittest.TestCase):
307309
def setUp(self):
308-
self.sc = ScoreCode
310+
self.sc = ScoreCode()
309311

310312
def tearDown(self):
311313
self.sc.score_code = ""
@@ -417,11 +419,9 @@ def test_multi_metric_h2o(self):
417419

418420
class TestBinaryTarget(unittest.TestCase):
419421
def setUp(self):
420-
self.sc = ScoreCode
422+
self.sc = ScoreCode()
421423
self.target_values = ["A", "B"]
422424

423-
def tearDown(self):
424-
self.sc.score_code = ""
425425

426426
def execute_snippet(self, *args):
427427
scope = {}
@@ -430,6 +430,8 @@ def execute_snippet(self, *args):
430430
return test_snippet(*args)
431431

432432
def test_improper_arguments(self):
433+
sc = ScoreCode()
434+
433435
with pytest.raises(ValueError):
434436
sc._binary_target([], [], ["A", 1, 2, 3])
435437
with pytest.raises(ValueError):
@@ -830,17 +832,14 @@ def test_three_metrics_three_returns(self):
830832

831833
class TestNonbinaryTargets(unittest.TestCase):
832834
def setUp(self):
833-
self.sc = ScoreCode
835+
self.sc = ScoreCode()
834836
self.sc.score_code = (
835837
"import pandas as pd\n"
836838
"import numpy as np\n"
837839
"def test_snippet(input_array, prediction):\n"
838840
)
839841
self.target_values = ["A", "B", "C"]
840842

841-
def tearDown(self):
842-
self.sc.score_code = ""
843-
844843
def execute_snippet(self, *args):
845844
scope = {}
846845
exec(self.sc.score_code, scope)
@@ -1090,6 +1089,7 @@ def test_predictions_to_metrics():
10901089
- raise error for binary model w/ nonbinary targets
10911090
- raise error for no target_values, but thresholds provided
10921091
"""
1092+
sc = ScoreCode()
10931093
with patch("sasctl.pzmm.ScoreCode._no_targets_no_thresholds") as func:
10941094
metrics = ["Classification"]
10951095
returns = [1]
@@ -1122,6 +1122,7 @@ def test_input_var_lists():
11221122
- default
11231123
- mlflow
11241124
"""
1125+
sc = ScoreCode()
11251126
data = pd.DataFrame(data=[[1, "A"], [5, "B"]], columns=["First", "Second"])
11261127
var_list, dtypes_list = sc._input_var_lists(data)
11271128
assert var_list == ["First", "Second"]
@@ -1146,6 +1147,8 @@ def test_check_viya_version(mock_version, mock_get_model):
11461147
current_session(None)
11471148
mock_version.return_value = None
11481149
model = {"name": "Test", "id": "abc123"}
1150+
sc = ScoreCode()
1151+
11491152
with pytest.warns():
11501153
assert sc._check_viya_version(model) is None
11511154

@@ -1170,6 +1173,7 @@ def test_check_valid_model_prefix():
11701173
- check model_prefix validity
11711174
- raise warning and replace if invalid
11721175
"""
1176+
sc = ScoreCode()
11731177
assert sc.sanitize_model_prefix("TestPrefix") == "TestPrefix"
11741178
assert sc.sanitize_model_prefix("Test Prefix") == "Test_Prefix"
11751179

@@ -1194,9 +1198,10 @@ def test_write_score_code(score_code_mocks):
11941198
score_code_mocks["_viya35_model_load"].return_value = "3.5"
11951199
score_code_mocks["_viya4_model_load"].return_value = "4"
11961200
score_code_mocks["_viya35_score_code_import"].return_value = ("MAS", "CAS")
1197-
score_code_mocks["_check_valid_model_prefix"].return_value = "TestModel"
1201+
score_code_mocks["sanitize_model_prefix"].return_value = "TestModel"
11981202

11991203
# No binary string or model file provided
1204+
sc = ScoreCode()
12001205
with pytest.raises(ValueError):
12011206
sc.write_score_code(
12021207
"TestModel",
@@ -1205,6 +1210,7 @@ def test_write_score_code(score_code_mocks):
12051210
)
12061211

12071212
# Binary string and model file provided
1213+
sc = ScoreCode()
12081214
with pytest.raises(ValueError):
12091215
sc.write_score_code(
12101216
"TestModel",
@@ -1214,6 +1220,7 @@ def test_write_score_code(score_code_mocks):
12141220
binary_string=b"Binary model string.",
12151221
)
12161222

1223+
sc = ScoreCode()
12171224
sc.write_score_code(
12181225
"TestModel",
12191226
pd.DataFrame(data=[["A", 1], ["B", 2]], columns=["First", "Second"]),
@@ -1222,6 +1229,7 @@ def test_write_score_code(score_code_mocks):
12221229
)
12231230
score_code_mocks["_viya4_model_load"].assert_called_once()
12241231

1232+
sc = ScoreCode()
12251233
score_code_mocks["_check_viya_version"].return_value = "abc123"
12261234
sc.write_score_code(
12271235
"TestModel",
@@ -1231,6 +1239,7 @@ def test_write_score_code(score_code_mocks):
12311239
)
12321240
score_code_mocks["_viya35_model_load"].assert_called_once()
12331241

1242+
sc = ScoreCode()
12341243
output_dict = sc.write_score_code(
12351244
"TestModel",
12361245
pd.DataFrame(data=[["A", 1], ["B", 2]], columns=["First", "Second"]),
@@ -1241,6 +1250,7 @@ def test_write_score_code(score_code_mocks):
12411250
assert "dmcas_packagescorecode.sas" in output_dict
12421251
assert "dmcas_epscorecode.sas" in output_dict
12431252

1253+
sc = ScoreCode()
12441254
tmp_dir = tempfile.TemporaryDirectory()
12451255
sc.write_score_code(
12461256
"TestModel",

0 commit comments

Comments
 (0)