Projet

Général

Profil

0002-Add-tests-for-get_user_from_api_query_string.patch

Benjamin Dauvergne, 23 septembre 2014 12:01

Télécharger (6,89 ko)

Voir les différences:

Subject: [PATCH 2/2] Add tests for get_user_from_api_query_string()

 tests/test_api.py |  168 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 168 insertions(+)
 create mode 100644 tests/test_api.py
tests/test_api.py
1
import urlparse
2
import tempfile
3
import shutil
4
import json
5
import os
6
import hmac
7
import base64
8
import hashlib
9
import urllib
10
import datetime
11

  
12
from quixote import cleanup, get_publisher
13
from wcs import publisher
14
from qommon import sessions
15
from wcs.qommon.http_request import HTTPRequest
16
from wcs.users import User
17
from wcs.categories import Category
18

  
19
pub, req, app_dir, user = None, None, None, None
20

  
21
def setup_module(module):
22
    cleanup()
23

  
24
    global pub, req, app_dir, user
25
    APP_DIR = tempfile.mkdtemp() 
26
    publisher.WcsPublisher.APP_DIR = APP_DIR
27
    pub = publisher.WcsPublisher.create_publisher()
28
    # allow saving the user
29
    pub.app_dir = os.path.join(APP_DIR, 'example.net')
30
    os.mkdir(pub.app_dir)
31
    user = User()
32
    user.name = 'Jean Darmette'
33
    user.email = 'jean.darmette@triffouilis.fr'
34
    user.store()
35

  
36
    file(os.path.join(pub.app_dir, 'site-options.cfg'), 'w').write('''\
37
[api-secrets]
38
coucou = 1234
39
''')
40

  
41
    req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
42
    req._user = None
43
    req.language = 'en'
44
    pub._set_request(req)
45
    req.session = sessions.Session(id=1)
46
    category = Category()
47
    category.name = 'category'
48
    category.store()
49

  
50

  
51
def visit_page(url, body=None):
52
    global req
53

  
54
    parsed = urlparse.urlparse(url)
55
    environ = {}
56
    environ['SCRIPT_NAME'] = '/'
57
    environ['SERVER_NAME'] = 'example.net'
58
    environ['PATH_INFO'] = parsed.path
59
    if parsed.query:
60
        environ['QUERY_STRING'] = parsed.query
61
    req = HTTPRequest(body, environ)
62
    return get_publisher().process_request(req)
63

  
64
def teardown_module(module):
65
    global pub
66
    shutil.rmtree(pub.APP_DIR)
67

  
68
def test_user_page_redirect():
69
    output = visit_page('/user')
70
    assert output.headers.get('location') == 'http://example.net//myspace/'
71

  
72
def test_user_page_error_when_json_and_no_user():
73
    output = visit_page('/user?format=json')
74
    content = ''.join(output.generate_body_chunks())
75
    assert content == '???'
76

  
77
def test_get_user_from_api_query_string_error_missing_orig():
78
    output = visit_page('/user?format=json&signature=xxx')
79
    content = ''.join(output.generate_body_chunks())
80
    result = json.loads(content)
81
    assert result['err_desc'] == 'missing/multiple orig field'
82

  
83
def test_get_user_from_api_query_string_error_invalid_orig():
84
    output = visit_page('/user?format=json&orig=coin&signature=xxx')
85
    content = ''.join(output.generate_body_chunks())
86
    result = json.loads(content)
87
    assert result['err_desc'] == 'invalid orig'
88

  
89
def test_get_user_from_api_query_string_error_missing_algo():
90
    output = visit_page('/user?format=json&orig=coucou&signature=xxx')
91
    content = ''.join(output.generate_body_chunks())
92
    result = json.loads(content)
93
    assert result['err_desc'] == 'missing/multiple algo field'
94

  
95
def test_get_user_from_api_query_string_error_invalid_algo():
96
    output = visit_page('/user?format=json&orig=coucou&signature=xxx&algo=coin')
97
    content = ''.join(output.generate_body_chunks())
98
    result = json.loads(content)
99
    assert result['err_desc'] == 'invalid algo'
100

  
101
def test_get_user_from_api_query_string_error_invalid_signature():
102
    output = visit_page('/user?format=json&orig=coucou&signature=xxx&algo=sha1')
103
    content = ''.join(output.generate_body_chunks())
104
    result = json.loads(content)
105
    assert result['err_desc'] == 'invalid signature'
106

  
107
def test_get_user_from_api_query_string_error_missing_timestamp():
108
    signature = urllib.quote(
109
            base64.b64encode(
110
                hmac.new('1234',
111
                    'format=json&orig=coucou&algo=sha1', 
112
                    hashlib.sha1).digest()))
113
    output = visit_page('/user?format=json&orig=coucou&algo=sha1&signature=%s' % signature)
114
    content = ''.join(output.generate_body_chunks())
115
    result = json.loads(content)
116
    assert result['err_desc'] == 'missing/multiple timestamp field'
117

  
118
def test_get_user_from_api_query_string_error_missing_email():
119
    timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z'
120
    query = 'format=json&orig=coucou&algo=sha1&timestamp=' + timestamp
121
    signature = urllib.quote(
122
            base64.b64encode(
123
                hmac.new('1234',
124
                    query, 
125
                    hashlib.sha1).digest()))
126
    output = visit_page('/user?%s&signature=%s' % (query, signature))
127
    content = ''.join(output.generate_body_chunks())
128
    result = json.loads(content)
129
    assert result['err_desc'] == 'missing email or NameID fields'
130

  
131
def test_get_user_from_api_query_string_error_success_sha1():
132
    timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z'
133
    query = 'format=json&orig=coucou&algo=sha1&email=' + urllib.quote(user.email) + '&timestamp=' + timestamp
134
    signature = urllib.quote(
135
            base64.b64encode(
136
                hmac.new('1234',
137
                    query, 
138
                    hashlib.sha1).digest()))
139
    output = visit_page('/user?%s&signature=%s' % (query, signature))
140
    content = ''.join(output.generate_body_chunks())
141
    result = json.loads(content)
142
    assert result['user_display_name'] == u'Jean Darmette'
143

  
144
def test_get_user_from_api_query_string_error_invalid_signature_algo_mismatch():
145
    timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z'
146
    query = 'format=json&orig=coucou&algo=sha256&email=' + urllib.quote(user.email) + '&timestamp=' + timestamp
147
    signature = urllib.quote(
148
            base64.b64encode(
149
                hmac.new('1234',
150
                    query, 
151
                    hashlib.sha1).digest()))
152
    output = visit_page('/user?%s&signature=%s' % (query, signature))
153
    content = ''.join(output.generate_body_chunks())
154
    result = json.loads(content)
155
    assert result['err_desc'] == 'invalid signature'
156

  
157
def test_get_user_from_api_query_string_error_success_sha256():
158
    timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z'
159
    query = 'format=json&orig=coucou&algo=sha256&email=' + urllib.quote(user.email) + '&timestamp=' + timestamp
160
    signature = urllib.quote(
161
            base64.b64encode(
162
                hmac.new('1234',
163
                    query, 
164
                    hashlib.sha256).digest()))
165
    output = visit_page('/user?%s&signature=%s' % (query, signature))
166
    content = ''.join(output.generate_body_chunks())
167
    result = json.loads(content)
168
    assert result['user_display_name'] == u'Jean Darmette'
0
-