diff --git a/.circleci/config.yml b/.circleci/config.yml index c5a459974..411817e92 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,19 +3,22 @@ # 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: circleci/ruby:2.6.5-node-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: circleci/postgres:9.4 + environment: + - CC_TEST_REPORTER_ID: b1b5c4447bf93f6f0b06a64756e35afd0810ea83649f03971cbf303b4449456f + jobs: build: - docker: - # specify the version you desire here - - image: circleci/ruby:2.6.5-node-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: circleci/postgres:9.4 - - working_directory: ~/build - + <<: *defaults steps: - checkout @@ -30,29 +33,22 @@ jobs: name: Which bundler? command: bundle -v - # Restore bundle cache + # 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-v2-{{ checksum "Gemfile.lock" }} - - chatwoot-bundle-v2- - - - run: - name: Bundle Install - command: bundle check || bundle install - - - run: - name: Bundle audit - command: bundle exec bundle audit update && bundle exec bundle audit check -v - - - run: - name: Rubocop - command: bundle exec rubocop - - # Store bundle cache + # when lock file changes, use increasingly general patterns to restore cache + - v1-gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }} + - v1-gem-cache-{{ arch }}-{{ .Branch }}- + - v1-gem-cache-{{ arch }}- + - run: bundle install && bundle clean - save_cache: - key: chatwoot-bundle-v2-{{ checksum "Gemfile.lock" }} paths: - - vendor/bundle + - ~/.bundle + key: v1-gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }} + # Only necessary if app uses webpacker or yarn in some other way - restore_cache: @@ -64,30 +60,60 @@ jobs: name: yarn command: yarn install --cache-folder ~/.cache/yarn - - run: - name: eslint - command: yarn run eslint - - - run: - name: test - command: yarn test - # Store yarn / webpacker cache - save_cache: key: chatwoot-yarn-{{ 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 + # 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: eslint + command: yarn run eslint # Run rails tests - - type: shell - command: | - bundle exec rspec $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) + - run: + name: Run backend tests + command: | + bundle exec rspec $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) + ./tmp/cc-test-reporter format-coverage -t simplecov -o tmp/codeclimate.backend.json coverage/backend/.resultset.json + - persist_to_workspace: + root: tmp + paths: + - codeclimate.backend.json + + - run: + name: Run frontend tests + command: | + yarn test:coverage + ./tmp/cc-test-reporter format-coverage -t lcov -o tmp/codeclimate.frontend.json buildreports/lcov.info + - persist_to_workspace: + root: tmp + paths: + - codeclimate.frontend.json # collect reports - store_test_results: @@ -95,3 +121,9 @@ jobs: - store_artifacts: path: /tmp/test-results destination: test-results + + - run: + name: Upload coverage results to Code Climate + command: | + ./tmp/cc-test-reporter sum-coverage tmp/codeclimate.*.json -p 2 -o tmp/codeclimate.total.json + ./tmp/cc-test-reporter upload-coverage -i tmp/codeclimate.total.json \ No newline at end of file diff --git a/Gemfile b/Gemfile index 16e422c13..16683f6d3 100644 --- a/Gemfile +++ b/Gemfile @@ -81,6 +81,7 @@ group :test do gem 'action-cable-testing' gem 'mock_redis' gem 'shoulda-matchers' + gem 'simplecov', require: false end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 02ad10699..414a3b618 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -136,6 +136,7 @@ GEM devise (> 3.5.2, < 5) rails (>= 4.2.0, < 6.1) diff-lcs (1.3) + docile (1.3.2) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.5) @@ -361,6 +362,11 @@ GEM rack-protection (>= 2.0.0) redis (>= 4.1.0) simple_oauth (0.3.1) + simplecov (0.17.1) + docile (~> 1.1) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.2) spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) @@ -481,6 +487,7 @@ DEPENDENCIES sentry-raven shoulda-matchers sidekiq + simplecov spring spring-watcher-listen telegram-bot-ruby diff --git a/package.json b/package.json index 9f121ad1e..ddb6a2199 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,10 @@ "pre-commit": "lint-staged" } }, + "jest": { + "collectCoverage": true, + "coverageReporters": ["lcov", "text"] + }, "lint-staged": { "*.{js,vue}": [ "eslint --fix", diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 526369a1d..ee6aa71b9 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,6 @@ +require 'simplecov' +SimpleCov.start 'rails' + RSpec.configure do |config| config.expect_with :rspec do |expectations| expectations.include_chain_clauses_in_custom_matcher_descriptions = true diff --git a/spec/test_helper.rb b/spec/test_helper.rb index 88d8f433f..f657305ef 100644 --- a/spec/test_helper.rb +++ b/spec/test_helper.rb @@ -1,4 +1,7 @@ ENV['RAILS_ENV'] ||= 'test' +require 'simplecov' +SimpleCov.start 'rails' + require File.expand_path('../config/environment', __dir__) require 'rails/test_help'