1import pytest 2from packaging import version 3from unit.applications.lang.python import TestApplicationPython 4from unit.option import option 5 6 7class TestASGITargets(TestApplicationPython): 8 prerequisites = { 9 'modules': { 10 'python': lambda v: version.parse(v) >= version.parse('3.5') 11 } 12 } 13 load_module = 'asgi' 14 15 @pytest.fixture(autouse=True) 16 def setup_method_fixture(self): 17 assert 'success' in self.conf( 18 { 19 "listeners": {"*:7080": {"pass": "routes"}}, 20 "routes": [ 21 { 22 "match": {"uri": "/1"}, 23 "action": {"pass": "applications/targets/1"}, 24 }, 25 { 26 "match": {"uri": "/2"}, 27 "action": {"pass": "applications/targets/2"}, 28 }, 29 ], 30 "applications": { 31 "targets": { 32 "type": self.get_application_type(), 33 "processes": {"spare": 0}, 34 "working_directory": option.test_dir 35 + "/python/targets/", 36 "path": option.test_dir + '/python/targets/', 37 "protocol": "asgi", 38 "targets": { 39 "1": { 40 "module": "asgi", 41 "callable": "application_200", 42 }, 43 "2": { 44 "module": "asgi", 45 "callable": "application_201", 46 }, 47 }, 48 } 49 }, 50 } 51 ) 52 53 def conf_targets(self, targets): 54 assert 'success' in self.conf(targets, 'applications/targets/targets') 55 56 def test_asgi_targets(self): 57 assert self.get(url='/1')['status'] == 200 58 assert self.get(url='/2')['status'] == 201 59 60 def test_asgi_targets_legacy(self): 61 self.conf_targets( 62 { 63 "1": {"module": "asgi", "callable": "legacy_application_200"}, 64 "2": {"module": "asgi", "callable": "legacy_application_201"}, 65 } 66 ) 67 68 assert self.get(url='/1')['status'] == 200 69 assert self.get(url='/2')['status'] == 201 70 71 def test_asgi_targets_mix(self): 72 self.conf_targets( 73 { 74 "1": {"module": "asgi", "callable": "application_200"}, 75 "2": {"module": "asgi", "callable": "legacy_application_201"}, 76 } 77 ) 78 79 assert self.get(url='/1')['status'] == 200 80 assert self.get(url='/2')['status'] == 201 81 82 def test_asgi_targets_broken(self, skip_alert): 83 skip_alert(r'Python failed to get "blah" from module') 84 85 self.conf_targets( 86 { 87 "1": {"module": "asgi", "callable": "application_200"}, 88 "2": {"module": "asgi", "callable": "blah"}, 89 } 90 ) 91 92 assert self.get(url='/1')['status'] != 200 93