version: 2

aliases:
- &restore-cache
  restore_cache:
    name: Restore Yarn Package Cache
    keys:
    - yarn-packages-{{ checksum "yarn.lock" }}
- &save-cache
  save_cache:
    name: Save Yarn Package Cache
    key: yarn-packages-{{ checksum "yarn.lock" }}
    paths:
    - ~/.cache/yarn
- &install-deps
  run:
    name: Install dependencies
    command: yarn install --frozen-lockfile
- &build
  run:
    name: Build package
    command: NODE_ENV=production yarn build
- &run-unit-tests
  run:
    name: Test
    command: yarn test:unit
- &run-e2e-tests
  run:
    name: Test
    command: yarn test:e2e

run-template: &run-template
  working_directory: ~/oauth2-server
  docker:
  - image: circleci/node:12

jobs:
  build:
    <<: *run-template
    steps:
    - checkout
    - *restore-cache
    - *install-deps
    - *save-cache
    - *build

  unit_tests:
    <<: *run-template
    steps:
    - checkout
    - *restore-cache
    - *install-deps
    - *save-cache
    - *run-unit-tests

  integration_tests:
    working_directory: ~/oauth2-server
    docker:
    - image: circleci/node:12
    - image: circleci/postgres:9.6.2-alpine
      environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
        POSTGRES_DB: oauth2-server
    steps:
    - checkout
    - *restore-cache
    - *install-deps
    - *save-cache
    - *run-e2e-tests

workflows:
  version: 2
  build-and-test:
    jobs:
    - unit_tests
    - integration_tests
    - build:
        filters:
          branches:
            only: master
        requires:
        - unit_tests
        - integration_tests
