from pathlib import Path from unittest import mock import pytest from folding_studio.cli import app from folding_studio.utils.data_model import MSARequestParams from folding_studio_data_models import ( FeatureMode, MessageStatus, MSAMessage, MSAPublication, ) from typer.testing import CliRunner current_workdir = Path(__file__).parent.resolve() data_dir = Path(current_workdir / "data") runner = CliRunner() @pytest.fixture(autouse=True) def mock_get_auth_headers(): with mock.patch( "folding_studio.commands.msa.get_auth_headers", return_value={"Authorization": "Bearer identity_token"} ) as m: yield m @pytest.fixture() def mock_simple_msa(request): pub = MSAPublication( message=MSAMessage( pipeline_name="msa", user_id="default-user", project_code="default-project", msa_experiment_id="dummy-experiment", model_preset="monomer", fasta_file_name="monomer.fasta", ignore_cache=False, ), status=request.param, ) with mock.patch( "folding_studio.commands.msa.simple_msa", return_value=pub.model_dump(mode="json"), ) as m: yield m @pytest.fixture() def default_params(): yield MSARequestParams( ignore_cache=False, msa_mode=FeatureMode.SEARCH, ) def test_search_with_unsupported_file_fails(tmp_files): result = runner.invoke(app, ["msa", "search", str(tmp_files["invalid_source"])]) assert result.exit_code == 2 assert "Invalid value for 'SOURCE'" in result.stdout @pytest.mark.parametrize( "mock_simple_msa", ( MessageStatus.PUBLISHED, MessageStatus.NOT_PUBLISHED_DONE, MessageStatus.NOT_PUBLISHED_PENDING, ), indirect=True, ) def test_search_with_fasta_file_pass( mock_simple_msa: mock.Mock, tmp_files, default_params, headers, ): result = runner.invoke( app, [ "msa", "search", str(tmp_files["monomer_fasta"]), "--metadata-file", str(tmp_files["metadata_file"]), ], ) assert result.exit_code == 0 mock_simple_msa.assert_called_once_with( file=tmp_files["monomer_fasta"], params=default_params, project_code="FOLDING_DEV" )