name: CI

on:
  push:
    branches:
      - '*'
    tags:
      - '*'
  pull_request:
    branches:
      - '*'

jobs:
  build:
    if: "!contains(github.event.head_commit.message, 'skip ci')"

    runs-on: ubuntu-latest

    strategy:
      fail-fast: false

      matrix:
        node:
          - 14.x
          - 16.x
        adapter:
          - local
          - redis
        app_manager:
          - array
          - dynamodb
          - mysql
          - postgres

        include:
          - adapter: local
            rate_limiter: local
            queue_driver: sync
          - adapter: redis
            rate_limiter: redis
            queue_driver: redis

    name: Node.js ${{ matrix.node }} (adapter:${{ matrix.adapter }} manager:${{ matrix.app_manager }} ratelimiter:${{ matrix.rate_limiter }} queue:${{ matrix.queue_driver }})

    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-node@v2.4.1
        name: Installing Node.js v${{ matrix.node }}
        with:
          node-version: ${{ matrix.node }}

      - uses: zhulik/redis-action@1.1.0
        name: Installing Redis 6.x
        with:
          redis version: 6
          number of databases: 100

      - name: Setup DynamoDB
        run: |
          java -Djava.library.path=./DynamoDBLocal_lib -jar tests/fixtures/dynamodb/DynamoDBLocal.jar --port 8000 &
          sleep 5

      - name: Setup MySQL
        uses: haltuf/mysql-action@master
        with:
          host port: 3306
          container port: 3306
          character set server: utf8mb4
          collation server: utf8mb4_unicode_ci
          mysql version: 8.0
          mysql database: main
          mysql root password: password

      - name: Setup PostgreSQL
        uses: harmon758/postgresql-action@v1
        with:
          postgresql version: 13.3
          postgresql db: main
          postgresql user: postgres
          postgresql password: password

      - name: Load SQL into databases
        run: |
          sleep 15
          mysql --host=127.0.0.1 --user=root --password=password --database=main < tests/fixtures/app_mysql.sql
          psql --host=127.0.0.1 --username=postgres main < tests/fixtures/app_postgres.sql
        env:
          PGPASSWORD: password

      - name: Installing dependencies
        run: |
          npm install

      - name: Lint & Compile
        run: |
          npm run lint
          npm run build

      - name: Running DynamoDB schema
        run: |
          node .dynamodb-schema.js
        env:
          AWS_ACCESS_KEY_ID: fake-id
          AWS_SECRET_ACCESS_KEY: fake-secret

      - name: Execute tests
        run: |
          npm run test
        env:
          TEST_ADAPTER: ${{ matrix.adapter }}
          TEST_APP_MANAGER: ${{ matrix.app_manager }}
          TEST_QUEUE_DRIVER: ${{ matrix.queue_driver }}
          TEST_RATE_LIMITER: ${{ matrix.rate_limiter }}
          AWS_ACCESS_KEY_ID: fake-id
          AWS_SECRET_ACCESS_KEY: fake-secret

      - uses: codecov/codecov-action@v2.1.0
        with:
          fail_ci_if_error: false
          token: ${{ secrets.CODECOV_TOKEN }}
