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