From 8c3da4c5aa50582f1ea11cfd7636c53e7825503e Mon Sep 17 00:00:00 2001 From: Jan Range Date: Thu, 28 Dec 2023 21:54:53 +0100 Subject: [PATCH] add local testing and instructions - Spins up a Dataverse installation similar to the test action - Allows to specify the version of Python to test against --- README.md | 14 ++++ docker-compose-test.yml | 157 ++++++++++++++++++++++++++++++++++++++++ local-test.env | 9 +++ run-tests.sh | 66 +++++++++++++++++ 4 files changed, 246 insertions(+) create mode 100644 docker-compose-test.yml create mode 100644 local-test.env create mode 100644 run-tests.sh diff --git a/README.md b/README.md index fe8fbb0..0ed53cc 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,20 @@ It helps to access the Dataverse [API's](http://guides.dataverse.org/en/latest/a **Find out more: [Read the Docs](https://pydataverse.readthedocs.io/en/latest/)** +## Running the tests + +To run pyDataverse's tests locally, you need to install docker and docker-compose. This will spin up a local Dataverse instance and run the tests against it. You can run the tests with: + +```bash +sh run_tests.sh +``` + +By default local tests are using the python `3.11` slim image. However, you can change the python version by providing a valid version via the `-p` keyword argument. For example, to run the tests with python `3.9`: + +```bash +sh run_tests.sh -p 3.9 +``` + ## Chat with us! If you are interested in the development of pyDataverse, we invite you to join us for a chat on our [Zulip Channel](https://dataverse.zulipchat.com/#narrow/stream/377090-python). This is the perfect place to discuss and exchange ideas about the development of pyDataverse. Whether you need help or have ideas to share, feel free to join us! diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 0000000..e9cdf77 --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,157 @@ +version: '2.4' +name: pydataverse +services: + unit-tests: + container_name: unit-tests + image: python:${PYTHON_VERSION}-slim + environment: + BASE_URL: http://dataverse:8080 + DV_VERSION: 6.1 + networks: + - dataverse + volumes: + - ${PWD}:/pydataverse + - ./dv:/dv + command: + - sh + - -c + - | + export $(grep "API_TOKEN" "dv/bootstrap.exposed.env") + export API_TOKEN_SUPERUSER=$$API_TOKEN + cd /pydataverse + python3 -m pip install --upgrade pip + python3 -m pip install -r ./requirements/tests.txt + python3 -m pip install -e . + python3 -m pytest + depends_on: + bootstrap: + condition: service_completed_successfully + + dataverse: + container_name: 'dataverse' + hostname: dataverse + image: ${DATAVERSE_IMAGE} + restart: on-failure + user: payara + environment: + - DATAVERSE_DB_HOST=postgres + - DATAVERSE_DB_USER=${DATAVERSE_DB_USER} + - DATAVERSE_DB_PASSWORD=${DATAVERSE_DB_PASSWORD} + ports: + - '8080:8080' + networks: + - dataverse + depends_on: + postgres: + condition: service_started + solr: + condition: service_started + dv_initializer: + condition: service_completed_successfully + volumes: + - ${PWD}/dv/data:/dv + - ${PWD}:/secrets + tmpfs: + - /dumps:mode=770,size=2052M,uid=1000,gid=1000 + - /tmp:mode=770,size=2052M,uid=1000,gid=1000 + mem_limit: 2147483648 # 2 GiB + mem_reservation: 1024m + privileged: false + healthcheck: + test: curl --fail http://dataverse:8080/api/info/version || exit 1 + interval: 10s + retries: 20 + start_period: 20s + timeout: 240s + + dv_initializer: + container_name: 'dv_initializer' + image: ${CONFIGBAKER_IMAGE} + restart: 'no' + command: + - sh + - -c + - 'fix-fs-perms.sh dv' + volumes: + - ${PWD}/dv/data:/dv + + postgres: + container_name: 'postgres' + hostname: postgres + image: postgres:${POSTGRES_VERSION} + restart: on-failure + environment: + - POSTGRES_USER=${DATAVERSE_DB_USER} + - POSTGRES_PASSWORD=${DATAVERSE_DB_PASSWORD} + ports: + - '5432:5432' + networks: + - dataverse + + solr_initializer: + container_name: 'solr_initializer' + image: ${CONFIGBAKER_IMAGE} + restart: 'no' + command: + - sh + - -c + - 'fix-fs-perms.sh solr && cp -a /template/* /solr-template' + volumes: + - ${PWD}/solr/data:/var/solr + - ${PWD}/solr/conf:/solr-template + + solr: + container_name: 'solr' + hostname: 'solr' + image: solr:${SOLR_VERSION} + depends_on: + solr_initializer: + condition: service_completed_successfully + restart: on-failure + ports: + - '8983:8983' + networks: + - dataverse + command: + - 'solr-precreate' + - 'collection1' + - '/template' + volumes: + - ${PWD}/solr/data:/var/solr + - ${PWD}/solr/conf:/template + + smtp: + container_name: 'smtp' + hostname: 'smtp' + image: maildev/maildev:2.0.5 + restart: on-failure + expose: + - '25' # smtp server + environment: + - MAILDEV_SMTP_PORT=25 + - MAILDEV_MAIL_DIRECTORY=/mail + networks: + - dataverse + tmpfs: + - /mail:mode=770,size=128M,uid=1000,gid=1000 + + bootstrap: + container_name: 'bootstrap' + hostname: 'bootstrap' + image: ${CONFIGBAKER_IMAGE} + restart: 'no' + networks: + - dataverse + volumes: + - ./dv/bootstrap.exposed.env:/.env + command: + - sh + - -c + - 'bootstrap.sh -e /.env dev' + depends_on: + dataverse: + condition: service_healthy + +networks: + dataverse: + driver: bridge diff --git a/local-test.env b/local-test.env new file mode 100644 index 0000000..7400574 --- /dev/null +++ b/local-test.env @@ -0,0 +1,9 @@ +# Dataverse +DATAVERSE_IMAGE=docker.io/gdcc/dataverse:unstable +DATAVERSE_DB_USER=dataverse +DATAVERSE_DB_PASSWORD=secret +CONFIGBAKER_IMAGE=docker.io/gdcc/configbaker:unstable + +# Services +POSTGRES_VERSION=15 +SOLR_VERSION=9.3.0 \ No newline at end of file diff --git a/run-tests.sh b/run-tests.sh new file mode 100644 index 0000000..57697f7 --- /dev/null +++ b/run-tests.sh @@ -0,0 +1,66 @@ +#!bin/bash + +# Parse arguments +usage() { + echo "Usage: $0 [-p Python version (e.g. 3.10, 3.11, ...)]" 1>&2 + exit 1 +} + +while getopts ":p:d:" o; do + case "${o}" in + p) + p=${OPTARG} + ;; + *) ;; + esac +done +shift $((OPTIND - 1)) + +# Fall back to Python 3.11 if no Python version is specified +if [ -z "${p}" ]; then + printf "\nāš ļø No Python version specified falling back to '3.11'\n" + p=3.11 +fi + +# Validate Python version +if [[ ! "${p}" =~ ^3\.[0-9]+$ ]]; then + echo "\nāŒ Invalid Python version. Please specify a valid Python version (e.g. 3.10, 3.11, ...)\n" + exit 1 +fi + +# Check if Docker is installed +if ! command -v docker &>/dev/null; then + echo "āœ‹ Docker is not installed. Please install Docker before running this script." + exit 1 +fi + +# Prepare the environment for the test +mkdir dv >>/dev/null 2>&1 +touch dv/bootstrap.exposed.env >>/dev/null 2>&1 + +# Add python version to the environment +export PYTHON_VERSION=${p} + +printf "\nšŸš€ Preparing containers\n" +printf " Using PYTHON_VERSION=${p}\n\n" + +# Run all containers +docker compose -f ./docker-compose-test.yml \ + --env-file local-test.env \ + up -d + +printf "\nšŸ”Ž Running pyDataverse tests\n" +printf " Logs will be printed once finished...\n\n" + +# Check if "unit-test" container has finished +while [ -n "$(docker ps -f "name=unit-tests" -f "status=running" -q)" ]; do + printf " Waiting for unit-tests container to finish...\n" + sleep 5 +done + +# Print logs of "unit-tests" container +docker logs unit-tests + +# Stop all containers +docker compose -f ./docker-compose-test.yml --env-file local-test.env down +printf "\nāœ… Done\n\n"