Princeton-CDH/ppa-django

View on GitHub
.github/workflows/unit-tests.yml

Summary

Maintainability
Test Coverage
name: unit tests

on:
  push: # run on every push or PR to any branch
  pull_request:
  schedule: # run automatically on main branch each Tuesday at 11am
    - cron: "0 16 * * 2"

env:
  DJANGO_ENV: test

jobs:
  js-unit:
    name: javascript unit tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: package.json
      - uses: actions/cache@v4
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      - run: npm ci
      - run: npm run test:unit
      - uses: codecov/codecov-action@v4
        with:
          flags: javascript

  python-unit:
    name: Python unit tests
    runs-on: ubuntu-latest
    services:
      db:
        image: postgres:15
        env:
          POSTGRES_DB: ppa
          POSTGRES_USER: ppa
          POSTGRES_PASSWORD: ppa
        ports:
          - 5432:5432
      solr:
        image: solr:9.2
        ports:
          - 8983:8983
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      # use docker cp to copy the configset, then bash to set ownership to solr
      - name: Copy Solr configset to solr service
        run: |
          docker cp solr_conf ${{ job.services.solr.id }}:/opt/solr/server/solr/configsets/ppa
          docker exec --user root ${{ job.services.solr.id }} /bin/bash -c "chown -R solr:solr /opt/solr/server/solr/configsets/ppa"

      - name: Copy solr configsets to working solr directory
        run: "docker exec -d ${{ job.services.solr.id }} cp -r /opt/solr/server/solr/configsets /var/solr/data"

      # use python version for current build
      - name: Setup Python
        uses: actions/setup-python@v5
        # uses .python-version to determine python version

      - name: Cache pip
        uses: actions/cache@v4
        with:
          path: ~/.cache/pip
          key: pip-${{ env.PYTHON_VERSION }}-${{ hashFiles('requirements.txt') }}
          restore-keys: |
            pip-${{ env.PYTHON_VERSION }}-${{ hashFiles('requirements.txt') }}
            pip-${{ env.PYTHON_VERSION }}
            pip-

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install -r dev-requirements.txt

      - name: Setup local_settings.py
        run: python -c "import uuid; print('SECRET_KEY = \'%s\'' % uuid.uuid4())" >> ppa/settings/local_settings.py

      - name: Run pytest
        run: pytest --cov=./ --cov-report=xml

      - name: Upload test coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          flags: python

      # Set the color of the slack message used in the next step based on the
      # status of the build: "warning" for failure and "good" for success
      - name: Set Slack message color based on build status
        if: ${{ always() }}
        env:
          JOB_STATUS: ${{ job.status }}
        run: echo "SLACK_COLOR=$(if [ "$JOB_STATUS" == "success" ]; then echo "good"; elif [ "$JOB_STATUS" == "failure" ]; then echo "danger"; else echo "warning"; fi)" >> $GITHUB_ENV

      # Send a message to slack to report the build status. The webhook is stored
      # at the organization level and available to all repositories. Only run on
      # scheduled builds & pushes, since PRs automatically report to Slack.
      - name: Report status to Slack
        uses: rtCamp/action-slack-notify@master
        if: ${{ always() && (github.event_name == 'schedule' || github.event_name == 'push') }}
        continue-on-error: true
        env:
          SLACK_COLOR: ${{ env.SLACK_COLOR }}
          SLACK_WEBHOOK: ${{ secrets.ACTIONS_SLACK_WEBHOOK }}
          SLACK_TITLE: "Run #${{ github.run_number }} for workflow `${{ github.workflow }}`: ${{ job.status }}"
          SLACK_MESSAGE: "Run <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|#${{ github.run_number }}> on <https://github.com/${{ github.repository }}/|${{ github.repository }}@${{ github.ref }}>"
          SLACK_FOOTER: "<https://github.com/${{ github.repository }}/commit/${{ github.sha }}|View commit>"
          MSG_MINIMAL: true # use compact slack message format