name: CI Tests

on: [ push, pull_request ]

jobs:
    tests:
        runs-on: ubuntu-20.04

        strategy:
            matrix:
                postgresql: [9.5, 13]
                include:
                    - postgresql: 9.5
                      postgis: 2.5
                    - postgresql: 13
                      postgis: 3

        steps:
            - uses: actions/checkout@v2
              with:
                  submodules: true
                  path: Nominatim

            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: '7.4'
                  tools: phpunit, phpcs, composer

            - name: Get Date
              id: get-date
              run: |
                  echo "::set-output name=date::$(/bin/date -u "+%Y%W")"
              shell: bash

            - uses: actions/cache@v2
              with:
                  path: |
                     country_grid.sql.gz
                  key: nominatim-country-data-${{ steps.get-date.outputs.date }}

            - uses: ./Nominatim/.github/actions/setup-postgresql
              with:
                  postgresql-version: ${{ matrix.postgresql }}
                  postgis-version: ${{ matrix.postgis }}
            - uses: ./Nominatim/.github/actions/build-nominatim

            - name: Install test prerequsites
              run: sudo apt-get install -y -qq php-codesniffer pylint python3-pytest python3-behave python3-pytest-cov php-codecoverage php-xdebug

            - name: PHP linting
              run: phpcs --report-width=120 .
              working-directory: Nominatim

            - name: Python linting
              run: pylint --extension-pkg-whitelist=osmium nominatim
              working-directory: Nominatim

            - name: PHP unit tests
              run: phpunit --coverage-clover ../../coverage-php.xml ./
              working-directory: Nominatim/test/php

            - name: Python unit tests
              run: py.test-3 --cov=nominatim --cov-report=xml test/python
              working-directory: Nominatim

            - name: BDD tests
              run: |
                  behave -DREMOVE_TEMPLATE=1 -DBUILDDIR=$GITHUB_WORKSPACE/build --format=progress3 -DPHPCOV=./cov
                  composer require phpunit/phpcov:7.0.2
                  vendor/bin/phpcov merge --clover ../../coverage-bdd.xml ./cov
              working-directory: Nominatim/test/bdd

            - name: Upload coverage to Codecov
              uses: codecov/codecov-action@v1
              with:
                files: ./Nominatim/coverage*.xml
                directory: ./
                name: codecov-umbrella
                fail_ci_if_error: true
                path_to_write_report: ./coverage/codecov_report.txt
                verbose: true

    import:
        strategy:
            matrix:
                ubuntu: [18, 20]
                include:
                    - ubuntu: 18
                      postgresql: 9.5
                      postgis: 2.5
                    - ubuntu: 20
                      postgresql: 13
                      postgis: 3

        runs-on: ubuntu-${{ matrix.ubuntu }}.04

        steps:
            - uses: actions/checkout@v2
              with:
                  submodules: true
                  path: Nominatim

            - name: Get Date
              id: get-date
              run: |
                  echo "::set-output name=date::$(/bin/date -u "+%Y%W")"
              shell: bash

            - uses: actions/cache@v2
              with:
                  path: |
                     country_grid.sql.gz
                  key: nominatim-country-data-${{ steps.get-date.outputs.date }}

            - uses: actions/cache@v2
              with:
                  path: |
                     monaco-latest.osm.pbf
                  key: nominatim-test-data-${{ steps.get-date.outputs.date }}

            - uses: actions/setup-python@v2
              with:
                python-version: 3.5
              if: matrix.ubuntu == 18

            - uses: ./Nominatim/.github/actions/setup-postgresql
              with:
                  postgresql-version: ${{ matrix.postgresql }}
                  postgis-version: ${{ matrix.postgis }}
            - uses: ./Nominatim/.github/actions/build-nominatim

            - name: Install extra dependencies for Ubuntu 18
              run: |
                sudo apt-get install libicu-dev
                pip3 install python-dotenv psycopg2==2.7.7 jinja2==2.8 psutil==5.4.2 pyicu osmium
              shell: bash
              if: matrix.ubuntu == 18

            - name: Clean installation
              run: rm -rf Nominatim build
              shell: bash

            - name: Prepare import environment
              run: |
                  if [ ! -f monaco-latest.osm.pbf ]; then
                      wget --no-verbose https://download.geofabrik.de/europe/monaco-latest.osm.pbf
                  fi
                  mkdir data-env
                  cd data-env
              shell: bash

            - name: Import
              run: nominatim import --osm-file ../monaco-latest.osm.pbf
              shell: bash
              working-directory: data-env

            - name: Import special phrases
              run: nominatim special-phrases --import-from-wiki
              working-directory: data-env

            - name: Check full import
              run: nominatim admin --check-database
              working-directory: data-env

            - name: Warm up database
              run: nominatim admin --warm
              working-directory: data-env

            - name: Run update
              run: |
                   nominatim replication --init
                   nominatim replication --once
              working-directory: data-env

            - name: Run reverse-only import
              run : nominatim import --osm-file ../monaco-latest.osm.pbf --reverse-only --no-updates
              working-directory: data-env
              env:
                  NOMINATIM_DATABASE_DSN: pgsql:dbname=reverse

            - name: Check reverse import
              run: nominatim admin --check-database
              working-directory: data-env
