version: 2
aliases:
  - &node_version node:12.14.1
  # Common steps
  - &restore_npm_cache
    restore_cache:
      name: Restore npm dependencies cache
      key: npm-dependency-{{ checksum "package.json" }}
  - &workflow_common
    requires:
      - dependencies 
  - &wdio_diff_e2e_docker
    image: ukti/wdio-diff-image-test:1.0.0

jobs:
  dependencies:
    docker:
      - image: *node_version
    working_directory: ~/wdio-image-diff
    steps:
      - checkout
      - *restore_npm_cache
      - run: npm install
      - save_cache:
          name: Save npm dependencies cache
          key: npm-dependency-{{ checksum "package.json" }}
          paths:
            - ~/wdio-image-diff/node_modules

  lint_tests:
    docker:
      - image: *node_version
    working_directory: ~/wdio-image-diff
    steps:
      - checkout
      - *restore_npm_cache
      - run:
          name: Lint code
          command: npm run lint
          when: always

  unit_tests:
    docker:
      - image: *node_version
    working_directory: ~/wdio-image-diff
    steps:
      - checkout
      - *restore_npm_cache
      - run:
          name: Jest tests
          command: npm run test
          when: always

  e2e_tests:
    docker:
      - <<: *wdio_diff_e2e_docker
    working_directory: ~/wdio-image-diff
    steps:
      - checkout
      - *restore_npm_cache
      - run:
          name: E2E tests
          command: npm run test:e2e
          when: always

  build_and_publish:
    docker:
      - image: *node_version
    working_directory: ~/wdio-image-diff
    steps:
      - checkout
      - *restore_npm_cache
      - run:
          name: Build
          command: npm run build
      - run:
          name: Publish (semantic release - master only)
          command: ./node_modules/.bin/semantic-release

workflows:
  version: 2
  wdioimagediff:
    jobs:
      - dependencies
      - lint_tests: *workflow_common
      - unit_tests: *workflow_common
      - e2e_tests: *workflow_common
      - build_and_publish:
          requires:
            - lint_tests
            - unit_tests
            - e2e_tests
          filters:
            branches:
              only:
                - master
