bijoe/tests/utils.py

82 lines
2.3 KiB
Python

import io
import xml.etree.ElementTree as ET
import zipfile
from django.conf import settings
def login(app, user, path=None, password=None):
if path:
login_page = app.get(path)
else:
login_page = app.get(settings.LOGIN_URL)
login_page = login_page.maybe_follow()
form = login_page.form
form.set('username', user.username if hasattr(user, 'username') else user)
# password is supposed to be the same as username
form.set('password', password or user.username)
response = form.submit(name='login-password-submit').follow(expect_errors=True)
if path:
assert response.request.path == path
assert '_auth_user_id' in app.session
assert str(app.session['_auth_user_id']) == str(user.id)
return response
def get_table(response):
table = []
for tr in response.pyquery('table tr'):
row = []
table.append(row)
for td in tr.findall('td'):
row.append((td.text or '').strip())
return table
def xml_node_text_content(node):
"""Extract text content from node and all its children. Equivalent to
xmlNodeGetContent from libxml."""
if node is None:
return ''
def helper(node):
s = []
if node.text:
s.append(node.text)
for child in node:
s.extend(helper(child))
if child.tail:
s.append(child.tail)
return s
return ''.join(helper(node))
def get_ods_document(response):
return ET.fromstring(zipfile.ZipFile(io.BytesIO(response.content)).read('content.xml'))
def get_ods_table(response):
from bijoe.visualization.ods import TABLE_NS
root = get_ods_document(response)
table = []
for row_node in root.findall('.//{%s}table-row' % TABLE_NS):
row = []
table.append(row)
for cell_node in row_node.findall('.//{%s}table-cell' % TABLE_NS):
row.append(xml_node_text_content(cell_node))
return table
def request_select2(app, response, field_id, term='', page=None):
field = response.pyquery('#id_%s' % field_id)[0]
select2_url = field.attrib['data-ajax--url']
select2_field_id = field.attrib['data-field_id']
params = {'field_id': select2_field_id, 'term': term}
if page:
params['page'] = page
return app.get(select2_url, params=params).json