예제 #1
0
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()
예제 #2
0
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"}
예제 #3
0
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()
예제 #4
0
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)
예제 #5
0
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
예제 #6
0
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")
예제 #7
0
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'
예제 #8
0
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
예제 #9
0
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
예제 #10
0
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)
예제 #11
0
def mock_txn():
    txn = mocks.MockTransaction()
    task_vars.txn.set(txn)
    yield txn
    task_vars.txn.set(None)
예제 #12
0
def _make_strategy():
    storage = mocks.MockStorage(transaction_strategy='lock')
    trns = mocks.MockTransaction(mocks.MockTransactionManager(storage=storage))
    return trns._strategy
예제 #13
0
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__