summaryrefslogtreecommitdiffhomepage
path: root/test/test_python_factory.py
diff options
context:
space:
mode:
authorGourav <gouravkandoria1500@gmail.com>2024-06-26 12:07:09 +0530
committerAndrew Clayton <a.clayton@nginx.com>2024-07-02 19:13:14 +0100
commitd67d350142d4ef9a9cdbfc2bb4a6b2d8f261deb1 (patch)
tree4c939fcff01fff44076b747c240b46c50f93c8c3 /test/test_python_factory.py
parenta9aa9e76db2766a681350c09947df848898531f6 (diff)
downloadunit-d67d350142d4ef9a9cdbfc2bb4a6b2d8f261deb1.tar.gz
unit-d67d350142d4ef9a9cdbfc2bb4a6b2d8f261deb1.tar.bz2
tests: Add tests for python application factories
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: <https://github.com/nginx/unit/pull/1336> [ Commit subject & message formatting tweaks - Andrew ] Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
Diffstat (limited to '')
-rw-r--r--test/test_python_factory.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/test/test_python_factory.py b/test/test_python_factory.py
new file mode 100644
index 00000000..d1752c24
--- /dev/null
+++ b/test/test_python_factory.py
@@ -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,
+ },
+ },
+ }
+ },
+ }
+ )