1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# (c) 2007 Philip Jenvey; written for Paste (http://pythonpaste.org)
2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom nose.tools import assert_raises
4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom paste.config import CONFIG, ConfigMiddleware
5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom paste.fixture import TestApp
6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport six
7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craiktest_key = 'test key'
9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef reset_config():
11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    while True:
12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        try:
13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            CONFIG._pop_object()
14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        except IndexError:
15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            break
16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef app_with_config(environ, start_response):
18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    start_response('200 OK', [('Content-type','text/plain')])
19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    lines = ['Variable is: %s\n' % CONFIG[test_key],
20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            'Variable is (in environ): %s' % environ['paste.config'][test_key]]
21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if six.PY3:
22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        lines = [line.encode('utf8') for line in lines]
23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    return lines
24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass NestingAppWithConfig(object):
26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def __init__(self, app):
27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.app = app
28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def __call__(self, environ, start_response):
30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        response = self.app(environ, start_response)
31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert isinstance(response, list)
32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        supplement = ['Nesting variable is: %s' % CONFIG[test_key],
33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                      'Nesting variable is (in environ): %s' % \
34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                          environ['paste.config'][test_key]]
35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        if six.PY3:
36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            supplement = [line.encode('utf8') for line in supplement]
37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        response.extend(supplement)
38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        return response
39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef test_request_config():
41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        config = {test_key: 'test value'}
43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = ConfigMiddleware(app_with_config, config)
44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        res = TestApp(app).get('/')
45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert 'Variable is: test value' in res
46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert 'Variable is (in environ): test value' in res
47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        reset_config()
49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef test_request_config_multi():
51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        config = {test_key: 'test value'}
53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = ConfigMiddleware(app_with_config, config)
54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        config = {test_key: 'nesting value'}
55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = ConfigMiddleware(NestingAppWithConfig(app), config)
56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        res = TestApp(app).get('/')
57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert 'Variable is: test value' in res
58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert 'Variable is (in environ): test value' in res
59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert 'Nesting variable is: nesting value' in res
60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        print(res)
61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert 'Nesting variable is (in environ): nesting value' in res
62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        reset_config()
64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef test_process_config(request_app=test_request_config):
66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        process_config = {test_key: 'bar', 'process_var': 'foo'}
68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        CONFIG.push_process_config(process_config)
69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert CONFIG[test_key] == 'bar'
71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert CONFIG['process_var'] == 'foo'
72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        request_app()
74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert CONFIG[test_key] == 'bar'
76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert CONFIG['process_var'] == 'foo'
77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        CONFIG.pop_process_config()
78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert_raises(AttributeError, lambda: 'process_var' not in CONFIG)
80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        assert_raises(IndexError, CONFIG.pop_process_config)
81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        reset_config()
83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef test_process_config_multi():
85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    test_process_config(test_request_config_multi)
86