from pathlib import Path import pytest from unit.applications.lang.python import ApplicationPython from unit.applications.proto import ApplicationProto from unit.option import option client = ApplicationProto() client_python = ApplicationPython() @pytest.fixture(autouse=True) def setup_method_fixture(temp_dir): path = Path(f'{temp_dir}/index.html') path.write_text('0123456789', encoding='utf-8') assert 'success' in client.conf( { "listeners": { "*:8080": {"pass": "routes"}, }, "routes": [ { "action": { "share": str(path), "response_headers": { "X-Foo": "foo", }, } } ], } ) def action_update(conf): assert 'success' in client.conf(conf, 'routes/0/action') def test_response_headers(temp_dir): resp = client.get() assert resp['status'] == 200, 'status 200' assert resp['headers']['X-Foo'] == 'foo', 'header 200' assert 'success' in client.conf(f'"{temp_dir}"', 'routes/0/action/share') resp = client.get() assert resp['status'] == 301, 'status 301' assert resp['headers']['X-Foo'] == 'foo', 'header 301' assert 'success' in client.conf('"/blah"', 'routes/0/action/share') resp = client.get() assert resp['status'] == 404, 'status 404' assert 'X-Foo' not in client.get()['headers'], 'header 404' def test_response_last_action(): assert 'success' in client.conf( { "listeners": { "*:8080": {"pass": "routes/first"}, }, "routes": { "first": [ { "action": { "pass": "routes/second", "response_headers": { "X-Foo": "foo", }, } } ], "second": [ { "action": {"return": 200}, } ], }, "applications": {}, } ) assert 'X-Foo' not in client.get()['headers'] def test_response_pass(require): require({'modules': {'python': 'any'}}) assert 'success' in client_python.conf( { "listeners": { "*:8080": {"pass": "routes"}, }, "routes": [ { "action": { "pass": "applications/empty", "response_headers": { "X-Foo": "foo", }, } }, ], "applications": { "empty": { "type": client_python.get_application_type(), "processes": {"spare": 0}, "path": f'{option.test_dir}/python/empty', "working_directory": f'{option.test_dir}/python/empty', "module": "wsgi", } }, } ) assert client.get()['headers']['X-Foo'] == 'foo' def test_response_fallback(): assert 'success' in client.conf( { "listeners": {"*:8080": {"pass": "routes"}}, "routes": [ { "action": { "share": "/blah", "fallback": { "return": 200, "response_headers": { "X-Foo": "foo", }, }, } } ], } ) assert client.get()['headers']['X-Foo'] == 'foo' def test_response_headers_var(): assert 'success' in client.conf( { "X-Foo": "$uri", }, 'routes/0/action/response_headers', ) assert client.get()['headers']['X-Foo'] == '/' def test_response_headers_remove(): assert 'success' in client.conf( {"etag": None}, 'routes/0/action/response_headers', ) assert 'ETag' not in client.get()['headers'] def test_response_headers_invalid(skip_alert): skip_alert(r'failed to apply new conf') def check_invalid(conf): assert 'error' in client.conf( conf, 'routes/0/action/response_headers', ) check_invalid({"X-Foo": "$u"})