Skip to content

Tests

Tests #7000

Workflow file for this run

name: Tests
on:
pull_request:
types: [opened, reopened, labeled, synchronize]
paths:
- src/**
- tests/**
- docker-compose*.yml
- noxfile.py
- poetry.lock
- pyproject.toml
- .github/workflows/tests.yml
- .github/workflows/constraints.txt
- trunk.yaml
- .limesurvey-docker-tags.json
push:
branches:
- 'main'
- 'trunk-merge/**'
paths:
- src/**
- tests/**
- docker-compose*.yml
- noxfile.py
- poetry.lock
- pyproject.toml
- .github/workflows/tests.yml
- .github/workflows/constraints.txt
- trunk.yaml
- .limesurvey-docker-tags.json
schedule:
- cron: "44 */3 * * *"
workflow_dispatch:
inputs:
update_coverage:
description: "Update coverage"
required: true
default: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
env:
FORCE_COLOR: "1"
jobs:
tests:
name: "${{ matrix.session }} ${{ matrix.python-version }} / ${{ matrix.os }}"
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental || false }}
env:
COVERAGE_FILE: ".coverage.unit"
NOXSESSION: "${{ matrix.session }}"
NOXFORCEPYTHON: "${{ matrix.python-version }}"
strategy:
fail-fast: false
matrix:
python-version:
- "3.8"
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "pypy3.9"
- "pypy3.10"
os: ["ubuntu-latest"]
session: ["tests"]
include:
- python-version: "3.12"
os: "ubuntu-latest"
session: "xdoctest"
- python-version: "3.13"
os: "ubuntu-latest"
session: "tests"
experimental: true
- python-version: "3.13"
os: "ubuntu-latest"
session: "tests"
experimental: true
nightly: true
# - python-version: "3.14"
# os: "ubuntu-latest"
# session: "tests"
# experimental: true
# nightly: true
- python-version: "3.12"
os: "windows-latest"
session: "tests"
- python-version: "3.12"
os: "macos-latest"
session: "tests"
steps:
- name: Check out the repository
uses: actions/[email protected]
with:
fetch-tags: true
- name: Setup Python ${{ matrix.python-version }}
if: "${{ !matrix.nightly }}"
uses: actions/[email protected]
with:
python-version: ${{ matrix.python-version }}
architecture: x64
allow-prereleases: true
cache: pip
cache-dependency-path: |
poetry.lock
.github/workflows/constraints.txt
- name: Setup Python ${{ matrix.python-version }} (nightly)
if: "${{ matrix.nightly }}"
uses: deadsnakes/[email protected]
with:
python-version: "${{ matrix.python-version }}-dev"
- name: Install tools
uses: ./.github/actions/install-tools
- name: Run Nox
id: nox
run: |
nox
- name: Upload coverage data
if: always() && matrix.session == 'tests'
uses: actions/[email protected]
with:
name: coverage-unit
path: ".coverage.*"
docker_tags:
name: Get Docker tags
runs-on: ubuntu-latest
outputs:
tags: ${{ steps.tags.outputs.tags }}
steps:
- name: Check out the repository
uses: actions/[email protected]
- name: Setup Python
uses: actions/[email protected]
with:
python-version: 3.12
architecture: x64
allow-prereleases: true
cache: pip
cache-dependency-path: |
poetry.lock
.github/workflows/constraints.txt
- name: Install tools
uses: ./.github/actions/install-tools
- name: Test against required tags
if: ${{ contains(github.event.pull_request.labels.*.name, 'Release') || inputs.update_coverage }}
run: |
nox -s generate-tags > limesurvey-docker-tags.json
- name: Test against latest tags
if: ${{ !contains(github.event.pull_request.labels.*.name, 'Release') && !inputs.update_coverage }}
run: |
echo '["6-apache", "5-apache"]' > limesurvey-docker-tags.json
- name: Output tags
id: tags
run: |
echo "tags=$(cat limesurvey-docker-tags.json)" >> $GITHUB_OUTPUT
python_versions:
name: Get Python versions
runs-on: ubuntu-latest
outputs:
versions: ${{ steps.versions.outputs.versions }}
steps:
- name: Check out the repository
uses: actions/[email protected]
- name: Test against all versions
if: ${{ contains(github.event.pull_request.labels.*.name, 'Release') || inputs.update_coverage }}
run: |
echo '["3.8", "3.9", "3.10", "3.11", "3.12"]' > python-versions.json
- name: Test against latest version
if: ${{ !contains(github.event.pull_request.labels.*.name, 'Release') && !inputs.update_coverage }}
run: |
echo '["3.12"]' > python-versions.json
- name: Output versions
id: versions
run: |
echo "versions=$(cat python-versions.json)" >> $GITHUB_OUTPUT
databases:
name: Get database engines
runs-on: ubuntu-latest
outputs:
engines: ${{ steps.engines.outputs.engines }}
steps:
- name: Check out the repository
uses: actions/[email protected]
- name: Test against all engines
if: ${{ contains(github.event.pull_request.labels.*.name, 'Release') || inputs.update_coverage }}
run: |
echo '["postgres", "mysql"]' > database-engines.json
- name: Test against PostgreSQL
if: ${{ !contains(github.event.pull_request.labels.*.name, 'Release') && !inputs.update_coverage }}
run: |
echo '["postgres"]' > database-engines.json
- name: Output engines
id: engines
run: |
echo "engines=$(cat database-engines.json)" >> $GITHUB_OUTPUT
integration:
name: "integration ${{ matrix.python-version }} / ${{ matrix.image_tag || matrix.ref }} / ${{ matrix.database }}"
runs-on: ubuntu-latest
continue-on-error: true
needs: [docker_tags, databases]
env:
COVERAGE_FILE: ".coverage.integration"
LS_USER: citric_ci
LS_PASSWORD: notverysecret
LS_PORT: "8080"
NOXSESSION: integration
NOXFORCEPYTHON: "${{ matrix.python-version }}"
strategy:
fail-fast: false
matrix:
python-version: ["3.12"]
database: ${{ fromJson(needs.databases.outputs.engines) }}
ref: [""]
context: [""]
image_tag: ${{ fromJson(needs.docker_tags.outputs.tags) }}
include:
# Test on other Python versions
- python-version: "3.8"
image_tag: "6-apache"
database: postgres
- python-version: "3.9"
image_tag: "6-apache"
database: postgres
- python-version: "3.10"
image_tag: "6-apache"
database: postgres
- python-version: "3.11"
image_tag: "6-apache"
database: postgres
- python-version: "3.13"
image_tag: "6-apache"
database: postgres
- python-version: "pypy3.9"
image_tag: "6-apache"
database: postgres
- python-version: "pypy3.10"
image_tag: "6-apache"
database: postgres
# Test Limesurvey/LimeSurvey branches
- python-version: "3.12"
ref: refs/heads/5.x
context: https://github.com/martialblog/docker-limesurvey.git#master:5.0/apache
database: postgres
- python-version: "3.12"
ref: refs/heads/develop
context: https://github.com/martialblog/docker-limesurvey.git#master:6.0/apache
database: postgres
- python-version: "3.12"
ref: refs/heads/master
context: https://github.com/martialblog/docker-limesurvey.git#master:6.0/apache
database: postgres
steps:
- name: Check out the repository
uses: actions/[email protected]
with:
fetch-tags: true
- name: Setup Python ${{ matrix.python-version }}
uses: actions/[email protected]
with:
python-version: ${{ matrix.python-version }}
architecture: x64
cache: pip
allow-prereleases: true
cache-dependency-path: |
poetry.lock
.github/workflows/constraints.txt
- name: Install tools
uses: ./.github/actions/install-tools
- name: Download LimeSurvey archive
if: ${{ matrix.ref }}
run: |
wget https://github.com/LimeSurvey/LimeSurvey/archive/${{ matrix.ref }}.tar.gz -O ls.tar.gz -nv
echo "LS_CHECKSUM=$(shasum -a 256 ls.tar.gz | cut -d' ' -f1)" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/[email protected]
- name: Get Docker
uses: actions-hub/docker/[email protected]
env:
SKIP_LOGIN: true
- name: Start services
env:
LS_IMAGE_TAG: ${{ matrix.image_tag }}
LS_DOCKERFILE_CONTEXT: ${{ matrix.context }}
LS_DOCKERFILE: Dockerfile
LS_ARCHIVE_URL: "https://github.com/LimeSurvey/LimeSurvey/archive/${{ matrix.ref }}.tar.gz"
COMPOSE_FILE: "\
docker-compose.yml\
${{ matrix.ref && ':docker-compose.ref.yml' }}\
${{ matrix.database == 'mysql' && ':docker-compose.mysql.yml' || '' }}"
run: |
docker compose up -d --wait --quiet-pull
docker compose ps -a
docker compose config
- name: Run Nox
id: nox-integration
env:
BACKEND: ${{ matrix.database }}
LS_URL: http://localhost:${{ env.LS_PORT }}/index.php/admin/remotecontrol
run: |
nox
- name: Upload coverage data
if: always()
uses: actions/[email protected]
with:
name: coverage-integration
path: ".coverage.*"
types:
name: Type checking
runs-on: ubuntu-latest
needs: python_versions
env:
NOXSESSION: mypy
NOXFORCEPYTHON: ${{ matrix.python-version }}
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.python_versions.outputs.versions) }}
steps:
- name: Check out the repository
uses: actions/[email protected]
with:
fetch-tags: true
- name: Setup Python ${{ matrix.python-version }}
uses: actions/[email protected]
with:
python-version: ${{ matrix.python-version }}
architecture: x64
- name: Install tools
env:
PIP_CONSTRAINT: .github/workflows/constraints.txt
run: |
pip install pip
pipx install poetry
pipx inject poetry poetry-dynamic-versioning[plugin]
pipx install nox
pipx inject nox nox-poetry
pipx list
- name: Run Nox
run: |
nox
coverage:
name: Coverage
runs-on: ubuntu-latest
needs: [tests, integration]
env:
NOXSESSION: coverage
strategy:
matrix:
flag: ["unit", "integration"]
fail-fast: false
steps:
- name: Check out the repository
uses: actions/[email protected]
- name: Set up Python
uses: actions/[email protected]
with:
python-version: "3.12"
- name: Install tools
uses: ./.github/actions/install-tools
- name: Download coverage data
uses: actions/[email protected]
with:
name: coverage-${{ matrix.flag }}
- name: Combine coverage data and display human readable report
continue-on-error: true
run: |
nox
- name: Create coverage report
run: |
nox -- xml
- name: Upload coverage report
uses: codecov/[email protected]
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage.xml
fail_ci_if_error: true
flags: ${{ matrix.flag }}