import pytest from app.services.career_engine import CareerGuidanceService from app.services.graph_client import KnowledgeGraphClient from app.contracts.dtos import MasteryLevel @pytest.mark.asyncio async def test_career_state_estimation(): # Setup graph_client = KnowledgeGraphClient() service = CareerGuidanceService(graph_client) learner_id = "test_learner_123" # Execution readiness_reports = await service.estimate_career_state(learner_id) # Verification assert len(readiness_reports) > 0 # Current mock graph has 3 roles assert len(readiness_reports) == 3 # Check logic for r1 (Data Scientist) - needs s1, s2, s3 # Learner has s1 (Competent), s2 (Novice) # Missing s3 r1_report = next(r for r in readiness_reports if r.role_id == "r1") assert r1_report.readiness_score < 1.0 assert len(r1_report.gaps) > 0 assert any(g.skill_id == "s3" for g in r1_report.gaps) @pytest.mark.asyncio async def test_path_generation(): graph_client = KnowledgeGraphClient() service = CareerGuidanceService(graph_client) learner_id = "test_learner_123" paths = await service.generate_paths(learner_id, max_paths=2) assert len(paths) <= 2 assert len(paths) > 0 first_path = paths[0] assert first_path.target_role.role_id == "r1" # Mock sort puts r1 first/last depending on score, actually sort is desc score. # checking logic: # r1: 2/3 skills = 0.66 # r2: 1/1 skills = 1.0 (s2 is required, learner has s2) -> wait, s2 matches? # learner has s1, s2. r2 needs s2. Matches = 1/1 = 1.0. # r3: needs s1, s3, s4. Learner has s1. 1/3 = 0.33. # So order should be r2, r1, r3. # Let's verify the "best" path is indeed r2 (Data Analyst) # The current mock implementation sort logic: sorted(readiness_reports, key=lambda x: x.readiness_score, reverse=True) # Actually wait, r1 needs s1, s2, s3. Learner has s1, s2. So 2/3. # r2 needs s2. Learner has s2. So 1/1. assert paths[0].target_role.role_id == "r2" assert paths[0].confidence_band == "high" # score 1.0 > 0.7 @pytest.mark.asyncio async def test_activate_path(): graph_client = KnowledgeGraphClient() service = CareerGuidanceService(graph_client) learner_id = "test_learner_123" contract = await service.activate_path(learner_id, "traj_123") assert contract.learner_id == learner_id assert contract.status == "active"