async def test_cache_delete(redis_container, dummy_guillotina, loop): await cache.close_redis_pool() trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} rcache = RedisCache(trns, loop=loop) await rcache.clear() await rcache.set('bar', oid='foo') # make sure it is in redis assert serialize.loads( await rcache._redis.get(CACHE_PREFIX + 'root-foo')) == "bar" assert rcache._memory_cache.get('root-foo') == 'bar' assert await rcache.get(oid='foo') == 'bar' # now delete await rcache.delete('root-foo') assert await rcache.get(oid='foo') is None await cache.close_redis_pool()
async def test_parse_metadata(dummy_guillotina): from guillotina.contrib.catalog.pg import PGSearchUtility util = PGSearchUtility() with mocks.MockTransaction(): content = test_utils.create_content(Container) query = parse_query(content, {"_metadata": "foobar"}) result = util.load_meatdata(query, { "foobar": "foobar", "blah": "blah" }) assert result == {"foobar": "foobar"} query = parse_query(content, {"_metadata_not": "foobar"}) result = util.load_meatdata(query, { "foobar": "foobar", "blah": "blah" }) assert result == {"blah": "blah"}
async def test_invalidate_object(redis_container, dummy_guillotina, loop): await cache.close_redis_pool() trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} content = create_content() trns.modified = {content._p_oid: content} rcache = RedisCache(trns, loop=loop) await rcache.clear() await rcache.set('foobar', oid=content._p_oid) assert serialize.loads(await rcache._redis.get(CACHE_PREFIX + content._p_oid)) == "foobar" assert rcache._memory_cache.get(content._p_oid) == 'foobar' assert await rcache.get(oid=content._p_oid) == 'foobar' await rcache.close(invalidate=True) assert await rcache.get(oid=content._p_oid) is None await cache.close_redis_pool()
async def test_cache_set(redis_container, guillotina_main): util = get_utility(ICacheUtility) await util.initialize() assert util.initialized assert util._obj_driver is not None trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} rcache = BasicCache(trns) await rcache.clear() await rcache.set("bar", oid="foo") # make sure it is in redis driver = await resolve_dotted_name("guillotina.contrib.redis").get_driver() val = await driver.get(CACHE_PREFIX + "root-foo") assert serialize.loads(val) == "bar" # but also in memory assert util._memory_cache.get("root-foo") == "bar" # and api matches.. assert await rcache.get(oid="foo") == "bar" await util.finalize(None)
async def test_subscriber_invalidates(redis_container, guillotina_main): util = get_utility(ICacheUtility) await util.initialize() assert util.initialized assert util._obj_driver is not None assert util._subscriber is not None trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} content = create_content() trns.modified = {content.__uuid__: content} rcache = BasicCache(trns) await rcache.clear() await rcache.set("foobar", oid=content.__uuid__) driver = await resolve_dotted_name("guillotina.contrib.redis").get_driver() assert serialize.loads(await driver.get(CACHE_PREFIX + "root-" + content.__uuid__)) == "foobar" assert util._memory_cache.get("root-" + content.__uuid__) == "foobar" assert await rcache.get(oid=content.__uuid__) == "foobar" assert "root-" + content.__uuid__ in util._memory_cache await driver.publish( app_settings["cache"]["updates_channel"], pickle.dumps({ "data": serialize.dumps({ "tid": 32423, "keys": ["root-" + content.__uuid__] }), "ruid": "nonce" }), ) await asyncio.sleep(1) # should be enough for pub/sub to finish assert "root-" + content.__uuid__ not in util._memory_cache
async def runit(type_name): print(f"Test content creation with {type_name}") request = get_current_request() txn = mocks.MockTransaction() container = await create_content(type_name, id="container") container.__txn__ = txn start = time.time() for _ in range(ITERATIONS): ob = await create_content(type_name, id="foobar") ob.__txn__ = txn await notify(BeforeObjectAddedEvent(ob, container, "foobar")) deserializer = get_multi_adapter((ob, request), IResourceDeserializeFromJson) data = { "title": "Foobar", "guillotina.behaviors.dublincore.IDublinCore": {"tags": ["foo", "bar"]}, "measures.configuration.ITestBehavior1": {"foobar": "123"}, "measures.configuration.ITestBehavior2": {"foobar": "123"}, "measures.configuration.ITestBehavior3": {"foobar": "123"}, } await deserializer(data, validate_all=True) await notify(ObjectAddedEvent(ob, container, "foobar", payload=data)) end = time.time() print(f"Done with {ITERATIONS} in {end - start} seconds")
async def test_serialize_cloud_file(dummy_request, dummy_guillotina): txn = mocks.MockTransaction() with txn: from guillotina.test_package import FileContent, IFileContent from guillotina.interfaces import IFileManager obj = create_content(FileContent) obj.file = DBFile(filename='foobar.json', md5='foobar') fm = get_multi_adapter( (obj, dummy_request, IFileContent['file'].bind(obj)), IFileManager) await fm.dm.load() await fm.file_storage_manager.start(fm.dm) async def _data(): yield b'{"foo": "bar"}' await fm.file_storage_manager.append(fm.dm, _data(), 0) await fm.file_storage_manager.finish(fm.dm) await fm.dm.finish() value = json_compatible(obj.file) assert value['filename'] == 'foobar.json' assert value['size'] == 14 assert value['md5'] == 'foobar'
async def test_subscriber_invalidates(redis_container, guillotina_main, loop): util = get_utility(ICacheUtility) await util.initialize() assert util.initialized assert util._obj_driver is not None assert util._subscriber is not None trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} content = create_content() trns.modified = {content.__uuid__: content} rcache = BasicCache(trns) await rcache.clear() await rcache.set('foobar', oid=content.__uuid__) driver = await resolve_dotted_name('guillotina.contrib.redis').get_driver() assert serialize.loads(await driver.get(CACHE_PREFIX + 'root-' + content.__uuid__)) == "foobar" assert util._memory_cache.get('root-' + content.__uuid__) == 'foobar' assert await rcache.get(oid=content.__uuid__) == 'foobar' assert 'root-' + content.__uuid__ in util._memory_cache await driver.publish( app_settings['cache']['updates_channel'], pickle.dumps({ 'data': serialize.dumps({ 'tid': 32423, 'keys': ['root-' + content.__uuid__] }), 'ruid': 'nonce' })) await asyncio.sleep(1) # should be enough for pub/sub to finish assert 'root-' + content.__uuid__ not in util._memory_cache
async def test_invalidate_object(redis_container, guillotina_main, loop): util = get_utility(ICacheUtility) await util.initialize() assert util.initialized assert util._obj_driver is not None assert util._subscriber is not None trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} content = create_content() trns.modified = {content.__uuid__: content} rcache = BasicCache(trns) await rcache.clear() await rcache.set('foobar', oid=content.__uuid__) driver = await resolve_dotted_name('guillotina.contrib.redis').get_driver() assert serialize.loads(await driver.get(CACHE_PREFIX + 'root-' + content.__uuid__)) == "foobar" assert util._memory_cache.get('root-' + content.__uuid__) == 'foobar' assert await rcache.get(oid=content.__uuid__) == 'foobar' await rcache.close(invalidate=True) assert await rcache.get(oid=content.__uuid__) is None
async def test_cache_clear(redis_container, guillotina_main, loop): util = get_utility(ICacheUtility) await util.initialize() assert util.initialized assert util._obj_driver is not None trns = mocks.MockTransaction(mocks.MockTransactionManager()) trns.added = trns.deleted = {} rcache = BasicCache(trns) await rcache.clear() await rcache.set('bar', oid='foo') # make sure it is in redis driver = await resolve_dotted_name('guillotina.contrib.redis').get_driver() assert serialize.loads(await driver.get(CACHE_PREFIX + 'root-foo')) == "bar" assert util._memory_cache.get('root-foo') == 'bar' assert await rcache.get(oid='foo') == 'bar' await rcache.clear() assert await rcache.get(oid='foo') is None await util.finalize(None)
def mock_txn(): txn = mocks.MockTransaction() task_vars.txn.set(txn) yield txn task_vars.txn.set(None)
def _make_strategy(): storage = mocks.MockStorage(transaction_strategy='lock') trns = mocks.MockTransaction(mocks.MockTransactionManager(storage=storage)) return trns._strategy
async def test_bucket_list_field(dummy_request): login() content = create_content() content.__txn__ = mocks.MockTransaction() deserializer = get_multi_adapter((content, dummy_request), IResourceDeserializeFromJson) await deserializer.set_schema(ITestSchema, content, { 'bucket_list': { 'op': 'append', 'value': { 'key': 'foo', 'value': 'bar' } } }, []) assert content.bucket_list.annotations_metadata[0]['len'] == 1 assert await content.bucket_list.get(content, 0, 0) == { 'key': 'foo', 'value': 'bar' } assert await content.bucket_list.get(content, 0, 1) is None assert await content.bucket_list.get(content, 1, 0) is None for _ in range(100): await deserializer.set_schema( ITestSchema, content, { 'bucket_list': { 'op': 'append', 'value': { 'key': 'foo', 'value': 'bar' } } }, []) assert len(content.bucket_list.annotations_metadata) == 11 assert content.bucket_list.annotations_metadata[0]['len'] == 10 assert content.bucket_list.annotations_metadata[5]['len'] == 10 assert content.bucket_list.annotations_metadata[10]['len'] == 1 await content.bucket_list.remove(content, 10, 0) assert content.bucket_list.annotations_metadata[10]['len'] == 0 await content.bucket_list.remove(content, 9, 0) assert content.bucket_list.annotations_metadata[9]['len'] == 9 assert len(content.bucket_list) == 99 await deserializer.set_schema( ITestSchema, content, { 'bucket_list': { 'op': 'extend', 'value': [{ 'key': 'foo', 'value': 'bar' }, { 'key': 'foo', 'value': 'bar' }] } }, []) assert len(content.bucket_list) == 101 assert json_compatible(content.bucket_list) == {'len': 101, 'buckets': 11} assert len([b async for b in content.bucket_list.iter_buckets(content) ]) == 11 assert len([i async for i in content.bucket_list.iter_items(content)]) == 101 assert 'bucketlist-bucket_list0' in content.__gannotations__