From 169c6909341e096b4a1b8bbbfac86784a5305b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 3 Nov 2015 13:48:35 +0100 Subject: [PATCH 1/2] tests: run API tests with both pickle and SQL storages --- tests/test_api.py | 93 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 73fb5f5..0aeeee7 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -10,6 +10,7 @@ import datetime import time from quixote import cleanup, get_publisher +from wcs.qommon.http_request import HTTPRequest from wcs.qommon.form import PicklableUpload from wcs.users import User from wcs.roles import Role @@ -19,16 +20,19 @@ from wcs.data_sources import NamedDataSource from wcs import fields from wcs.api import sign_url -from utilities import get_app, create_temporary_pub +from utilities import get_app, create_temporary_pub, clean_temporary_pub -pub, req, app_dir = None, None, None +def pytest_generate_tests(metafunc): + if 'pub' in metafunc.fixturenames: + metafunc.parametrize('pub', ['pickle', 'sql'], indirect=True) +@pytest.fixture +def pub(request): + pub = create_temporary_pub(sql_mode=(request.param == 'sql')) -def setup_module(module): - cleanup() - - global pub, req, app_dir - pub = create_temporary_pub() + req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'}) + pub.set_app_dir(req) + pub.cfg['identification'] = {'methods': ['password']} pub.cfg['language'] = {'language': 'en'} pub.write_cfg() @@ -37,15 +41,16 @@ def setup_module(module): coucou = 1234 ''') + return pub + def teardown_module(module): - global pub - shutil.rmtree(pub.APP_DIR) + clean_temporary_pub() @pytest.fixture def local_user(): - User.wipe() - user = User() + get_publisher().user_class.wipe() + user = get_publisher().user_class() user.name = 'Jean Darmette' user.email = 'jean.darmette@triffouilis.fr' user.store() @@ -66,35 +71,35 @@ def sign_uri(uri, user=None): hashlib.sha256).digest())) return urlparse.urlunparse((scheme, netloc, path, params, query, fragment)) -def test_user_page_redirect(): +def test_user_page_redirect(pub): output = get_app(pub).get('/user') assert output.headers.get('location') == 'http://example.net/myspace/' -def test_user_page_error_when_json_and_no_user(): +def test_user_page_error_when_json_and_no_user(pub): output = get_app(pub).get('/api/user/?format=json', status=403) assert output.json['err_desc'] == 'no user specified' -def test_get_user_from_api_query_string_error_missing_orig(): +def test_get_user_from_api_query_string_error_missing_orig(pub): output = get_app(pub).get('/api/user/?format=json&signature=xxx', status=403) assert output.json['err_desc'] == 'missing/multiple orig field' -def test_get_user_from_api_query_string_error_invalid_orig(): +def test_get_user_from_api_query_string_error_invalid_orig(pub): output = get_app(pub).get('/api/user/?format=json&orig=coin&signature=xxx', status=403) assert output.json['err_desc'] == 'invalid orig' -def test_get_user_from_api_query_string_error_missing_algo(): +def test_get_user_from_api_query_string_error_missing_algo(pub): output = get_app(pub).get('/api/user/?format=json&orig=coucou&signature=xxx', status=403) assert output.json['err_desc'] == 'missing/multiple algo field' -def test_get_user_from_api_query_string_error_invalid_algo(): +def test_get_user_from_api_query_string_error_invalid_algo(pub): output = get_app(pub).get('/api/user/?format=json&orig=coucou&signature=xxx&algo=coin', status=403) assert output.json['err_desc'] == 'invalid algo' -def test_get_user_from_api_query_string_error_invalid_signature(): +def test_get_user_from_api_query_string_error_invalid_signature(pub): output = get_app(pub).get('/api/user/?format=json&orig=coucou&signature=xxx&algo=sha1', status=403) assert output.json['err_desc'] == 'invalid signature' -def test_get_user_from_api_query_string_error_missing_timestamp(): +def test_get_user_from_api_query_string_error_missing_timestamp(pub): signature = urllib.quote( base64.b64encode( hmac.new('1234', @@ -103,7 +108,7 @@ def test_get_user_from_api_query_string_error_missing_timestamp(): output = get_app(pub).get('/api/user/?format=json&orig=coucou&algo=sha1&signature=%s' % signature, status=403) assert output.json['err_desc'] == 'missing/multiple timestamp field' -def test_get_user_from_api_query_string_error_missing_email(): +def test_get_user_from_api_query_string_error_missing_email(pub): timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' query = 'format=json&orig=coucou&algo=sha1×tamp=' + timestamp signature = urllib.quote( @@ -114,7 +119,7 @@ def test_get_user_from_api_query_string_error_missing_email(): output = get_app(pub).get('/api/user/?%s&signature=%s' % (query, signature), status=403) assert output.json['err_desc'] == 'no user specified' -def test_get_user_from_api_query_string_error_unknown_nameid(): +def test_get_user_from_api_query_string_error_unknown_nameid(pub): timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' query = 'format=json&orig=coucou&algo=sha1&NameID=xxx×tamp=' + timestamp signature = urllib.quote( @@ -125,7 +130,7 @@ def test_get_user_from_api_query_string_error_unknown_nameid(): output = get_app(pub).get('/api/user/?%s&signature=%s' % (query, signature), status=403) assert output.json['err_desc'] == 'unknown NameID' -def test_get_user_from_api_query_string_error_missing_email_valid_endpoint(): +def test_get_user_from_api_query_string_error_missing_email_valid_endpoint(pub): # check it's ok to sign an URL without specifiying an user if the endpoint # works fine without user. timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' @@ -140,7 +145,7 @@ def test_get_user_from_api_query_string_error_missing_email_valid_endpoint(): output = get_app(pub).get('/json?%s&signature=%s' % (query, signature)) assert output.json == [] -def test_get_user_from_api_query_string_error_unknown_nameid_valid_endpoint(): +def test_get_user_from_api_query_string_error_unknown_nameid_valid_endpoint(pub): # check the categories and forms endpoints accept an unknown NameID timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' query = 'format=json&NameID=xxx&orig=coucou&algo=sha1×tamp=' + timestamp @@ -154,7 +159,7 @@ def test_get_user_from_api_query_string_error_unknown_nameid_valid_endpoint(): output = get_app(pub).get('/json?%s&signature=%s' % (query, signature)) assert output.json == [] -def test_get_user_from_api_query_string_error_success_sha1(local_user): +def test_get_user_from_api_query_string_error_success_sha1(pub, local_user): timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' query = 'format=json&orig=coucou&algo=sha1&email=' + urllib.quote(local_user.email) + '×tamp=' + timestamp signature = urllib.quote( @@ -165,7 +170,7 @@ def test_get_user_from_api_query_string_error_success_sha1(local_user): output = get_app(pub).get('/api/user/?%s&signature=%s' % (query, signature)) assert output.json['user_display_name'] == u'Jean Darmette' -def test_get_user_from_api_query_string_error_invalid_signature_algo_mismatch(local_user): +def test_get_user_from_api_query_string_error_invalid_signature_algo_mismatch(pub, local_user): timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' query = 'format=json&orig=coucou&algo=sha256&email=' + urllib.quote(local_user.email) + '×tamp=' + timestamp signature = urllib.quote( @@ -176,7 +181,7 @@ def test_get_user_from_api_query_string_error_invalid_signature_algo_mismatch(lo output = get_app(pub).get('/api/user/?%s&signature=%s' % (query, signature), status=403) assert output.json['err_desc'] == 'invalid signature' -def test_get_user_from_api_query_string_error_success_sha256(local_user): +def test_get_user_from_api_query_string_error_success_sha256(pub, local_user): timestamp = datetime.datetime.utcnow().isoformat()[:19] + 'Z' query = 'format=json&orig=coucou&algo=sha256&email=' + urllib.quote(local_user.email) + '×tamp=' + timestamp signature = urllib.quote( @@ -187,7 +192,7 @@ def test_get_user_from_api_query_string_error_success_sha256(local_user): output = get_app(pub).get('/api/user/?%s&signature=%s' % (query, signature)) assert output.json['user_display_name'] == u'Jean Darmette' -def test_sign_url(local_user): +def test_sign_url(pub, local_user): signed_url = sign_url( 'http://example.net/api/user/?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234' @@ -203,7 +208,7 @@ def test_sign_url(local_user): url = signed_url[len('http://example.net'):] output = get_app(pub).get(url, status=403) -def test_get_user(local_user): +def test_get_user(pub, local_user): Role.wipe() role = Role(name='Foo bar') role.store() @@ -219,7 +224,7 @@ def test_get_user(local_user): assert [x['name'] for x in output.json['user_roles']] == ['Foo bar'] assert [x['slug'] for x in output.json['user_roles']] == ['foo-bar'] -def test_get_user_compat_endpoint(local_user): +def test_get_user_compat_endpoint(pub, local_user): signed_url = sign_url( 'http://example.net/user?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234' @@ -228,7 +233,7 @@ def test_get_user_compat_endpoint(local_user): output = get_app(pub).get(url) assert output.json['user_display_name'] == u'Jean Darmette' -def test_formdef_list(): +def test_formdef_list(pub): Role.wipe() role = Role(name='Foo bar') role.id = '14' @@ -258,7 +263,7 @@ def test_formdef_list(): assert resp1.json[0]['functions']['_receiver']['role']['slug'] == role.slug assert resp1.json[0]['functions']['_receiver']['role']['name'] == role.name -def test_formdef_list_redirection(): +def test_formdef_list_redirection(pub): FormDef.wipe() formdef = FormDef() formdef.name = 'test' @@ -273,7 +278,7 @@ def test_formdef_list_redirection(): assert resp1.json[0]['count'] == 0 assert resp1.json[0]['redirection'] == True -def test_formdef_schema(): +def test_formdef_schema(pub): FormDef.wipe() formdef = FormDef() formdef.name = 'test' @@ -287,7 +292,7 @@ def test_formdef_schema(): assert resp.json['fields'][0]['label'] == 'foobar' assert resp.json['fields'][0]['type'] == 'string' -def test_formdef_submit(local_user): +def test_formdef_submit(pub, local_user): Role.wipe() role = Role(name='test') role.store() @@ -311,7 +316,7 @@ def test_formdef_submit(local_user): resp = get_app(pub).post_json(url, {'data': {}}) assert resp.json['err'] == 0 assert data_class.get(resp.json['data']['id']).status == 'wf-new' - assert data_class.get(resp.json['data']['id']).user_id == local_user.id + assert data_class.get(resp.json['data']['id']).user_id == str(local_user.id) assert data_class.get(resp.json['data']['id']).tracking_code is None formdef.disabled = True @@ -350,7 +355,7 @@ def test_formdef_submit(local_user): data_class.wipe() -def test_categories(): +def test_categories(pub): FormDef.wipe() Category.wipe() category = Category() @@ -364,6 +369,7 @@ def test_categories(): formdef = FormDef() formdef.name = 'test' formdef.category_id = category.id + formdef.fields = [] formdef.store() resp = get_app(pub).get('/api/categories/') @@ -373,12 +379,13 @@ def test_categories(): assert resp.json['data'][0]['url'] == 'http://example.net/category/' assert resp.json['data'][0]['description'] == 'hello world' -def test_categories_formdefs(): - test_categories() +def test_categories_formdefs(pub): + test_categories(pub) formdef2 = FormDef() formdef2.name = 'other test' formdef2.category_id = None + formdef2.fields = [] formdef2.store() resp = get_app(pub).get('/api/categories/category/formdefs/') @@ -391,7 +398,7 @@ def test_categories_formdefs(): assert resp.json[0]['redirection'] == False -def test_formdata(local_user): +def test_formdata(pub, local_user): NamedDataSource.wipe() data_source = NamedDataSource(name='foobar') data_source.data_source = {'type': 'formula', @@ -463,7 +470,7 @@ def test_formdata(local_user): assert resp.json['fields']['item_raw'] == '1' assert resp.json['fields']['item_structured'] == {'id': '1', 'text': 'foo', 'more': 'XXX'} -def test_user_forms(local_user): +def test_user_forms(pub, local_user): FormDef.wipe() formdef = FormDef() formdef.name = 'test' @@ -492,7 +499,7 @@ def test_user_forms(local_user): resp = get_app(pub).get(sign_uri('/api/user/forms?full=on', user=local_user)) assert resp.json[0]['fields']['foobar'] == 'foo@localhost' -def test_user_drafts(local_user): +def test_user_drafts(pub, local_user): FormDef.wipe() formdef = FormDef() formdef.name = 'test' @@ -526,7 +533,7 @@ def test_user_drafts(local_user): assert resp.json[0]['fields']['foobar'] == 'foo@localhost' assert 'file' not in resp.json[0]['fields'] # no file export in full lists -def test_api_list_formdata(local_user): +def test_api_list_formdata(pub, local_user): Role.wipe() role = Role(name='test') role.store() @@ -605,7 +612,7 @@ def test_api_list_formdata(local_user): resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter=all', user=local_user)) assert len(resp.json) == 30 -def test_roles(local_user): +def test_roles(pub, local_user): Role.wipe() role = Role(name='Hello World') role.emails = ['toto@example.com', 'zozo@example.com'] @@ -629,7 +636,7 @@ def test_roles(local_user): assert resp.json['data'][0]['emails_to_members'] == False assert resp.json['data'][0]['details'] == 'kouign amann' -def test_users(local_user): +def test_users(pub, local_user): resp = get_app(pub).get('/api/users/', status=403) resp = get_app(pub).get(sign_uri('/api/users/')) -- 2.6.2