!/bin/bash # Run Faraday integration tests locally with Docker. # # This starts the service containers declared in # .github/workflows/integration-tests.yml on a private network and runs the # specs in a ruby container next to them, like the workflow does. (act cannot # be used because it doesn’t support the ‘command` key of service containers.) # # Usage: [RUBY_VERSION=4.0] bin/integration-tests [rspec arguments, default: spec/integration] # Keep the service definitions below in sync with the workflow.
set -euo pipefail
cd “$(dirname ”$0“)/..”
if ! command -v docker &> /dev/null; then
echo "Docker is required to run the integration tests: https://docs.docker.com/get-docker/" exit 1
fi
network=“faraday-integration-$$” services=(httpbin proxy auth-proxy)
cleanup() {
for service in "${services[@]}"; do
docker rm -f "$service-$$" > /dev/null 2>&1 || true
done
docker network rm "$network" > /dev/null 2>&1 || true
} trap cleanup EXIT
start() {
local name=$1 shift docker run -d --rm --name "$name-$$" --network "$network" --network-alias "$name" "$@" > /dev/null
}
echo “Starting service containers…” docker network create “$network” > /dev/null start httpbin kennethreitz/httpbin:latest start proxy mitmproxy/mitmproxy:12 mitmdump –set ‘ignore_hosts=.*’ start auth-proxy mitmproxy/mitmproxy:12 mitmdump –set ‘ignore_hosts=.*’ –set ‘proxyauth=user:p@ss word’
echo “Running integration tests…” docker run –rm –network “$network” \
-v "$PWD":/src:ro -w /work \
-e COVERAGE=false \
-e HTTPBIN_URL=http://httpbin \
-e PROXY_URL=http://proxy:8080 \
-e AUTH_PROXY_URL=http://auth-proxy:8080 \
"ruby:${RUBY_VERSION:-4.0}" bash -c '
set -e
# Work on a copy without the host Gemfile.lock, which may need another bundler or Ruby
cp -a /src/. /work/
rm -f Gemfile.lock
export BUNDLE_PATH=/tmp/bundle
bundle install --quiet
# The services need a moment to start up (httpbin and mitmdump are Python apps)
retry="--retry 30 --retry-delay 2 --retry-connrefused"
curl -sf $retry http://httpbin/get > /dev/null
curl -sf $retry --proxy http://proxy:8080 http://httpbin/get > /dev/null
curl -sf $retry --proxy http://auth-proxy:8080 --proxy-user "user:p@ss word" http://httpbin/get > /dev/null
exec bundle exec rspec "${@:-spec/integration}" --format documentation
' bash "$@"