name: Examples

on:
  pull_request:
  push:
    branches:
      - main
      - '*-dev'

jobs:
  sqlx-cli:
    name: Build SQLx CLI
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - uses: Swatinem/rust-cache@v1
        with:
          key: sqlx-cli

      - uses: actions-rs/cargo@v1
        with:
          command: build
          args: >
            -p sqlx-cli
            --bin sqlx
            --release
            --no-default-features
            --features mysql,postgres,sqlite
        env:
          RUSTFLAGS: -D warnings

      - uses: actions/upload-artifact@v3
        with:
          name: sqlx-cli
          path: target/release/sqlx

  mysql:
    name: MySQL Examples
    runs-on: ubuntu-latest
    needs: sqlx-cli

    services:
      mysql:
        image: mysql:latest
        env:
          MYSQL_ROOT_PASSWORD: password
        ports:
          - 3306:3306

    steps:
      - name: Get SQLx-CLI
        uses: actions/download-artifact@v3
        with:
          name: sqlx-cli
          # $HOME is interpreted differently by the shell
          path: /home/runner/.local/bin

      - run: |
          ls -R /home/runner/.local/bin
          chmod +x /home/runner/.local/bin/sqlx
          echo /home/runner/.local/bin >> $GITHUB_PATH
          sleep 10

      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - uses: Swatinem/rust-cache@v1
        with:
          key: mysql-examples

      - name: Todos (Setup)
        working-directory: examples/mysql/todos
        env:
          DATABASE_URL: mysql://root:password@localhost:3306/todos?ssl-mode=disabled
        run: sqlx db setup

      - name: Todos (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: mysql://root:password@localhost:3306/todos?ssl-mode=disabled
        with:
          # TODO: test full CLI
          command: run
          args: -p sqlx-example-mysql-todos

  postgres:
    name: PostgreSQL Examples
    runs-on: ubuntu-latest
    needs: sqlx-cli

    services:
      postgres:
        image: postgres:latest
        env:
          POSTGRES_PASSWORD: password
        ports:
          - 5432:5432

    steps:
      - name: Get SQLx-CLI
        uses: actions/download-artifact@v3
        with:
          name: sqlx-cli
          path: /home/runner/.local/bin

      - run:  |
          ls -R /home/runner/.local/bin
          chmod +x $HOME/.local/bin/sqlx
          echo $HOME/.local/bin >> $GITHUB_PATH
          sleep 10

      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - uses: Swatinem/rust-cache@v1
        with:
          key: pg-examples

      - name: Axum Social with Tests (Setup)
        working-directory: examples/postgres/axum-social-with-tests
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/axum-social
        run: sqlx db setup

      - name: Axum Social with Tests (Check)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/axum-social
        with:
          command: check
          args: -p sqlx-example-postgres-axum-social

      - name: Axum Social with Tests (Test)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/axum-social
        with:
          command: test
          args: -p sqlx-example-postgres-axum-social

      # The Chat example has an interactive TUI which is not trivial to test automatically,
      # so we only check that it compiles.
      - name: Chat (Check)
        uses: actions-rs/cargo@v1
        with:
          command: check
          args: -p sqlx-example-postgres-chat

      - name: Files (Setup)
        working-directory: examples/postgres/files
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/files
        run: sqlx db setup

      - name: Files (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/files
        with:
          command: run
          args: -p sqlx-example-postgres-files

      - name: JSON (Setup)
        working-directory: examples/postgres/json
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/json
        run: sqlx db setup

      - name: JSON (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/json
        with:
          command: run
          args: -p sqlx-example-postgres-json

      - name: Listen (Setup)
        working-directory: examples/postgres/listen
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/listen
        run: sqlx db create

      - name: Listen (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/listen
        with:
          command: run
          args: -p sqlx-example-postgres-listen

      - name: Mockable TODOs (Setup)
        working-directory: examples/postgres/mockable-todos
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/mockable-todos
        run: sqlx db setup

      - name: Mockable TODOs (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/mockable-todos
        with:
          # TODO: test full CLI
          command: run
          args: -p sqlx-example-postgres-mockable-todos

      - name: TODOs (Setup)
        working-directory: examples/postgres/todos
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/todos
        run: sqlx db setup

      - name: TODOs (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/todos
        with:
          # TODO: test full CLI
          command: run
          args: -p sqlx-example-postgres-todos

      - name: Transaction (Setup)
        working-directory: examples/postgres/transaction
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/txn
        run: sqlx db setup

      - name: Transaction (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: postgres://postgres:password@localhost:5432/txn
        with:
          command: run
          args: -p sqlx-example-postgres-transaction

  sqlite:
    name: SQLite Examples
    runs-on: ubuntu-latest
    needs: sqlx-cli

    steps:
      - name: Get SQLx-CLI
        uses: actions/download-artifact@v3
        with:
          name: sqlx-cli
          path: /home/runner/.local/bin

      - run: |
          ls -R /home/runner/.local/bin
          chmod +x /home/runner/.local/bin/sqlx
          echo /home/runner/.local/bin >> $GITHUB_PATH

      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - uses: Swatinem/rust-cache@v1
        with:
          key: sqlite-examples

      - name: TODOs (Setup)
        env:
          DATABASE_URL: sqlite://todos.sqlite
        run: sqlx db setup --source=examples/sqlite/todos/migrations

      - name: TODOs (Run)
        uses: actions-rs/cargo@v1
        env:
          DATABASE_URL: sqlite://todos.sqlite
        with:
          command: run
          args: -p sqlx-example-sqlite-todos
