197 lines
6.8 KiB
Python
197 lines
6.8 KiB
Python
import json
|
|
|
|
import pytest
|
|
|
|
import requests
|
|
import pathlib2
|
|
import mock
|
|
|
|
import utils
|
|
|
|
|
|
def test_wcs_fixture(wcs, postgres_db, tmpdir, olap_cmd, caplog):
|
|
olap_cmd()
|
|
|
|
expected_schema = [
|
|
('agent', 'id'),
|
|
('agent', 'label'),
|
|
('category', 'id'),
|
|
('category', 'label'),
|
|
('channel', 'id'),
|
|
('channel', 'label'),
|
|
('evolution', 'id'),
|
|
('evolution', 'generic_status_id'),
|
|
('evolution', 'formdata_id'),
|
|
('evolution', 'time'),
|
|
('evolution', 'date'),
|
|
('evolution', 'hour_id'),
|
|
('evolution_demande', 'id'),
|
|
('evolution_demande', 'status_id'),
|
|
('evolution_demande', 'formdata_id'),
|
|
('evolution_demande', 'time'),
|
|
('evolution_demande', 'date'),
|
|
('evolution_demande', 'hour_id'),
|
|
('formdata', 'id'),
|
|
('formdata', 'formdef_id'),
|
|
('formdata', 'receipt_time'),
|
|
('formdata', 'hour_id'),
|
|
('formdata', 'channel_id'),
|
|
('formdata', 'backoffice'),
|
|
('formdata', 'generic_status_id'),
|
|
('formdata', 'endpoint_delay'),
|
|
('formdata', 'first_agent_id'),
|
|
('formdata', 'geolocation_base'),
|
|
('formdata', 'json_data'),
|
|
('formdata_demande', 'id'),
|
|
('formdata_demande', 'formdef_id'),
|
|
('formdata_demande', 'receipt_time'),
|
|
('formdata_demande', 'hour_id'),
|
|
('formdata_demande', 'channel_id'),
|
|
('formdata_demande', 'backoffice'),
|
|
('formdata_demande', 'generic_status_id'),
|
|
('formdata_demande', 'endpoint_delay'),
|
|
('formdata_demande', 'first_agent_id'),
|
|
('formdata_demande', 'geolocation_base'),
|
|
('formdata_demande', 'json_data'),
|
|
('formdata_demande', 'status_id'),
|
|
('formdata_demande', 'field_string'),
|
|
('formdata_demande', 'field_item'),
|
|
('formdata_demande', 'field_bool'),
|
|
('formdata_demande', 'field_item_open'),
|
|
('formdata_demande', 'function__receiver'),
|
|
('formdata_demande_field_item', 'id'),
|
|
('formdata_demande_field_item', 'label'),
|
|
('formdata_demande_field_item_open', 'id'),
|
|
('formdata_demande_field_item_open', 'label'),
|
|
('formdef', 'id'),
|
|
('formdef', 'category_id'),
|
|
('formdef', 'label'),
|
|
('hour', 'id'),
|
|
('hour', 'label'),
|
|
('role', 'id'),
|
|
('role', 'label'),
|
|
('status', 'id'),
|
|
('status', 'label'),
|
|
('status_demande', 'id'),
|
|
('status_demande', 'label')
|
|
]
|
|
|
|
# verify SQL schema
|
|
with postgres_db.conn() as conn:
|
|
with conn.cursor() as c:
|
|
c.execute('SELECT table_name, column_name '
|
|
'FROM information_schema.columns '
|
|
'WHERE table_schema = \'olap\' ORDER BY table_name, ordinal_position')
|
|
|
|
assert list(c.fetchall()) == expected_schema
|
|
|
|
# verify JSON schema
|
|
with (olap_cmd.model_dir / 'olap.model').open() as fd, \
|
|
(pathlib2.Path(__file__).parent / 'olap.model').open() as fd2:
|
|
json_schema = json.load(fd)
|
|
expected_json_schema = json.load(fd2)
|
|
expected_json_schema['pg_dsn'] = postgres_db.dsn
|
|
assert json_schema == expected_json_schema
|
|
|
|
|
|
def test_requests_exception(wcs, postgres_db, tmpdir, olap_cmd, caplog):
|
|
with mock.patch('requests.get', side_effect=requests.RequestException('wat!')):
|
|
with pytest.raises(SystemExit):
|
|
olap_cmd(no_log_errors=False)
|
|
assert 'wat!' in caplog.text
|
|
|
|
|
|
def test_requests_not_ok(wcs, postgres_db, tmpdir, olap_cmd, caplog):
|
|
with mock.patch('requests.get') as mocked_get:
|
|
mocked_get.return_value.ok = False
|
|
mocked_get.return_value.status_code = 401
|
|
mocked_get.return_value.text = '{"err": 1, "err_desc": "invalid signature"}'
|
|
with pytest.raises(SystemExit):
|
|
olap_cmd(no_log_errors=False)
|
|
assert 'invalid signature' in caplog.text
|
|
|
|
|
|
def test_requests_not_json(wcs, postgres_db, tmpdir, olap_cmd, caplog):
|
|
with mock.patch('requests.get') as mocked_get:
|
|
mocked_get.return_value.ok = True
|
|
mocked_get.return_value.json.side_effect = ValueError('invalid JSON')
|
|
with pytest.raises(SystemExit):
|
|
olap_cmd(no_log_errors=False)
|
|
assert 'Invalid JSON content' in caplog.text
|
|
|
|
|
|
def test_dimension_stability(wcs, wcs_dir, postgres_db, tmpdir, olap_cmd, caplog):
|
|
|
|
olap_cmd()
|
|
|
|
with postgres_db.conn() as conn:
|
|
with conn.cursor() as c:
|
|
c.execute('SET search_path TO \'olap\'')
|
|
c.execute('SELECT * FROM formdata_demande_field_item ORDER BY id')
|
|
refs = c.fetchall()
|
|
assert len(refs) == 3
|
|
c.execute('SELECT * FROM formdata_demande_field_item_open ORDER BY id')
|
|
open_refs = c.fetchall()
|
|
assert len(open_refs) == 3
|
|
|
|
# Change an item of the field
|
|
script = u"""
|
|
import datetime
|
|
import random
|
|
from quixote import get_publisher
|
|
from wcs.formdef import FormDef
|
|
formdef = FormDef.get_by_urlname('demande')
|
|
|
|
for field in formdef.fields:
|
|
if field.label == '2nd field':
|
|
ref_field = field
|
|
break
|
|
|
|
ref_field.items = ['foo', 'bar', 'bazouka']
|
|
formdef.store()
|
|
|
|
user = get_publisher().user_class.select()[0]
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
formdata.receipt_time = datetime.datetime(2018, random.randrange(1, 13), random.randrange(1, 29)).timetuple()
|
|
formdata.data = {'1': 'FOO BAR 1'}
|
|
formdata.data['2'] = 'bazouka'
|
|
formdata.data['2_display'] = 'bazouka'
|
|
formdata.data['4'] = 'open_new_value'
|
|
formdata.data['4_display'] = 'open_new_value'
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
"""
|
|
utils.run_wcs_script(wcs_dir, script, 'toto')
|
|
olap_cmd()
|
|
|
|
# We expect to find in the new dimension table
|
|
# the same records as before (including the one of the item that disappeared)
|
|
# plus the new item
|
|
with postgres_db.conn() as conn:
|
|
with conn.cursor() as c:
|
|
|
|
c.execute('SET search_path TO \'olap\'')
|
|
c.execute('SELECT * FROM formdata_demande_field_item ORDER BY id')
|
|
new_refs = c.fetchall()
|
|
assert len(new_refs) == 4
|
|
for ref in refs:
|
|
assert ref in new_refs
|
|
assert new_refs[-1][1] == 'bazouka'
|
|
bazouka_id = new_refs[-1][0]
|
|
|
|
c.execute('SELECT * FROM formdata_demande_field_item_open ORDER BY id')
|
|
new_open_refs = c.fetchall()
|
|
assert len(new_open_refs) == 4
|
|
for ref in open_refs:
|
|
assert ref in new_open_refs
|
|
assert new_open_refs[-1][1] == 'open_new_value'
|
|
open_new_id = new_open_refs[-1][0]
|
|
|
|
c.execute('''SELECT field_item, field_item_open
|
|
FROM formdata_demande ORDER BY id''')
|
|
formdata = c.fetchone()
|
|
assert formdata[0] == bazouka_id
|
|
assert formdata[1] == open_new_id
|