54 lines
2.3 KiB
Python
54 lines
2.3 KiB
Python
|
|
import pytest
|
|
from app.services.integrated_classifier import classify_material_integrated
|
|
from app.services.fitting_classifier import classify_fitting
|
|
from app.services.classifier_constants import LEVEL1_TYPE_KEYWORDS
|
|
|
|
def test_classify_simple_pipe():
|
|
result = classify_material_integrated("PIPE, A106 Gr.B, 2 INCH")
|
|
# LEVEL1_TYPE_KEYWORDS["PIPE"] contains "PIPE"
|
|
assert result["category"] == "PIPE"
|
|
|
|
def test_classify_fitting_elbow():
|
|
result = classify_material_integrated("ELBOW 90DEG, BW")
|
|
# Should route to FITTING and then call fitting_classifier
|
|
assert result["category"] == "FITTING"
|
|
# detail check
|
|
if "fitting_type" in result:
|
|
assert result["fitting_type"]["type"] == "ELBOW"
|
|
|
|
def test_classify_swagelok_partno():
|
|
# Regex check in integrated_classifier
|
|
result = classify_material_integrated("SS-400-1-4 CONNECTOR")
|
|
# Should be detected by swagelok_pattern as TUBE_FITTING (Level 0)
|
|
assert result["category"] == "TUBE_FITTING"
|
|
|
|
def test_classify_swagelok_keyword():
|
|
# Keyword check
|
|
result = classify_material_integrated("SWAGELOK UNION 1/4 INCH")
|
|
# 'SWAGELOK' is in FITTING list in constants.
|
|
# So it should be FITTING?
|
|
# BUT integrated_classifier has logic: if detected_type == FITTING -> call classify_fitting
|
|
# classify_fitting checks 'SWAGELOK' -> sets category 'INSTRUMENT_FITTING'
|
|
|
|
# Let's see what meaningful category it returns.
|
|
# The return from classify_fitting overrides integrated result if present.
|
|
assert result["category"] in ["FITTING", "INSTRUMENT_FITTING"]
|
|
|
|
def test_classify_u_bolt():
|
|
# Priority check: U-BOLT is in BOLT keywords but integrated_classifier has early check for SUPPORT
|
|
result = classify_material_integrated("U-BOLT, 2 INCH")
|
|
assert result["category"] == "SUPPORT"
|
|
|
|
def test_classify_pressure_constants_usage():
|
|
# fitting_classifier uses imported constants
|
|
# Test if it recognizes 3000LB (from constants)
|
|
result = classify_fitting("P_DAT", "COUPLING, 3000LB, SW", "2")
|
|
assert result["pressure_rating"]["rating"] == "3000LB"
|
|
assert result["pressure_rating"]["confidence"] > 0.9
|
|
|
|
def test_classify_olet_constants_usage():
|
|
# Detect OLET
|
|
result = classify_fitting("P_DAT", "WELDOLET, 3000LB", "2", "1")
|
|
assert result["fitting_type"]["type"] == "OLET"
|