| 141 | |
| 142 | |
| 143 | class TestAIModelDeserializationPatterns: |
| 144 | def test_keras_h5_model_load_metadata(self): |
| 145 | rule = _ai_rule("AI203") |
| 146 | assert rule["severity"] == "High" |
| 147 | assert rule["cwe"] == "CWE-502" |
| 148 | assert rule["pattern"] == r"keras\.models\.load_model" |
| 149 | |
| 150 | def test_keras_h5_model_load_fires(self): |
| 151 | code = """ |
| 152 | model = keras.models.load_model(model_path) |
| 153 | """ |
| 154 | assert fires(code, "AI203") |
| 155 | |
| 156 | def test_commented_keras_h5_model_load_safe(self): |
| 157 | code = """ |
| 158 | # model = keras.models.load_model(model_path) |
| 159 | """ |
| 160 | assert not fires(code, "AI203") |
| 161 | |
| 162 | def test_joblib_model_load_metadata(self): |
| 163 | rule = _ai_rule("AI204") |
| 164 | assert rule["severity"] == "High" |
| 165 | assert rule["cwe"] == "CWE-502" |
| 166 | assert rule["pattern"] == r"joblib\.load" |
| 167 | |
| 168 | def test_joblib_model_load_fires(self): |
| 169 | code = """ |
| 170 | model = joblib.load(model_path) |
| 171 | """ |
| 172 | assert fires(code, "AI204") |
| 173 | |
| 174 | def test_commented_joblib_model_load_safe(self): |
| 175 | code = """ |
| 176 | # model = joblib.load(model_path) |
| 177 | """ |
| 178 | assert not fires(code, "AI204") |
| 179 | class TestAI202: |
| 180 | def test_rule_metadata(self): |
| 181 | rule = _ai_rule("AI202") |
nothing calls this directly
no outgoing calls
no test coverage detected