1from paste.errordocument import forward
2from paste.fixture import *
3from paste.recursive import RecursiveMiddleware
4
5def simple_app(environ, start_response):
6    start_response("200 OK", [('Content-type', 'text/plain')])
7    return [b'requested page returned']
8
9def not_found_app(environ, start_response):
10    start_response("404 Not found", [('Content-type', 'text/plain')])
11    return [b'requested page returned']
12
13def test_ok():
14    app = TestApp(simple_app)
15    res = app.get('')
16    assert res.header('content-type') == 'text/plain'
17    assert res.full_status == '200 OK'
18    assert 'requested page returned' in res
19
20def error_docs_app(environ, start_response):
21    if environ['PATH_INFO'] == '/not_found':
22        start_response("404 Not found", [('Content-type', 'text/plain')])
23        return [b'Not found']
24    elif environ['PATH_INFO'] == '/error':
25        start_response("200 OK", [('Content-type', 'text/plain')])
26        return [b'Page not found']
27    else:
28        return simple_app(environ, start_response)
29
30def test_error_docs_app():
31    app = TestApp(error_docs_app)
32    res = app.get('')
33    assert res.header('content-type') == 'text/plain'
34    assert res.full_status == '200 OK'
35    assert 'requested page returned' in res
36    res = app.get('/error')
37    assert res.header('content-type') == 'text/plain'
38    assert res.full_status == '200 OK'
39    assert 'Page not found' in res
40    res = app.get('/not_found', status=404)
41    assert res.header('content-type') == 'text/plain'
42    assert res.full_status == '404 Not found'
43    assert 'Not found' in res
44
45def test_forward():
46    app = forward(error_docs_app, codes={404:'/error'})
47    app = TestApp(RecursiveMiddleware(app))
48    res = app.get('')
49    assert res.header('content-type') == 'text/plain'
50    assert res.full_status == '200 OK'
51    assert 'requested page returned' in res
52    res = app.get('/error')
53    assert res.header('content-type') == 'text/plain'
54    assert res.full_status == '200 OK'
55    assert 'Page not found' in res
56    res = app.get('/not_found', status=404)
57    assert res.header('content-type') == 'text/plain'
58    assert res.full_status == '404 Not found'
59    # Note changed response
60    assert 'Page not found' in res
61
62def auth_required_app(environ, start_response):
63    start_response('401 Unauthorized', [('content-type', 'text/plain'), ('www-authenticate', 'Basic realm="Foo"')])
64    return ['Sign in!']
65
66def auth_docs_app(environ, start_response):
67    if environ['PATH_INFO'] == '/auth':
68        return auth_required_app(environ, start_response)
69    elif environ['PATH_INFO'] == '/auth_doc':
70        start_response("200 OK", [('Content-type', 'text/html')])
71        return [b'<html>Login!</html>']
72    else:
73        return simple_app(environ, start_response)
74
75def test_auth_docs_app():
76    wsgi_app = forward(auth_docs_app, codes={401: '/auth_doc'})
77    app = TestApp(wsgi_app)
78    res = app.get('/auth_doc')
79    assert res.header('content-type') == 'text/html'
80    res = app.get('/auth', status=401)
81    assert res.header('content-type') == 'text/html'
82    assert res.header('www-authenticate') == 'Basic realm="Foo"'
83    assert res.body == b'<html>Login!</html>'
84
85def test_bad_error():
86    def app(environ, start_response):
87        start_response('404 Not Found', [('content-type', 'text/plain')])
88        return ['not found']
89    app = forward(app, {404: '/404.html'})
90    app = TestApp(app)
91    resp = app.get('/test', expect_errors=True)
92    print(resp)
93