#!/usr/bin/env bash # Default Python Versions # shellcheck source=bin/default_pythons source "bin/default_pythons" testGitEgg() { compile "git-egg" assertCaptured "requests" assertCapturedSuccess } testSmartRequirements() { local cache_dir="$(mktmpdir)" compile "requirements-standard" "$cache_dir" assertFile "requests" ".heroku/python/requirements-declared.txt" assertCapturedSuccess compile "psycopg2" "$cache_dir" assertFile "psycopg2" ".heroku/python/requirements-declared.txt" assertCapturedSuccess } testStackChange() { local cache_dir="$(mktmpdir)" mkdir -p "${cache_dir}/.heroku" echo "different-stack" > "${cache_dir}/.heroku/python-stack" compile "requirements-standard" "$cache_dir" assertCaptured "clearing cache" assertFile "$STACK" ".heroku/python-stack" assertCapturedSuccess } testSetupPy() { compile "setup-py" assertCaptured "maya" # Can't use `assertCapturedSuccess` since stderr contains: # "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941) assertCapturedSuccessWithStdErr } testStandardRequirements() { compile "requirements-standard" assertCaptured "requests" assertCapturedSuccess } testPipenv() { compile "pipenv" assertCaptured "Installing pip 9.0.2, setuptools 47.1.1 and wheel 0.34.2" # Can't use `assertCapturedSuccess` since stderr contains: # "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941) assertCapturedSuccessWithStdErr } testPipenvLock() { compile "pipenv-lock" # Can't use `assertCapturedSuccess` since stderr contains: # "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941) assertCapturedSuccessWithStdErr } testPipenvPythonVersion3_6() { compile "pipenv-version" assertCaptured "Installing ${LATEST_36}" # Can't use `assertCapturedSuccess` since stderr contains: # "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941) assertCapturedSuccessWithStdErr } testPipenvPythonVersion2_7() { # Python 2.7 is EOL, so it has not been built for Heroku-20. if [[ $STACK == "heroku-20" ]]; then return fi compile "pipenv-version2" assertCaptured "Installing ${LATEST_27}" # Can't use `assertCapturedSuccess` since stderr contains: # "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941) assertCapturedSuccessWithStdErr } testPipenvPythonFullVersion() { # Python 3.7+ requires newer libssl than is present on Cedar-14. if [[ "${STACK}" = "cedar-14" ]]; then return fi compile "pipenv-full-version" assertCaptured "3.7.8" # Can't use `assertCapturedSuccess` since stderr contains: # "cp: cannot stat '/tmp/build_*/requirements.txt': No such file or directory" (W-7924941) assertCapturedSuccessWithStdErr } testNoRequirements() { compile "no-requirements" assertCapturedError } testWarnOldDjango() { compile "old-django" assertCaptured "Your Django version is nearing the end of its community support." assertCapturedSuccess } testDontWarnOldDjango() { compile "not-old-django" assertNotCaptured "Your Django version is nearing the end of its community support." assertCapturedSuccess } testHooks() { # Test that the hooks are called correctly, and that the environment contains # the app's config vars but no unexpected env vars from the buildpack. local env_dir="$(mktmpdir)" echo 'test' > "${env_dir}/SOME_APP_CONFIG_VAR" local expected_env_vars=( _ BIN_DIR BPLOG_PREFIX BUILD_DIR BUILDPACK_LOG_FILE CACHE_DIR C_INCLUDE_PATH CPLUS_INCLUDE_PATH ENV_DIR EXPORT_PATH HOME LANG LD_LIBRARY_PATH LIBRARY_PATH OLDPWD PATH PIP_NO_PYTHON_VERSION_WARNING PKG_CONFIG_PATH PROFILE_PATH PWD PYTHONUNBUFFERED S3_BASE_URL SHLVL SOME_APP_CONFIG_VAR STACK ) if [[ "${STACK}" == "cedar-14" || "${STACK}" == "heroku-16" ]]; then # Remove "OLDPWD" from expected_env_vars since for bash <4.4 it's not exported to subshells: # https://github.com/heroku/heroku-buildpack-python/pull/1011#issuecomment-665117835 read -ra expected_env_vars <<< "${expected_env_vars[@]/OLDPWD/}" fi compile 'hooks' '' "${env_dir}" assertCaptured "pre_compile ran!" assertCaptured "pre_compile env: ${expected_env_vars[*]}." assertCaptured "post_compile ran!" assertCaptured "post_compile env: ${expected_env_vars[*]}." assertCapturedSuccess } pushd $(dirname 0) >/dev/null popd >/dev/null source $(pwd)/test/utils source $(pwd)/test/shunit2