Skip to content

Commit

Permalink
add local testing and instructions
Browse files Browse the repository at this point in the history
- Spins up a Dataverse installation similar to the test action
- Allows to specify the version of Python to test against
  • Loading branch information
JR-1991 committed Dec 28, 2023
1 parent 7eb409a commit 8c3da4c
Show file tree
Hide file tree
Showing 4 changed files with 246 additions and 0 deletions.
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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!
Expand Down
157 changes: 157 additions & 0 deletions docker-compose-test.yml
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions local-test.env
Original file line number Diff line number Diff line change
@@ -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
66 changes: 66 additions & 0 deletions run-tests.sh
Original file line number Diff line number Diff line change
@@ -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"

0 comments on commit 8c3da4c

Please sign in to comment.