# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
defaults: &defaults
  working_directory: ~/build
  docker:
    # specify the version you desire here
    - image: cimg/ruby:3.0.4-browsers

    # Specify service dependencies here if necessary
    # CircleCI maintains a library of pre-built images
    # documented at https://circleci.com/docs/2.0/circleci-images/
    - image: cimg/postgres:14.1
    - image: cimg/redis:6.2.6
  environment:
      - RAILS_LOG_TO_STDOUT: false
      - COVERAGE: true
      - LOG_LEVEL: warn
  parallelism: 4
  resource_class: large

jobs:
  build:
    <<: *defaults
    steps:
      - checkout

      - run:
          name: Configure Bundler
          command: |
            echo 'export BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d " ")' >> $BASH_ENV
            source $BASH_ENV
            gem install bundler

      - run:
          name: Which bundler?
          command: bundle -v

      # Run bundler
      # Load installed gems from cache if possible, bundle install then save cache
      # Multiple caches are used to increase the chance of a cache hit

      - restore_cache:
          keys:
            - chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-v20220524-{{ checksum "Gemfile.lock" }}

      - run: bundle install --frozen --path ~/.bundle
      - save_cache:
          paths:
            - ~/.bundle
          key: chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-v20220524-{{ checksum "Gemfile.lock" }}


      # Only necessary if app uses webpacker or yarn in some other way
      - restore_cache:
          keys:
            - chatwoot-yarn-{{ .Environment.CACHE_VERSION }}-{{ checksum "yarn.lock" }}
            - chatwoot-yarn-

      - run:
          name: yarn
          command: yarn install --cache-folder ~/.cache/yarn

      # Store yarn / webpacker cache
      - save_cache:
          key: chatwoot-yarn-{{ .Environment.CACHE_VERSION }}-{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn

      - run:
          name:  Download cc-test-reporter
          command: |
            mkdir -p ~/tmp
            curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter
            chmod +x ~/tmp/cc-test-reporter
      - persist_to_workspace:
          root: ~/tmp
          paths:
            - cc-test-reporter

      # verify swagger specification
      - run:
          name: Verify swagger API specification
          command: |
            bundle exec rake swagger:build
            if [[ `git status swagger/swagger.json --porcelain` ]]
            then
              echo "ERROR: The swagger.json file is not in sync with the yaml specification. Run 'rake swagger:build' and commit 'swagger/swagger.json'."
              exit 1
            fi
            curl -L https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/5.3.0/openapi-generator-cli-5.3.0.jar > ~/tmp/openapi-generator-cli-5.3.0.jar
            java -jar ~/tmp/openapi-generator-cli-5.3.0.jar validate -i swagger/swagger.json
            
      # Database setup
      - run: yarn install --check-files
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load

      - run:
          name: Bundle audit
          command: bundle exec bundle audit update && bundle exec bundle audit check -v

      - run:
          name: Rubocop
          command: bundle exec rubocop
      
      # - run:
      #     name: Brakeman
      #     command: bundle exec brakeman

      - run:
          name: eslint
          command: yarn run eslint

      # Run rails tests
      - run:
          name: Run backend tests
          command: |
            mkdir -p ~/tmp/test-results/rspec
            mkdir -p ~/tmp/test-artifacts
            mkdir -p coverage
            ~/tmp/cc-test-reporter before-build
            TESTFILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
            bundle exec rspec --format progress \
                              --format RspecJunitFormatter \
                              --out ~/tmp/test-results/rspec.xml \
                              -- ${TESTFILES}
          no_output_timeout: 30m
      - run:
          name: Code Climate Test Coverage
          command: |
            ~/tmp/cc-test-reporter format-coverage -t simplecov -o "coverage/codeclimate.$CIRCLE_NODE_INDEX.json"

      - run:
          name: Run frontend tests
          command: |
            mkdir -p ~/tmp/test-results/frontend_specs
            ~/tmp/cc-test-reporter before-build
            TESTFILES=$(circleci tests glob **/specs/*.spec.js | circleci tests split --split-by=timings)
            yarn test:coverage --profile 10 \
                               --out ~/tmp/test-results/yarn.xml \
                               -- ${TESTFILES}
      - run:
          name: Code Climate Test Coverage
          command: |
            ~/tmp/cc-test-reporter format-coverage -t lcov -o coverage/codeclimate.frontend_$CIRCLE_NODE_INDEX.json buildreports/lcov.info    
            
      - persist_to_workspace:
          root: coverage
          paths:
            - codeclimate.*.json
      # collect reports
      - store_test_results:
          path: ~/tmp/test-results
      - store_artifacts:
          path: ~/tmp/test-artifacts
      - store_artifacts:
          path: log

  upload-coverage:
    working_directory: ~/build
    docker:
      # specify the version you desire here
      - image: circleci/ruby:3.0.2-node-browsers
    environment:
      - CC_TEST_REPORTER_ID: caf26a895e937974a90860cfadfded20891cfd1373a5aaafb3f67406ab9d433f
    steps:
      - attach_workspace:
          at: ~/build
      - run:
          name:  Download cc-test-reporter
          command: |
            mkdir -p ~/tmp
            curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter
            chmod +x ~/tmp/cc-test-reporter
      - persist_to_workspace:
          root: ~/tmp
          paths:
            - cc-test-reporter
      - run:
          name: Upload coverage results to Code Climate
          command: |
            ~/tmp/cc-test-reporter sum-coverage --output - codeclimate.*.json |  ~/tmp/cc-test-reporter upload-coverage --debug --input -

workflows:
  version: 2

  commit:
    jobs:
      - build
      - upload-coverage:
          requires:
             - build

