name: scribe CI

on:
  push:
    branches: "*"
  pull_request:
    branches: "*"

jobs:
  check-format:
    runs-on: ubuntu-latest
    container:
      image: crystallang/crystal:1.0.0
    steps:
      - uses: actions/checkout@v2
      - name: Format
        run: crystal tool format --check

  specs:
    runs-on: ubuntu-latest
    container:
      image: crystallang/crystal:1.0.0
    env:
      LUCKY_ENV: test
      DB_HOST: postgres

    services:
      postgres:
        image: postgres:12-alpine
        env:
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432:5432
       # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
    - uses: actions/checkout@v2

    - name: Install PostgreSQL client
      run: |
        apt-get update
        apt-get -yqq install libpq-dev postgresql-client
    - name: Install browser
      run: apt-get -yqq install chromium-browser

    - uses: actions/setup-node@v1
      with:
        node-version: '12.x'
    - name: "Install yarn"
      run: npm install -g yarn

    - name: Get yarn cache directory path
      id: yarn-cache-dir-path
      run: echo "::set-output name=dir::$(yarn cache dir)"

    - name: Set up Yarn cache
      uses: actions/cache@v2
      with:
        path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
        restore-keys: |
          ${{ runner.os }}-yarn-

    - name: Set up Node cache
      uses: actions/cache@v2
      id: node-cache # use this to check for `cache-hit` (`steps.node-cache.outputs.cache-hit != 'true'`)
      with:
        path: '**/node_modules'
        key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }}
        restore-keys: |
          ${{ runner.os }}-node-
    - name: Set up Crystal cache
      uses: actions/cache@v2
      id: crystal-cache
      with:
        path: |
          ~/.cache/crystal
          lib
          lucky_tasks
        key: ${{ runner.os }}-crystal-${{ hashFiles('**/shard.lock') }}
        restore-keys: |
          ${{ runner.os }}-crystal-

    - name: Install shards
      if: steps.crystal-cache.outputs.cache-hit != 'true'
      run: shards check || shards install

    - name: Install yarn packages
      if: steps.node-cache.outputs.cache-hit != 'true'
      run: yarn install --frozen-lockfile --no-progress
    - name: Compiling assets
      run: yarn prod

    - name: Build lucky_tasks
      if: steps.crystal-cache.outputs.cache-hit != 'true'
      run: crystal build tasks.cr -o ./lucky_tasks

    - name: Prepare database
      run: |
        ./lucky_tasks db.create
        ./lucky_tasks db.migrate
        ./lucky_tasks db.seed.required_data

    - name: Run tests
      run: crystal spec