Skip to content

Commit

Permalink
tests: Add tests for python application factories
Browse files Browse the repository at this point in the history
Add the following tests cases:

1. When "factory" key is used inside the "targets" option.
2. When "factory" key is used at the root level of python application
   config.
3. When factory returns invalid callable or When factory is invalid
   callable

Link: <#1336>
[ Commit subject & message formatting tweaks - Andrew ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
  • Loading branch information
gourav-kandoria authored and ac000 committed Jul 2, 2024
1 parent a9aa9e7 commit d67d350
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 0 deletions.
23 changes: 23 additions & 0 deletions test/python/factory/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
def wsgi_a(env, start_response):
start_response("200", [("Content-Length", "1")])
return [b"1"]


def wsgi_b(env, start_response):
start_response("200", [("Content-Length", "1")])
return [b"2"]


def wsgi_a_factory():
return wsgi_a


def wsgi_b_factory():
return wsgi_b


wsgi_invalid_callable = None


def wsgi_factory_returning_invalid_callable():
return wsgi_invalid_callable
140 changes: 140 additions & 0 deletions test/test_python_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
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,
},
},
}
},
}
)

0 comments on commit d67d350

Please sign in to comment.