from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.pool import StaticPool from modelforge_api.domain.projects import ProjectCreate, ProjectRequirementCreate from modelforge_api.persistence.models import ArtifactSet, Base, Model, ModelRevision from modelforge_api.services.projects import ProjectService from tests.test_serving import approve_and_promote, setup_m5 def test_project_workspace_resolves_exact_model_behind_stable_capability() -> None: engine = create_engine( "sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool, ) Base.metadata.create_all(engine) try: with Session(engine) as session: serving, candidate, _node = setup_m5(session) _approval, deployment = approve_and_promote(serving, candidate.id) projects = ProjectService(serving) projects.create(ProjectCreate( key="managed-model-app", name="Managed model app", description="Model management contract", owner="Operator", )) workspace = projects.bind( "managed-model-app", ProjectRequirementCreate( capability="rag.embedding@1", migration_support="reindex", ), ) requirement = workspace.requirements[0] assert requirement.deployment_id == deployment.id assert requirement.serving_model is not None artifact_set = session.get(ArtifactSet, deployment.artifact_set_id) assert artifact_set is not None revision = session.get(ModelRevision, artifact_set.revision_id) assert revision is not None model = session.get(Model, revision.model_id) assert model is not None assert requirement.serving_model.model_id == model.id assert requirement.serving_model.display_name == model.display_name assert requirement.serving_model.revision_id == revision.id assert requirement.serving_model.resolved_commit_sha == revision.resolved_commit_sha assert requirement.serving_model.artifact_set_id == artifact_set.id assert requirement.serving_model.runtime_profile_id == deployment.runtime_profile_id assert requirement.serving_model.compute_node_id == deployment.compute_node_id finally: engine.dispose()