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