name: Build

on:
  push:
    paths-ignore:
      - '**.md'
      - 'docs/**'
  pull_request:
    branches:
      - master
    paths-ignore:
      - '!**.md'
      - 'docs/**'
  release:
    types:
      - released

jobs:
  main:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        include:
          - python-version: '3.10'
    env:
      PYGEOAPI_CONFIG: "$(pwd)/pygeoapi-config.yml"
    
    steps:
    - name: Clear up GitHub runner diskspace
      run: |
        echo "Space before"
        df -h /
        sudo rm -rf /usr/local/lib/android
        sudo rm -rf /usr/share/dotnet
        echo "Space after"
        df -h /
    - name: Chown user
      run: |
        sudo chown -R $USER:$USER $GITHUB_WORKSPACE
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
      name: Setup Python ${{ matrix.python-version }}
      with:
        python-version: ${{ matrix.python-version }}
    - name: Configure sysctl limits
      run: |
        sudo swapoff -a
        sudo sysctl -w vm.swappiness=1
        sudo sysctl -w fs.file-max=262144
        sudo sysctl -w vm.max_map_count=262144
    - name: Install and run PostgreSQL/PostGIS 📦
      uses: huaxk/postgis-action@v1
      with:
        postgresql password: ${{ secrets.DatabasePassword || 'postgres' }}
        postgresql db: 'test'
    - name: Install and run Elasticsearch 📦
      uses: getong/elasticsearch-action@v1.2
      with:
        elasticsearch version: '8.3.1'
        host port: 9200
        container port: 9200
        host node port: 9300
        node port: 9300
        discovery type: 'single-node'
    - name: Install and run MongoDB
      uses: supercharge/mongodb-github-action@1.5.0
      with:
        mongodb-version: 4.4
    - name: Install and run SensorThingsAPI
      uses: cgs-earth/sensorthings-action@v0.1.0
    - name: Install sqlite and gpkg dependencies
      uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: libsqlite3-mod-spatialite
        version: 4.3.0a-6build1
    - name: Use ubuntuGIS unstable ppa
      run: sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable && sudo apt update
      shell: bash
    - name: Install GDAL with Python bindings
      uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: gdal-bin libgdal-dev
        version: 3.8.4
    - name: Install and run Oracle
      run: |
        docker run -d --name oracledb -e ORACLE_PWD=oracle -v ${{ github.workspace }}/tests/data/oracle/init-db:/opt/oracle/scripts/startup -p 1521:1521 container-registry.oracle.com/database/express:21.3.0-xe
    - name: Install requirements 📦
      run: |
        pip3 install -r requirements.txt
        pip3 install -r requirements-admin.txt
        pip3 install -r requirements-starlette.txt
        pip3 install -r requirements-dev.txt
        pip3 install -r requirements-provider.txt
        pip3 install -r requirements-manager.txt
        pip3 install -r requirements-django.txt
        python3 setup.py install
        pip3 install --upgrade numpy elasticsearch
        pip3 install --upgrade numpy "sqlalchemy<2"
        pip3 install --global-option=build_ext --global-option="-I/usr/include/gdal" GDAL==`gdal-config --version`
        #pip3 install --upgrade rasterio==1.1.8
    - name: setup test data ⚙️
      run: |
        python3 tests/load_es_data.py tests/data/ne_110m_populated_places_simple.geojson geonameid
        python3 tests/load_mongo_data.py tests/data/ne_110m_populated_places_simple.geojson
        gunzip < tests/data/hotosm_bdi_waterways.sql.gz | psql postgresql://postgres:${{ secrets.DatabasePassword || 'postgres' }}@localhost:5432/test
        psql postgresql://postgres:${{ secrets.DatabasePassword || 'postgres' }}@localhost:5432/test -f tests/data/dummy_data.sql
        psql postgresql://postgres:${{ secrets.DatabasePassword || 'postgres' }}@localhost:5432/test -f tests/data/dummy_types_data.sql
        psql postgresql://postgres:${{ secrets.DatabasePassword || 'postgres' }}@localhost:5432/test -f tests/data/postgres_manager_full_structure.backup.sql
        docker ps
        python3 tests/load_oracle_data.py
    - name: run unit tests ⚙️
      env:
        POSTGRESQL_PASSWORD: ${{ secrets.DatabasePassword || 'postgres' }}
      run: |
        pytest tests/api
        pytest tests/test_api_ogr_provider.py
        pytest tests/test_config.py
        pytest tests/test_csv__formatter.py
        pytest tests/test_csv__provider.py
        pytest tests/test_django.py
        pytest tests/test_elasticsearch__provider.py
        pytest tests/test_esri_provider.py
        pytest tests/test_filesystem_provider.py
        pytest tests/test_geojson_provider.py
        pytest tests/test_mongo_provider.py
        pytest tests/test_ogr_csv_provider.py
        pytest tests/test_ogr_esrijson_provider.py
        pytest tests/test_ogr_gpkg_provider.py
        pytest tests/test_ogr_shapefile_provider.py
        pytest tests/test_ogr_sqlite_provider.py
        pytest tests/test_ogr_wfs_provider.py
        pytest tests/test_postgresql_manager.py
        # pytest tests/test_ogr_wfs_provider_live.py  # NOTE: these are skipped in the file but listed here for completeness
        pytest tests/test_openapi.py
        pytest tests/test_oracle_provider.py
        pytest tests/test_postgresql_provider.py
        pytest tests/test_rasterio_provider.py
        pytest tests/test_sensorthings_provider.py
        pytest tests/test_socrata_provider.py
        pytest tests/test_sqlite_geopackage_provider.py
        pytest tests/test_tinydb_catalogue_provider.py
        pytest tests/test_tinydb_manager_for_parallel_requests.py
        pytest tests/test_util.py
        pytest tests/test_xarray_netcdf_provider.py
        pytest tests/test_xarray_zarr_provider.py
    - name: failed tests 🚩
      if: ${{ failure() }}
      run: |
        pip3 list -v

  admin:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        include:
          - python-version: '3.10'
    env:
      PYGEOAPI_CONFIG: "tests/pygeoapi-test-config-admin.yml"
      PYGEOAPI_OPENAPI: "tests/pygeoapi-test-openapi-admin.yml"
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
      name: Setup Python ${{ matrix.python-version }}
      with:
        python-version: ${{ matrix.python-version }}
    - uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: gunicorn python3-gevent
        version: 1.0
    - name: Install requirements 📦
      run: |
        pip3 install -r requirements.txt
        pip3 install -r requirements-dev.txt
        pip3 install -r requirements-admin.txt
        python3 setup.py install
    - name: Run pygeoapi with admin API ⚙️
      run: |
        pygeoapi openapi generate ${PYGEOAPI_CONFIG} --output-file ${PYGEOAPI_OPENAPI}
        gunicorn --bind 0.0.0.0:5000 \
                 --reload \
                 --reload-extra-file ${PYGEOAPI_CONFIG} \
                 pygeoapi.flask_app:APP &
    - name: run integration tests ⚙️
      run: |
        pytest tests/test_admin_api.py
    - name: failed tests 🚩
      if: ${{ failure() }}
      run: |
        pip3 list -v
