diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..d14bc54 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,55 @@ +name: Test + +on: + push: + branches: [ master ] + paths: + - '.github/workflows/test.yml' + - '**.py' + pull_request: + +jobs: + test: + name: Tests + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Spin up ChRIS + uses: FNNDSC/miniChRIS-docker@master + with: + # for testing, we need to create plugin instances, but we don't need the plugins to actually run. + services: chris + - name: Build + run: docker compose build + - name: Test + id: test + continue-on-error: true # we want to upload coverage, even on failure + run: docker compose run -T test pytest --color=yes --cov=chrisomatic --cov-report=xml + - name: Copy coverage.xml from container + run: docker cp "$(docker compose ps -a test -q | tail -n 1):/app/coverage.xml" coverage.xml + - name: Upload test coverage to Codecov + uses: codecov/codecov-action@v4 + with: + files: ./coverage.xml + flags: unittests + fail_ci_if_error: true + token: ${{ secrets.CODECOV_TOKEN }} + - name: Run example + run: | + set +e + docker compose run -T test sh -c ' + export PYTHONPATH=$PWD + /app/scripts/create_example.py | coverage run -m chrisomatic.cli - + ' + if [ "$?" = '0' ]; then + echo "::error::Expected run to fail, but it did not. + exit 1 + fi + docker compose run -T test coverage xml -o - > simulation_coverage.xml + - name: Upload simulation coverage to Codecov + uses: codecov/codecov-action@v4 + with: + files: ./simulation_coverage.xml + flags: simulation + fail_ci_if_error: true + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index 9d4f311..15408cb 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Version](https://img.shields.io/docker/v/fnndsc/chrisomatic?sort=semver)](https://hub.docker.com/r/fnndsc/chrisomatic) [![MIT License](https://img.shields.io/github/license/fnndsc/chrisomatic)](https://github.com/FNNDSC/chrisomatic/blob/master/LICENSE) [![Build](https://github.com/FNNDSC/chrisomatic/actions/workflows/build.yml/badge.svg)](https://github.com/FNNDSC/chrisomatic/actions) +[![codecov](https://codecov.io/gh/FNNDSC/chrisomatic/graph/badge.svg?token=U2UPF27JEV)](https://codecov.io/gh/FNNDSC/chrisomatic) `chrisomatic` is a tool for automatic administration of _ChRIS_ backends. It is particularly useful for the recreation of setups for testing or development, diff --git a/docker-compose.yml b/docker-compose.yml index a54bb3a..3b9fba1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,5 @@ services: - dev: + test: build: context: . dockerfile: dev.Dockerfile diff --git a/pyproject.toml b/pyproject.toml index 1aa467e..2fa9830 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,8 @@ requires-python = "== 3.12.3" chrisomatic = "chrisomatic.cli.typer:app" [tool.rye.scripts] -test = "docker compose run --rm --build dev" -simulate = "docker compose run --rm --build dev /app/scripts/simulation.sh" +test = "docker compose run --rm --build test" +simulate = "docker compose run --rm --build test /app/scripts/simulation.sh" [build-system] requires = ["hatchling"] @@ -33,6 +33,7 @@ managed = true dev-dependencies = [ "pytest>=8.3.2", "pytest-asyncio>=0.23.8", + "pytest-cov>=5.0.0", ] [tool.hatch.metadata] diff --git a/requirements-dev.lock b/requirements-dev.lock index 3403589..cd174be 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -31,6 +31,8 @@ casefy==0.1.7 # via pyserde click==8.1.7 # via typer +coverage==7.6.0 + # via pytest-cov frozenlist==1.4.1 # via aiohttp # via aiosignal @@ -64,7 +66,9 @@ pyserde==0.19.3 # via chrisomatic pytest==8.3.2 # via pytest-asyncio + # via pytest-cov pytest-asyncio==0.23.8 +pytest-cov==5.0.0 python-dateutil==2.9.0.post0 # via strictyaml rich==13.7.1 diff --git a/src/chrisomatic/__init__.py b/src/chrisomatic/__init__.py index 70cd492..b8df28b 100644 --- a/src/chrisomatic/__init__.py +++ b/src/chrisomatic/__init__.py @@ -1 +1 @@ -from __version__ import __version__ +from chrisomatic.__version__ import __version__