from unit.applications.lang.python import ApplicationPython
from unit.option import option
prerequisites = {"modules": {"python": "all"}}
client = ApplicationPython()
def test_python_factory_targets():
python_dir = f"{option.test_dir}/python"
assert "success" in client.conf(
{
"listeners": {
"*:8080": {"pass": "applications/targets/1"},
"*:8081": {"pass": "applications/targets/2"},
"*:8082": {"pass": "applications/targets/factory-1"},
"*:8083": {"pass": "applications/targets/factory-2"},
},
"applications": {
"targets": {
"type": client.get_application_type(),
"working_directory": f"{python_dir}/factory/",
"path": f"{python_dir}/factory/",
"targets": {
"1": {
"module": "wsgi",
"callable": "wsgi_a",
"factory": False,
},
"2": {
"module": "wsgi",
"callable": "wsgi_b",
"factory": False,
},
"factory-1": {
"module": "wsgi",
"callable": "wsgi_a_factory",
"factory": True,
},
"factory-2": {
"module": "wsgi",
"callable": "wsgi_b_factory",
"factory": True,
},
},
}
},
}
)
resp = client.get(port=8080)
assert resp["status"] == 200
assert resp["body"] == "1"
resp = client.get(port=8081)
assert resp["status"] == 200
assert resp["body"] == "2"
resp = client.get(port=8082)
assert resp["status"] == 200
assert resp["body"] == "1"
resp = client.get(port=8083)
assert resp["status"] == 200
assert resp["body"] == "2"
def test_python_factory_without_targets():
python_dir = f"{option.test_dir}/python"
assert "success" in client.conf(
{
"listeners": {
"*:8080": {"pass": "applications/python-app-factory"},
"*:8081": {"pass": "applications/python-app"},
},
"applications": {
"python-app-factory": {
"type": client.get_application_type(),
"working_directory": f"{python_dir}/factory/",
"path": f"{python_dir}/factory/",
"module": "wsgi",
"callable": "wsgi_a_factory",
"factory": True,
},
"python-app": {
"type": client.get_application_type(),
"working_directory": f"{python_dir}/factory/",
"path": f"{python_dir}/factory/",
"module": "wsgi",
"callable": "wsgi_b",
"factory": False,
},
},
}
)
resp = client.get(port=8080)
assert resp["status"] == 200
assert resp["body"] == "1"
resp = client.get(port=8081)
assert resp["status"] == 200
assert resp["body"] == "2"
def test_python_factory_invalid_callable_value(skip_alert):
skip_alert(
r"failed to apply new conf",
r"did not return callable object",
r"can not be called to fetch callable",
)
python_dir = f"{option.test_dir}/python"
invalid_callable_values = [
"wsgi_factory_returning_invalid_callable",
"wsgi_invalid_callable",
]
for callable_value in invalid_callable_values:
assert "error" in client.conf(
{
"listeners": {"*:8080": {"pass": "applications/targets/1"}},
"applications": {
"targets": {
"type": client.get_application_type(),
"working_directory": f"{python_dir}/factory/",
"path": f"{python_dir}/factory/",
"targets": {
"1": {
"module": "wsgi",
"callable": callable_value,
"factory": True,
},
},
}
},
}
)