mbland/custom-links

View on GitHub
scripts/test.d/browser

Summary

Maintainability
Test Coverage
#! /usr/bin/env bash
#
# Runs browser tests
#
# Usage:
#   {{go}} {{cmd}} [--coverage] [--single-run]
#
# Options:
#   --coverage    Collect test coverage data using istanbul
#   --single-run  Run tests using PhantomJS

declare TEST_BROWSER_HELPER_DIR='public/tests/generated'
declare TEST_BROWSER_HELPER_INPUT='tests/helpers/browser.js'
declare TEST_BROWSER_COVERAGE_FILE="$_GO_ROOTDIR/.coverage/browser.json"
declare TEST_BROWSER_COVERAGE_MIDDLEWARE="$_GO_ROOTDIR/tests/helpers/coverage-middleware.js"

_test_browser_tab_completion() {
  local word_index="$1"
  shift
  local args=("$@")
  local word="${args[$word_index]}"

  if [[ "$word_index" -gt '1' ]]; then
    return 1
  fi
  @go.compgen -W '--coverage --single-run' -- "$word"
}

_test_browser_create_bundle() {
  local helper_dir="$TEST_BROWSER_HELPER_DIR"
  local bundle="$helper_dir/index.js"

  if [[ ! -d "$helper_dir" ]] && ! mkdir -p "$helper_dir"; then
    @go.printf 'Failed to create directory: %s\n' "$helper_dir" >&2
    return 1
  fi

  browserify "$TEST_BROWSER_HELPER_INPUT" >"$bundle"

  if [[ "$?" -ne '0' ]]; then
    @go.printf 'Browserify failed to create: %s\n' "$bundle" >&2
    exit 1
  fi
}

_test_browser_run_tests() {
  if ! _test_browser_create_bundle; then
    return 1
  fi

  if [[ "$OSTYPE" == 'msys' ]]; then
    export MSYS_NO_PATHCONV='true'
    export MSYS2_ARG_CONV_EXCL='*'
  fi

  if [[ "$__single_run" == 'true' ]]; then
    _test_browser_run_in_headless_browsers
  else
    _test_browser_run_in_browser
  fi
}

_test_browser_run_in_browser() {
  local test_args=('--open=/tests/')

  if [[ "$__coverage_run" == 'true' ]]; then
    test_args+=("--middleware=$TEST_BROWSER_COVERAGE_MIDDLEWARE")
  fi
  live-server "${test_args[@]}" public/
}

_test_browser_run_in_headless_browsers() {
  local port
  local test_server_url
  local sleep_seconds='1'
  local server_pid
  local result='0'

  port="$(tests/helpers/pick-unused-port)"
  if [[ "$?" -ne '0' ]]; then
    @go.printf 'Failed to pick an unused port.\n' >&2
    return 1
  fi
  test_server_url="http://localhost:${port}"

  set -m
  COVERAGE_RUN="$__coverage_run" \
    "$_GO_ROOTDIR/tests/helpers/browser-test-server" "$port" &

  if [[ "$?" -ne '0' ]]; then
    @go.printf 'Failed to launch live-server on port %d.\n' "$port" >&2
    return 1
  elif [[ -n "$CI" ]]; then
    # live-server needs a little extra time on Travis.
    sleep_seconds='3'
  fi
  sleep "$sleep_seconds"
  server_pid="$!"

  if ! _test_browser_run_in_chrome_headless; then
    result='1'
  fi
  if ! _test_browser_run_in_phantomjs; then
    result='1'
  fi
  _test_browser_download_coverage

  kill -INT "$server_pid"
  set +m
  return "$result"
}

_test_browser_run_in_chrome_headless() {
  local node_version="$(node --version)"
  local major_version

  if [[ "$node_version" =~ ^v([0-9]+)\.[0-9]+\.[0-9]+ ]]; then
    major_version="${BASH_REMATCH[1]}"
  fi

  if [[ "$major_version" -lt '8' ]]; then
    @go.log INFO "Skipping headless Chrome run on Node ${node_version}," \
      "since mocha-chrome isn't supported before v8.0.0."
    return
  fi
  @go.log INFO 'Running browser tests in headless Chrome'

  # See https://docs.travis-ci.com/user/chrome#Sandboxing for details on why
  # sandboxing is disabled.
  mocha-chrome --chrome-flags '["--no-sandbox"]' --reporter spec \
    "$test_server_url/tests/"
}

_test_browser_run_in_phantomjs() {
  @go.log INFO 'Running browser tests in PhantomJS'
  phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js \
    "$test_server_url/tests/" 'spec' "{ \"useColors\": true }"
}

_test_browser_download_coverage() {
  if [[ -z "$__coverage_run" ]]; then
    return
  elif ! mkdir -p "${TEST_BROWSER_COVERAGE_FILE%/*}"; then
    @go.log WARN 'Failed to create coverage data directory.'
  elif ! command -v curl >/dev/null; then
    @go.log WARN 'curl must be installed to download coverage data.'
  elif ! curl "$test_server_url/coverage.json" \
    -s -o "$TEST_BROWSER_COVERAGE_FILE"; then
    @go.log WARN 'Failed to download coverage data.'
  fi
}

_test_browser() {
  local arg
  local __coverage_run
  local __single_run="${__TEST_ALL:+true}"
  local result=0

  while [[ "$#" -ne '0' ]]; do
    arg="$1"
    shift
    case "$arg" in
    --complete)
      # Tab completions
      _test_browser_tab_completion "$@"
      return
      ;;
    --coverage)
      __coverage_run='true'
      . "$_GO_USE_MODULES" 'coverage'
      if [[ -z "$__TEST_ALL" ]]; then
        rm -f "$CL_COVERAGE_DATADIR"/*.json
      fi
      ;;
    --single-run)
      __single_run='true'
      ;;
    *)
      @go.printf 'Unknown argument: %s\n' "$1" >&2
      return 1
      ;;
    esac
  done

  _test_browser_run_tests
  result="$?"

  if [[ "$__coverage_run" == 'true' && "$__single_run" == 'true' &&
    -z "$__TEST_ALL" ]] && ! cl.generate_coverage_report; then
    result='1'
  fi
  return "$result"
}

_test_browser "$@"