version: 2

attach: &attach
  attach_workspace:
    at: /home/circleci

register_nypr_metrics: &register_nypr_metrics
  run:
    name: make global symlink
    command: cd /home/circleci/nypr-metrics && yarn link

node_key: &node_key
  key: node-deps-{{ arch }}-{{ checksum "yarn.lock" }}-{{ checksum "circle.yml" }}

restore_node: &restore_node
  restore_cache:
    <<: *node_key

install_node: &install_node
  run:
    name: node deps
    command: |
      if [ ! -d node_modules ]; then
        yarn --pure-lockfile
      fi

save_node: &save_node
  save_cache:
    <<: *node_key
    paths:
      - node_modules
      - /home/circleci/.cache/Cypress

build_modernizr: &build_modernizr
  run:
    name: Build modernizr
    command: npx grunt modernizr:dist

run_client_tests: &run_client_tests
  run:
    name: link and test
    command: |
      yarn link nypr-metrics
      npx ember test

container_defaults: &defaults
  docker:
    - image: circleci/node:8-browsers
      environment:
        JOBS: 2

jobs:
  install:
    <<: *defaults
    working_directory: /home/circleci/nypr-metrics
    steps:
      - checkout

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - persist_to_workspace:
          root: /home/circleci
          paths:
            - nypr-metrics

  test:
    <<: *defaults
    working_directory: /home/circleci/nypr-metrics
    environment:
      CIRCLE_TEST_REPORTS: test-results

    steps:
      - checkout
      - <<: *restore_node

      - run:
          name: Run addon tests
          command: |
            sudo yarn global add greenkeeper-lockfile@1
            greenkeeper-lockfile-update
            npx ember test
            greenkeeper-lockfile-upload

      - store_test_results:
          path: test-results/

  setup_test_clients:
    docker:
      - image: circleci/buildpack-deps:jessie
    working_directory: /home/circleci
    steps:
      - run:
          name: Keyscan Github
          command: |
            mkdir ~/.ssh
            ssh-keyscan -H github.com >> ~/.ssh/known_hosts
      - run:
          name: clone clients
          command: |
            for client in wnyc wqxr new-sounds wnyc-studios gothamist; do
              git clone git@github.com:nypublicradio/$client-web-client
            done
      - persist_to_workspace:
          root: .
          paths:
            - wnyc-web-client
            - wqxr-web-client
            - new-sounds-web-client
            - wnyc-studios-web-client
            - gothamist-web-client

  test_wnyc:
    <<: *defaults
    working_directory: /home/circleci/wnyc-web-client
    environment:
      CIRCLE_TEST_REPORTS: wnyc-test-results

    steps:
      - <<: *attach
      - <<: *register_nypr_metrics

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - <<: *build_modernizr

      - <<: *run_client_tests

      - store_test_results:
          path: wnyc-test-results/

  test_wqxr:
    <<: *defaults
    working_directory: /home/circleci/wqxr-web-client
    environment:
      CIRCLE_TEST_REPORTS: wqxr-test-results

    steps:
      - <<: *attach
      - <<: *register_nypr_metrics

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - <<: *build_modernizr

      - <<: *run_client_tests

      - store_test_results:
          path: wqxr-test-results/

  test_new_sounds:
    <<: *defaults
    working_directory: /home/circleci/new-sounds-web-client
    environment:
      CIRCLE_TEST_REPORTS: new-sounds-test-results

    steps:
      - <<: *attach
      - <<: *register_nypr_metrics

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - <<: *run_client_tests

      - store_test_results:
          path: new-sounds-test-results/

  test_wnyc_studios_ember:
    <<: *defaults
    parallelism: 4
    working_directory: /home/circleci/wnyc-studios-web-client
    environment:
      CIRCLE_TEST_REPORTS: wnyc-studios-test-results

    steps:
      - <<: *attach
      - <<: *register_nypr_metrics

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - <<: *build_modernizr

      - run: |
          cp .env.sample .env
          npx ember exam --split=$CIRCLE_NODE_TOTAL --partition=$(($CIRCLE_NODE_INDEX + 1))

      - store_test_results:
          path: wnyc-studios-test-results/

  test_wnyc_studios_cypress:
    <<: *defaults
    parallelism: 4
    working_directory: /home/circleci/wnyc-studios-web-client
    environment:
      CIRCLE_TEST_REPORTS: wnyc-studios-test-results

    steps:
      - <<: *attach
      - <<: *register_nypr_metrics

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - <<: *build_modernizr

      - run: |
          cp .env.sample .env
          sudo apt-get install libgconf-2-4
          yarn run cy:ci:test

      - store_test_results:
          path: wnyc-studios-test-results/

  test_gothamist:
    <<: *defaults
    working_directory: /home/circleci/gothamist-web-client
    environment:
      CIRCLE_TEST_REPORTS: gothamist-test-results

    steps:
      - <<: *attach
      - <<: *register_nypr_metrics

      - <<: *restore_node
      - <<: *install_node
      - <<: *save_node

      - <<: *run_client_tests

      - store_test_results:
          path: gothamist-test-results/



workflows:
  version: 2
  just-test:
    jobs:
      - install:
          filters:
            branches:
              ignore: master
      - test:
          requires:
            - install

  test-all-clients:
    jobs:
      - install:
          filters:
            branches:
              only: master
      - test:
          requires:
            - install
      - setup_test_clients:
          requires:
            - install
      - test_wnyc:
          requires:
            - setup_test_clients
      - test_wqxr:
          requires:
            - setup_test_clients
      - test_wnyc_studios_ember:
          requires:
            - setup_test_clients
      - test_wnyc_studios_cypress:
          requires:
            - setup_test_clients
      - test_new_sounds:
          requires:
            - setup_test_clients
      - test_gothamist:
          requires:
            - setup_test_clients
