Skip to content

Commit 8d2b0a3

Browse files
author
Erik Allik
committed
Added tests for contrib.http
1 parent 455e7ae commit 8d2b0a3

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

spinoff/contrib/http/tests.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import random
2+
import tempfile
3+
4+
import requests
5+
from gevent.event import AsyncResult
6+
from gevent.monkey import patch_all
7+
from nose.tools import eq_
8+
9+
from spinoff.actor import Node, Actor
10+
from spinoff.util.python import deferred_cleanup
11+
from spinoff.contrib.http.server import HttpServer
12+
13+
14+
patch_all() # to make python-requests cooperative
15+
16+
17+
@deferred_cleanup
18+
def test_basic(defer):
19+
node = Node()
20+
defer(node.stop)
21+
22+
responders = []
23+
http_server = node.spawn(HttpServer.using(address=('localhost', 0), responders=responders))
24+
_, port = actor_exec(node, lambda: http_server.ask('get-addr'))
25+
26+
eq_(404, requests.get('http://localhost:%d' % (port,)).status_code)
27+
28+
rnd_response = str(random.random())
29+
responders[:] = [
30+
(r'^/$', make_responder(lambda request: request.write(rnd_response))),
31+
]
32+
eq_(200, requests.get('http://localhost:%d' % (port,)).status_code)
33+
34+
35+
@deferred_cleanup
36+
def test_urlmatch_with_extra_args_to_responder(defer):
37+
node = Node()
38+
defer(node.stop)
39+
40+
responder = make_responder(lambda req, extra: req.write(str(extra)))
41+
rnd_data = bytes(random.random())
42+
responders = [(r'', responder.using(extra=rnd_data))]
43+
http_server = node.spawn(HttpServer.using(address=('localhost', 0), responders=responders))
44+
_, port = actor_exec(node, lambda: http_server.ask('get-addr'))
45+
46+
eq_(rnd_data, requests.get('http://localhost:%d' % (port,)).text)
47+
48+
49+
@deferred_cleanup
50+
def test_file_upload(defer):
51+
node = Node()
52+
defer(node.stop)
53+
54+
def handle_file(request):
55+
request.write(request.files['file'].read())
56+
57+
responders = [(r'^/handle-file$', make_responder(handle_file))]
58+
http_server = node.spawn(HttpServer.using(address=('localhost', 0), responders=responders))
59+
_, port = actor_exec(node, lambda: http_server.ask('get-addr'))
60+
61+
rnd_data = bytes(random.random())
62+
with tempfile.NamedTemporaryFile() as f:
63+
f.write(rnd_data)
64+
f.flush()
65+
req = requests.post('http://localhost:%d/handle-file' % (port,), files={'file': open(f.name, 'rb')})
66+
eq_(200, req.status_code)
67+
eq_(rnd_data, req.text)
68+
69+
70+
def make_responder(fn):
71+
fn.__name__ = 'run'
72+
73+
class Responder(Actor):
74+
def run(self, *args, **kwargs):
75+
return fn(*args, **kwargs)
76+
return Responder
77+
78+
79+
def actor_exec(node, fn, *args, **kwargs):
80+
ret = AsyncResult()
81+
82+
class ExecActor(Actor):
83+
def run(self):
84+
ret.set(fn(*args, **kwargs))
85+
86+
node.spawn(ExecActor)
87+
88+
return ret.get()

0 commit comments

Comments
 (0)