1#!/usr/bin/env python
2
3import pytest
4
5
6from circuits.six import b, u
7from circuits.web import Controller
8
9
10from .helpers import urlencode, urlopen, HTTPError
11
12
13class Root(Controller):
14
15    def index(self):
16        return "Hello World!"
17
18    def test_args(self, *args, **kwargs):
19        return "{0}\n{1}".format(repr(args), repr(kwargs))
20
21    def test_default_args(self, a=None, b=None):
22        return "a={0}\nb={1}".format(a, b)
23
24    def test_redirect(self):
25        return self.redirect("/")
26
27    def test_forbidden(self):
28        return self.forbidden()
29
30    def test_notfound(self):
31        return self.notfound()
32
33    def test_failure(self):
34        raise Exception()
35
36
37def test_root(webapp):
38    f = urlopen(webapp.server.http.base)
39    s = f.read()
40    assert s == b"Hello World!"
41
42
43def test_404(webapp):
44    try:
45        urlopen("%s/foo" % webapp.server.http.base)
46    except HTTPError as e:
47        assert e.code == 404
48        assert e.msg == "Not Found"
49    else:
50        assert False
51
52
53def test_args(webapp):
54    args = ("1", "2", "3")
55    kwargs = {"1": "one", "2": "two", "3": "three"}
56    url = "%s/test_args/%s" % (webapp.server.http.base, "/".join(args))
57    data = urlencode(kwargs).encode('utf-8')
58    f = urlopen(url, data)
59    data = f.read().split(b"\n")
60    assert eval(data[0]) == args
61    assert eval(data[1]) == kwargs
62
63
64@pytest.mark.parametrize("data,expected", [
65    ((["1"], {}),           b("a=1\nb=None")),
66    ((["1", "2"], {}),      b("a=1\nb=2")),
67    ((["1"], {"b": "2"}),   b("a=1\nb=2")),
68])
69def test_default_args(webapp, data, expected):
70    args, kwargs = data
71    url = u("{0:s}/test_default_args/{1:s}".format(
72        webapp.server.http.base,
73        u("/").join(args)
74    ))
75    data = urlencode(kwargs).encode("utf-8")
76    f = urlopen(url, data)
77    assert f.read() == expected
78
79
80def test_redirect(webapp):
81    f = urlopen("%s/test_redirect" % webapp.server.http.base)
82    s = f.read()
83    assert s == b"Hello World!"
84
85
86def test_forbidden(webapp):
87    try:
88        urlopen("%s/test_forbidden" % webapp.server.http.base)
89    except HTTPError as e:
90        assert e.code == 403
91        assert e.msg == "Forbidden"
92    else:
93        assert False
94
95
96def test_notfound(webapp):
97    try:
98        urlopen("%s/test_notfound" % webapp.server.http.base)
99    except HTTPError as e:
100        assert e.code == 404
101        assert e.msg == "Not Found"
102    else:
103        assert False
104
105
106def test_failure(webapp):
107    try:
108        urlopen("%s/test_failure" % webapp.server.http.base)
109    except HTTPError as e:
110        assert e.code == 500
111    else:
112        assert False
113