passerelle/tests/test_jsondatastore.py

242 lines
10 KiB
Python

import pytest
from django.contrib.contenttypes.models import ContentType
from django.core.serializers.json import DjangoJSONEncoder
from passerelle.apps.jsondatastore.models import JsonDataStore
from passerelle.base.models import AccessRight, ApiUser
@pytest.fixture
def jsondatastore(db):
datastore = JsonDataStore.objects.create(slug='foobar')
api = ApiUser.objects.create(username='all', keytype='', key='')
obj_type = ContentType.objects.get_for_model(datastore)
AccessRight.objects.create(
codename='can_access', apiuser=api, resource_type=obj_type, resource_pk=datastore.pk
)
return datastore
@pytest.fixture
def jsondatastore2(db):
datastore = JsonDataStore.objects.create(slug='foobar2')
api = ApiUser.objects.create(username='all2', keytype='', key='')
obj_type = ContentType.objects.get_for_model(datastore)
AccessRight.objects.create(
codename='can_access', apiuser=api, resource_type=obj_type, resource_pk=datastore.pk
)
return datastore
def test_jsondatastore(app, jsondatastore, jsondatastore2):
resp = app.get('/jsondatastore/foobar/data/')
assert resp.json == {'data': [], 'err': 0}
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
uuid = resp.json['id']
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 1
assert resp.json['data'][0]['content'] == {'foo': 'bar'}
# check json payload
resp = app.post('/jsondatastore/foobar/data/create', params='foo=bar')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'could not decode body to json'
resp = app.post_json('/jsondatastore/foobar/data/create', params='foo=bar')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'payload must be a dict'
resp = app.get('/jsondatastore/foobar/data/%s/' % uuid)
assert resp.json['id'] == uuid
assert resp.json['content'] == {'foo': 'bar'}
resp = app.post_json('/jsondatastore/foobar/data/%s/' % uuid, params={'foo': 'bar2'})
assert resp.json['id'] == uuid
assert resp.json['content'] == {'foo': 'bar2'}
# check json payload
resp = app.post('/jsondatastore/foobar/data/%s/' % uuid, params='foo=bar2')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'could not decode body to json'
resp = app.post_json('/jsondatastore/foobar/data/%s/' % uuid, params='foo=bar2')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'payload must be a dict'
resp = app.get('/jsondatastore/foobar/data/%s/' % uuid)
assert resp.json['id'] == uuid
assert resp.json['content'] == {'foo': 'bar2'}
resp = app.patch_json('/jsondatastore/foobar/data/%s/' % uuid, params={'foo2': 'bar2'})
assert resp.json['id'] == uuid
assert resp.json['content'] == {'foo': 'bar2', 'foo2': 'bar2'}
# check json payload
resp = app.patch('/jsondatastore/foobar/data/%s/' % uuid, params='foo2=bar2')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'could not decode body to json'
resp = app.patch_json('/jsondatastore/foobar/data/%s/' % uuid, params='foo2=bar2')
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'payload must be a dict'
resp = app.post_json('/jsondatastore/foobar/data/%s/delete' % uuid)
assert resp.json['err'] == 0
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 0
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
uuid = resp.json['id']
resp = app.get('/jsondatastore/foobar2/data/')
assert len(resp.json['data']) == 0
resp = app.post_json('/jsondatastore/foobar2/data/%s/delete' % uuid, status=404)
assert resp.json['err'] == 1
def test_jsondatastore_name_id(app, jsondatastore):
resp = app.get('/jsondatastore/foobar/data/')
assert resp.json == {'data': [], 'err': 0}
resp = app.post_json('/jsondatastore/foobar/data/create?name_id=xxx', params={'foo': 'bar'})
uuid = resp.json['id']
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 1
assert resp.json['data'][0]['content'] == {'foo': 'bar'}
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 1
resp = app.get('/jsondatastore/foobar/data/?name_id=xxx')
assert len(resp.json['data']) == 1
resp = app.get('/jsondatastore/foobar/data/?name_id=yyy')
assert len(resp.json['data']) == 0
resp = app.get('/jsondatastore/foobar/data/?name_id=')
assert len(resp.json['data']) == 0
resp = app.post_json('/jsondatastore/foobar/data/create?name_id=yyy', params={'foo': 'bar'})
uuid = resp.json['id']
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 2
resp = app.get('/jsondatastore/foobar/data/?name_id=yyy')
assert len(resp.json['data']) == 1
# try removing an existing entry with the wrong name id
resp = app.post_json('/jsondatastore/foobar/data/%s/delete?name_id=zzz' % uuid, status=404)
assert resp.json['err'] == 1
# try removing an existing entry with a blank name id
resp = app.post_json('/jsondatastore/foobar/data/%s/delete?name_id=' % uuid, status=404)
assert resp.json['err'] == 1
# and with the right one
resp = app.post_json('/jsondatastore/foobar/data/%s/delete?name_id=yyy' % uuid)
assert resp.json['err'] == 0
def test_jsondatastore_template(app, jsondatastore):
jsondatastore.text_value_template = '{{foo}}'
jsondatastore.save()
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 1
assert resp.json['data'][0]['text'] == 'bar'
# check entries are alphabetically sorted
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'aaa'})
resp = app.get('/jsondatastore/foobar/data/')
assert len(resp.json['data']) == 2
assert resp.json['data'][0]['text'] == 'aaa'
assert resp.json['data'][1]['text'] == 'bar'
def test_jsondatastore_get_by_attribute(app, jsondatastore):
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
uuid = resp.json['id']
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar2'})
uuid2 = resp.json['id']
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar'})
assert resp.json['id'] == uuid
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar2'})
assert resp.json['id'] == uuid2
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3'})
assert resp.json['err'] == 1
resp = app.post_json('/jsondatastore/foobar/data/create?name_id=xxx', params={'foo': 'bar3'})
uuid = resp.json['id']
resp = app.post_json('/jsondatastore/foobar/data/create?name_id=yyy', params={'foo': 'bar3'})
uuid2 = resp.json['id']
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3', 'name_id': 'xxx'})
assert resp.json['id'] == uuid
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3', 'name_id': 'yyy'})
assert resp.json['id'] == uuid2
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3', 'name_id': 'zzz'})
assert resp.json['err'] == 1
def test_jsondatastore_datetimes(app, jsondatastore):
encoder = DjangoJSONEncoder()
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
uuid = resp.json['id']
creation_datetime = jsondatastore.get_data_object(uuid).creation_datetime
resp = app.post_json('/jsondatastore/foobar/data/%s/' % uuid, params={'foo': 'bar2'})
last_update_datetime = jsondatastore.get_data_object(uuid).last_update_datetime
assert resp.json['creation_datetime'] == encoder.default(creation_datetime)
assert resp.json['last_update_datetime'] == encoder.default(last_update_datetime)
resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar2'})
assert resp.json['creation_datetime'] == encoder.default(creation_datetime)
assert resp.json['last_update_datetime'] == encoder.default(last_update_datetime)
resp = app.get('/jsondatastore/foobar/data/')
assert resp.json['data'][0]['creation_datetime'] == encoder.default(creation_datetime)
assert resp.json['data'][0]['last_update_datetime'] == encoder.default(last_update_datetime)
def test_jsondatastore_list_by_attribute_filter(app, jsondatastore):
resp = app.post_json(
'/jsondatastore/foobar/data/create?name_id=name1', params={'key1': 'val1', 'key2': 'foo'}
)
uuid1 = resp.json['id']
resp = app.post_json(
'/jsondatastore/foobar/data/create?name_id=name2', params={'key1': 'val1', 'key2': 'val2'}
)
uuid2 = resp.json['id']
resp = app.post_json(
'/jsondatastore/foobar/data/create?name_id=name1', params={'key1': 'val1', 'key2': 'val2'}
)
uuid3 = resp.json['id']
resp = app.get('/jsondatastore/foobar/data/', params={'key2': 'foo'})
assert [d['id'] for d in resp.json['data']] == [uuid1]
resp = app.get('/jsondatastore/foobar/data/', params={'key1': 'val1', 'key2': 'val2'})
assert sorted(d['id'] for d in resp.json['data']) == sorted([uuid2, uuid3])
resp = app.get('/jsondatastore/foobar/data/?name_id=name1', params={'key2': 'val2'})
assert [d['id'] for d in resp.json['data']] == [uuid3]
resp = app.get('/jsondatastore/foobar/data/', params={'key3': ''})
assert [d['id'] for d in resp.json['data']] == []
def test_jsondatastore_list_by_q_attribute(app, jsondatastore):
jsondatastore.text_value_template = '{{foo}}'
jsondatastore.save()
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
uuid1 = resp.json['id']
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'BÄR'})
uuid2 = resp.json['id']
resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'ras'})
resp = app.get('/jsondatastore/foobar/data/', params={'q': 'àR'})
assert sorted(d['id'] for d in resp.json['data']) == sorted([uuid1, uuid2])
resp = app.get('/jsondatastore/foobar/data/', params={'q': 'na'})
assert resp.json['data'] == []