diff --git a/.github/workflows/package-test-coverage.yml b/.github/workflows/package-test-coverage.yml new file mode 100644 index 00000000..832cb96f --- /dev/null +++ b/.github/workflows/package-test-coverage.yml @@ -0,0 +1,40 @@ +name: Package Test Coverage + +on: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + package-tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install package test dependencies + working-directory: ./package + run: | + python -m pip install --upgrade pip + python -m pip install -e ".[test]" + + - name: Run package tests with coverage + working-directory: ./package + run: | + python -m pytest --cov=pyaslreport --cov-report=term-missing --cov-report=xml:coverage.xml --junitxml=pytest.xml + + - name: Upload coverage artifacts + uses: actions/upload-artifact@v4 + with: + name: package-test-artifacts + path: | + package/coverage.xml + package/pytest.xml diff --git a/package/pyproject.toml b/package/pyproject.toml index ea50b37d..075fc5cc 100644 --- a/package/pyproject.toml +++ b/package/pyproject.toml @@ -14,6 +14,12 @@ dependencies = [ "dicom2nifti~=2.6.2", ] +[project.optional-dependencies] +test = [ + "pytest", + "pytest-cov", +] + [build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" diff --git a/package/pytest.ini b/package/pytest.ini new file mode 100644 index 00000000..e5fab62a --- /dev/null +++ b/package/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +testpaths = tests/unit +pythonpath = src diff --git a/package/src/pyaslreport/tests/test_package.py b/package/tests/unit/test_package_api.py similarity index 63% rename from package/src/pyaslreport/tests/test_package.py rename to package/tests/unit/test_package_api.py index fda43d33..b5d57fea 100644 --- a/package/src/pyaslreport/tests/test_package.py +++ b/package/tests/unit/test_package_api.py @@ -1,38 +1,50 @@ +from unittest.mock import MagicMock, patch + import pytest -from unittest.mock import patch, MagicMock -from .main import get_bids_metadata -# filepath: /home/ibrahim/MyPc/Projects/GSoC/ASL-Parameter-Generator/package/src/pyaslreport/test_main.py +from pyaslreport.main import get_bids_metadata + def test_get_bids_metadata_success(): data = {"modality": "asl", "dicom_dir": "/fake/dir"} fake_header = MagicMock() fake_sequence = MagicMock() fake_sequence.extract_bids_metadata.return_value = ("meta", "context") + with patch("pyaslreport.main.get_dicom_header", return_value=fake_header), \ patch("pyaslreport.main.get_sequence", return_value=fake_sequence): result = get_bids_metadata(data) - assert result == ("meta", "context") - fake_sequence.extract_bids_metadata.assert_called_once() + + assert result == ("meta", "context") + fake_sequence.extract_bids_metadata.assert_called_once() + def test_get_bids_metadata_no_dicom_dir(): data = {"modality": "asl"} + with pytest.raises(TypeError): get_bids_metadata(data) + def test_get_bids_metadata_no_sequence(): data = {"modality": "asl", "dicom_dir": "/fake/dir"} fake_header = MagicMock() + with patch("pyaslreport.main.get_dicom_header", return_value=fake_header), \ - patch("pyaslreport.main.get_sequence", return_value=None): + patch("pyaslreport.main.get_sequence", side_effect=ValueError("No ASL sequence class found that matches the DICOM header")): with pytest.raises(ValueError) as exc: get_bids_metadata(data) - assert "No matching sequence found" in str(exc.value) + + assert "No ASL sequence class found" in str(exc.value) + def test_get_bids_metadata_invalid_modality(): data = {"modality": None, "dicom_dir": "/fake/dir"} fake_header = MagicMock() + with patch("pyaslreport.main.get_dicom_header", return_value=fake_header), \ - patch("pyaslreport.main.get_sequence", return_value=None): - with pytest.raises(ValueError): - get_bids_metadata(data) \ No newline at end of file + patch("pyaslreport.main.get_sequence", side_effect=ValueError("Unsupported modality: None")): + with pytest.raises(ValueError) as exc: + get_bids_metadata(data) + + assert "Unsupported modality" in str(exc.value)