51 lines
2.5 KiB
Python
51 lines
2.5 KiB
Python
import pytest
|
|
from parser_lab.repository import Repository, Conflict, NotFound
|
|
from parser_lab.views import default_view, validate_view, project_record
|
|
from parser_lab.query import select_records
|
|
|
|
def make_draft(repo):
|
|
d = repo.create('Study', b'[]', 'source.json', [{'name':'Ann','secret':'hidden'}, {'name':'Bob'}])
|
|
d['views'] = {'table': default_view('table', ['/name'])}
|
|
return repo.save(d, d['revision'])
|
|
|
|
def test_versions_and_conflicts(tmp_path):
|
|
repo = Repository(tmp_path)
|
|
d = make_draft(repo)
|
|
p = repo.publish(d['id'], d['revision'])
|
|
old = repo.get(d['id'])
|
|
d['title'] = 'New title'
|
|
d['records'][0]['name'] = 'Changed'
|
|
d = repo.save(d, d['revision'])
|
|
with pytest.raises(Conflict): repo.save(old, old['revision'])
|
|
assert repo.publication(p['slug'],1)['records'][0]['name'] == 'Ann'
|
|
assert repo.publish(d['id'],d['revision'])['version'] == 2
|
|
assert Repository(tmp_path).get(d['id'])['title'] == 'New title'
|
|
repo.unpublish(p['slug'],1)
|
|
with pytest.raises(NotFound): repo.publication(p['slug'],1)
|
|
|
|
def test_view_projection_and_pagination():
|
|
view = default_view('table',['/name'])
|
|
rows = [{'name':str(i), 'secret':'hidden'} for i in range(51)]
|
|
assert validate_view(view,rows) == []
|
|
p = select_records(rows,view,3)
|
|
assert p['items'][0]['id'] == '51'
|
|
assert p['total'] == 51 and not p['has_next']
|
|
assert 'hidden' not in str(project_record(rows[0],view,'1'))
|
|
with pytest.raises(ValueError): select_records(rows,view,0)
|
|
with pytest.raises(NotFound): select_records(rows,view,4)
|
|
|
|
def test_value_states_and_questionnaires():
|
|
view = default_view('table',['/x'])
|
|
got = [project_record(r,view,'1')['fields'][0] for r in [{},{'x':None},{'x':False},{'x':0},{'x':''}]]
|
|
assert [v['state'] for v in got] == ['missing','null','value','value','value']
|
|
assert [v['text'] for v in got] == ['Нет значения','null','false','0','']
|
|
assert [v['type'] for v in got] == ['missing','null','boolean','number','string']
|
|
q = default_view('questionnaire',['/answers'])
|
|
q.update(questionnaire_mode='pairs',questions_pointer='/answers',question_pointer='/q',answer_pointer='/a')
|
|
assert project_record({'answers':[{'q':'Sleep?','a':7}]},q,'1')['fields'][0]['text'] == '7'
|
|
|
|
def test_typed_category_and_search():
|
|
v=default_view('table',['/x']); v.update(search_pointer='/x',category_pointer='/x')
|
|
assert select_records([{'x':'HELLO'},{'x':'other'}],v,1,'hello')['total']==1
|
|
assert select_records([{'x':0},{'x':'0'}],v,1,'','0')['total']==1
|