forked from goodboy/tractor
Merge pull request #45 from tgoodlet/expose_tractor_test
Expose `tractor_test` for external useloglevel_to_tractor_tests
commit
58ebacf0f7
1
setup.py
1
setup.py
|
@ -35,6 +35,7 @@ setup(
|
||||||
platforms=['linux'],
|
platforms=['linux'],
|
||||||
packages=[
|
packages=[
|
||||||
'tractor',
|
'tractor',
|
||||||
|
'tractor.testing',
|
||||||
],
|
],
|
||||||
install_requires=['msgpack', 'trio>0.8', 'async_generator', 'colorlog'],
|
install_requires=['msgpack', 'trio>0.8', 'async_generator', 'colorlog'],
|
||||||
tests_require=['pytest'],
|
tests_require=['pytest'],
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
``tractor`` testing!!
|
``tractor`` testing!!
|
||||||
"""
|
"""
|
||||||
import random
|
import random
|
||||||
from functools import partial, wraps
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import tractor
|
import tractor
|
||||||
|
from tractor.testing import tractor_test
|
||||||
|
|
||||||
|
|
||||||
pytest_plugins = ['pytester']
|
pytest_plugins = ['pytester']
|
||||||
|
@ -28,20 +28,3 @@ def loglevel(request):
|
||||||
@pytest.fixture(scope='session')
|
@pytest.fixture(scope='session')
|
||||||
def arb_addr():
|
def arb_addr():
|
||||||
return _arb_addr
|
return _arb_addr
|
||||||
|
|
||||||
|
|
||||||
def tractor_test(fn):
|
|
||||||
"""
|
|
||||||
Use:
|
|
||||||
|
|
||||||
@tractor_test
|
|
||||||
async def test_whatever():
|
|
||||||
await ...
|
|
||||||
"""
|
|
||||||
@wraps(fn)
|
|
||||||
def wrapper(*args, **kwargs):
|
|
||||||
# __tracebackhide__ = True
|
|
||||||
return tractor.run(
|
|
||||||
partial(fn, *args, **kwargs), arbiter_addr=_arb_addr)
|
|
||||||
|
|
||||||
return wrapper
|
|
||||||
|
|
|
@ -8,8 +8,6 @@ import subprocess
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import tractor
|
import tractor
|
||||||
|
|
||||||
|
|
||||||
from conftest import tractor_test
|
from conftest import tractor_test
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,14 +70,19 @@ async def test_cancel_remote_arbiter(daemon, arb_addr):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@tractor_test
|
async def test_register_duplicate_name(daemon, arb_addr):
|
||||||
async def test_register_duplicate_name(daemon):
|
|
||||||
assert not tractor.current_actor().is_arbiter
|
|
||||||
async with tractor.open_nursery() as n:
|
|
||||||
p1 = await n.start_actor('doggy')
|
|
||||||
p2 = await n.start_actor('doggy')
|
|
||||||
|
|
||||||
async with tractor.wait_for_actor('doggy') as portal:
|
async def main():
|
||||||
assert portal.channel.uid in (p2.channel.uid, p1.channel.uid)
|
assert not tractor.current_actor().is_arbiter
|
||||||
|
async with tractor.open_nursery() as n:
|
||||||
|
p1 = await n.start_actor('doggy')
|
||||||
|
p2 = await n.start_actor('doggy')
|
||||||
|
|
||||||
await n.cancel()
|
async with tractor.wait_for_actor('doggy') as portal:
|
||||||
|
assert portal.channel.uid in (p2.channel.uid, p1.channel.uid)
|
||||||
|
|
||||||
|
await n.cancel()
|
||||||
|
|
||||||
|
# run it manually since we want to start **after**
|
||||||
|
# the other "daemon" program
|
||||||
|
tractor.run(main, arb_addr=arbiter_addr)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
from ._tractor_test import tractor_test
|
|
@ -0,0 +1,29 @@
|
||||||
|
import inspect
|
||||||
|
from functools import partial, wraps
|
||||||
|
|
||||||
|
from .. import run
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['tractor_test']
|
||||||
|
|
||||||
|
|
||||||
|
def tractor_test(fn):
|
||||||
|
"""
|
||||||
|
Use:
|
||||||
|
|
||||||
|
@tractor_test
|
||||||
|
async def test_whatever():
|
||||||
|
await ...
|
||||||
|
|
||||||
|
If an ``arb_addr`` (a socket addr tuple) is defined in the
|
||||||
|
`pytest` fixture space it will be automatically injected.
|
||||||
|
"""
|
||||||
|
@wraps(fn)
|
||||||
|
def wrapper(*args, arb_addr=None, **kwargs):
|
||||||
|
# __tracebackhide__ = True
|
||||||
|
if 'arb_addr' in inspect.signature(fn).parameters:
|
||||||
|
kwargs['arb_addr'] = arb_addr
|
||||||
|
return run(
|
||||||
|
partial(fn, *args, **kwargs), arbiter_addr=arb_addr)
|
||||||
|
|
||||||
|
return wrapper
|
Loading…
Reference in New Issue