#!/usr/bin/env bash
set -e

cd "$(dirname "$0")"/..

# read the options
TEMP=$(getopt -o "" --long skip-provision-check -- "$@")
eval set -- "$TEMP"

# extract options.
forcearg=()
while true; do
    case "$1" in
        --skip-provision-check)
            forcearg=(--skip-provision-check)
            shift
            ;;
        --)
            shift
            break
            ;;
    esac
done

function run() {
    echo '----'
    printf 'Running'
    printf ' %q' "$@"
    printf '\n'
    if ! "$@"; then
        printf '\n\e[31;1mFAILED\e[0m'
        printf ' %q' "$@"
        printf '\n'
        exit 1
    else
        echo
    fi
}

printf '\n\e[33;1m'
echo "Because test-all is very slow, we recommend running individual (sub)suites "
echo "and relying on CI to run the complete test suite for a fast edit-test cycle.  See"
echo "  https://zulip.readthedocs.io/en/latest/testing/testing.html#running-tests"
echo "for details on how to run just the relevant subsets of our tests."
printf '\e[0m'
echo

# prep
run ./tools/check-provision "${forcearg[@]}"

# ci/backend
run ./tools/lint --groups=backend "${forcearg[@]}"
run ./tools/test-tools
run ./tools/test-backend --include-webhooks --ban-console-output "${forcearg[@]}"
run ./tools/test-migrations
# Not running SVG optimizing since it's low-churn
# run ./tools/setup/optimize-svg
# Not running missing bot avatar detection since it's low churn
# ./tools/setup/generate_integration_bots_avatars.py --check-missing
# Not running documentation tests since it takes 20s and only tests documentation
# run ./tools/test-documentation --skip-external-links
run ./tools/test-help-documentation --skip-external-links "${forcearg[@]}"
run ./tools/test-api
# Not running requirements check locally, because slow and low-churn
# run ./tools/test-locked-requirements
# Not running run-dev tests locally; we never have
# run ./tools/test-run-dev
# Not running queue worker reload tests since it's low-churn code
# run ./tools/test-queue-worker-reload

# ci/frontend
run ./tools/lint --groups=frontend "${forcearg[@]}"
run ./tools/test-js-with-node
run ./tools/check-schemas
run ./manage.py makemessages --locale en
run env PYTHONWARNINGS=ignore ./tools/check-capitalization --no-generate
run env PYTHONWARNINGS=ignore ./tools/check-frontend-i18n --no-generate
run ./tools/test-js-with-puppeteer "${forcearg[@]}"

printf '\n\e[32mAll OK!\e[0m\n'
