Files
heroku-buildpack-python/test/run-features
T
Ed Morley a98ef91566 Tests: Clean up the Python version unit tests (#1092)
* Fixes the "Installing <version>" assertions so that they don't false
  positive against the "please upgrade to <version>" output.
* Removes modification of test fixtures during tests, since it can lead
  to failures depending on test order, and confusion when debugging.
* Updates the PyPy version warning tests to use a slightly newer (but
  still not latest) PyPy version, which means that the test now passes
  on Cedar-14 and can be unskipped.
* Switches to using an empty requirements file for version tests that
  duplicate the main test, to save spending time installing dependencies
  unnecessarily.
* Switches the NLTK test to using the default buildpack Python version,
  rather than an ancient Python 3.6.
* Skips the Python 3.7/3.8 tests on Cedar-14 rather than asserting
  failure, since we know they'll never pass due to Cedar-14's libssl being
  older than required.
* Removes redundant `testSqliteInstall` test since it duplicates the
  Python version install tests.

Longer term I'll be moving many of the unit tests to Hatchet, however
this at least makes the tests more dependable in the meantime.

Closes @W-8060219@.
Closes @W-8176779@.

[skip changelog]
2020-10-07 15:10:20 +01:00

152 lines
4.2 KiB
Bash
Executable File

#!/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() {
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() {
compile "pipenv-full-version"
assertCaptured "3.6.3"
# 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
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