vsp-demo / tests /vsp /app /classifiers /test_education_classifier.py
navkast
Add a test for main.py (#3)
e261f25 unverified
from unittest.mock import AsyncMock, MagicMock
import pytest
from vsp.app.classifiers.education_classifier import EducationClassification, EducationClassifier, SchoolType
from vsp.app.model.linkedin.linkedin_models import DateComponent, Education, LinkedinProfile
@pytest.fixture
def mock_llm_service():
return AsyncMock()
@pytest.fixture
def mock_prompt_loader():
loader = MagicMock()
loader.load_template.return_value = MagicMock()
loader.create_prompt.return_value = AsyncMock()
return loader
@pytest.fixture
def education_classifier(mock_llm_service, mock_prompt_loader):
return EducationClassifier(llm_service=mock_llm_service, prompt_loader=mock_prompt_loader)
@pytest.fixture
def sample_linkedin_profile():
return LinkedinProfile(
first_name="John",
last_name="Doe",
educations=[
Education(
school_name="Stanford University",
degree="Master of Business Administration",
field_of_study="Business Administration",
start=DateComponent(year=2018),
end=DateComponent(year=2020),
)
],
)
@pytest.mark.asyncio
async def test_classify_education(education_classifier, sample_linkedin_profile, mock_prompt_loader):
mock_prompt = mock_prompt_loader.create_prompt.return_value
mock_prompt.evaluate.return_value = EducationClassification(
output=SchoolType.MBA,
confidence=0.95,
reasoning="This is a Master of Business Administration degree from Stanford University.",
)
result = await education_classifier.classify_education(
sample_linkedin_profile, sample_linkedin_profile.educations[0]
)
assert isinstance(result, EducationClassification)
assert result.output == SchoolType.MBA
assert result.confidence == 0.95
assert "Master of Business Administration" in result.reasoning
@pytest.mark.parametrize(
"output,expected",
[
("PRIMARY_SECONDARY", SchoolType.PRIMARY_SECONDARY),
("UNDERGRAD_INCOMPLETE", SchoolType.UNDERGRAD_INCOMPLETE),
("UNDERGRAD_COMPLETED", SchoolType.UNDERGRAD_COMPLETED),
("MBA", SchoolType.MBA),
("LAW_SCHOOL", SchoolType.LAW_SCHOOL),
("GRAD_SCHOOL", SchoolType.GRAD_SCHOOL),
("PHD", SchoolType.PHD),
("OTHER", SchoolType.OTHER),
],
)
def test_parse_output(output, expected):
parsed = EducationClassifier._parse_output(f"output: {output}\nconfidence: 0.9\nreasoning: Test reasoning")
assert parsed.output == expected
assert parsed.confidence == 0.9
assert parsed.reasoning == "Test reasoning"
def test_parse_output_invalid():
with pytest.raises(ValueError):
EducationClassifier._parse_output("output: INVALID\nconfidence: 0.9\nreasoning: Test reasoning")