forked from pool/python-pretend
4c2ae5ab3e
- Activate test suite - Update to v1.0.9 * Make 'stub' object callable * Build and doc enhancements - Remove superfluous devel dependency for noarch package - Switch to singlespec approach - Initial version for v1.0.8 OBS-URL: https://build.opensuse.org/request/show/674883 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-pretend?expand=0&rev=9
185 lines
4.6 KiB
Python
185 lines
4.6 KiB
Python
import operator
|
|
|
|
import pytest
|
|
|
|
from pretend import stub, raiser, call, call_recorder, PY3K
|
|
|
|
|
|
class TestStub(object):
|
|
def test_attribute(self):
|
|
x = stub(attr=3)
|
|
assert hasattr(x, "attr")
|
|
assert x.attr == 3
|
|
|
|
def test_function(self):
|
|
x = stub(meth=lambda x, y: x + y)
|
|
assert x.meth(3, 4) == 7
|
|
|
|
def test_iter(self):
|
|
x = stub(__iter__=lambda: iter([1, 2, 3]))
|
|
iterator = iter(x)
|
|
assert next(iterator) == 1
|
|
|
|
@pytest.mark.skipif("not PY3K")
|
|
def test_next(self):
|
|
x = stub(__next__=lambda: 12)
|
|
assert next(x) == 12
|
|
|
|
def test_contains(self):
|
|
x = stub(__contains__=lambda other: True)
|
|
assert "hello world" in x
|
|
|
|
@pytest.mark.skipif("PY3K")
|
|
def test_nonzero(self):
|
|
x = stub(__nonzero__=lambda: False)
|
|
assert not bool(x)
|
|
|
|
@pytest.mark.skipif("not PY3K")
|
|
def test_bool(self):
|
|
x = stub(__bool__=lambda: False)
|
|
assert not bool(x)
|
|
|
|
def test_len(self):
|
|
x = stub(__len__=lambda: 12)
|
|
assert len(x) == 12
|
|
|
|
@pytest.mark.parametrize(("func", "op"), [
|
|
(operator.lt, "__lt__"),
|
|
(operator.le, "__le__"),
|
|
(operator.eq, "__eq__"),
|
|
(operator.ne, "__ne__"),
|
|
(operator.gt, "__gt__"),
|
|
(operator.ge, "__ge__"),
|
|
|
|
(operator.add, "__add__"),
|
|
(operator.and_, "__and__"),
|
|
(divmod, "__divmod__"),
|
|
(operator.floordiv, "__floordiv__"),
|
|
(operator.lshift, "__lshift__"),
|
|
(operator.mod, "__mod__"),
|
|
(operator.mul, "__mul__"),
|
|
(operator.or_, "__or__"),
|
|
(operator.pow, "__pow__"),
|
|
(operator.rshift, "__rshift__"),
|
|
(operator.sub, "__sub__"),
|
|
(operator.truediv, "__truediv__"),
|
|
(operator.xor, "__xor__"),
|
|
])
|
|
def test_special_binops(self, func, op):
|
|
x = stub(**{
|
|
op: lambda y: func(2, y)
|
|
})
|
|
assert func(x, 4) == func(2, 4)
|
|
assert func(x, 2) == func(2, 2)
|
|
|
|
@pytest.mark.skipif("PY3K")
|
|
def test_div(self):
|
|
x = stub(
|
|
__div__=lambda y: 4
|
|
)
|
|
assert x / 3 == 4
|
|
|
|
def test_missing_op_error(self):
|
|
x = stub()
|
|
with pytest.raises(TypeError):
|
|
x + 2
|
|
|
|
def test_subscript(self):
|
|
x = stub(
|
|
__getitem__=lambda idx: idx
|
|
)
|
|
assert x[5] == 5
|
|
assert x[1, 2] == (1, 2)
|
|
|
|
def test_setitem(self):
|
|
d = {}
|
|
x = stub(
|
|
__setitem__=d.__setitem__
|
|
)
|
|
x[5] = 'a'
|
|
x['b'] = 6
|
|
assert d == {5: 'a', 'b': 6}
|
|
|
|
def test_delitem(self):
|
|
d = {5: 'a', 'b': 6}
|
|
x = stub(
|
|
__delitem__=d.__delitem__
|
|
)
|
|
del x['b']
|
|
assert d == {5: 'a'}
|
|
|
|
def test_context_manager(self):
|
|
should_reraise = True
|
|
x = stub(
|
|
__enter__=lambda: 3,
|
|
__exit__=lambda exc_type, exc_value, tb: should_reraise
|
|
)
|
|
with x as value:
|
|
assert value == 3
|
|
raise ValueError
|
|
should_reraise = False
|
|
with pytest.raises(ValueError):
|
|
with x as value:
|
|
assert value == 3
|
|
raise ValueError
|
|
|
|
def test_default_repr(self):
|
|
x = stub(a=10)
|
|
|
|
assert repr(x) == "<stub(a=10)>"
|
|
|
|
def test_custom_repr(self):
|
|
x = stub(id=300, __repr__=lambda: '<Something>')
|
|
|
|
assert x.id == 300
|
|
assert repr(x) == '<Something>'
|
|
|
|
def test_callable(self):
|
|
x = stub(__call__=lambda: 4)
|
|
|
|
assert x() == 4
|
|
|
|
|
|
class TestRaiser(object):
|
|
def test_call_raiser(self):
|
|
f = raiser(ValueError)
|
|
with pytest.raises(ValueError):
|
|
f()
|
|
|
|
def test_call_raiser_exc_value(self):
|
|
exc = ValueError(14)
|
|
f = raiser(exc)
|
|
with pytest.raises(ValueError) as exc_info:
|
|
f()
|
|
assert exc_info.value is exc
|
|
|
|
def test_non_exc_raiser(self):
|
|
with pytest.raises(TypeError):
|
|
raiser("test")
|
|
|
|
|
|
class TestCallRecorder(object):
|
|
def test_call_eq(self):
|
|
assert call(a=2) == call(a=2)
|
|
assert not (call(a=2) != call(a=2))
|
|
assert call(a=2) != call(a=3)
|
|
assert not (call(a=2) == call(a=3))
|
|
|
|
assert call() != []
|
|
|
|
def test_call_repr(self):
|
|
assert repr(call(1, 2, a=3)) == "<call(1, 2, a=3)>"
|
|
assert repr(call(a=2)) == "<call(a=2)>"
|
|
|
|
def test_call_hash(self):
|
|
c1 = call(a=2)
|
|
c2 = call(a=2)
|
|
assert hash(c1) == hash(c2)
|
|
|
|
def test_simple(self):
|
|
f = call_recorder(lambda *args, **kwargs: 3)
|
|
assert f() == 3
|
|
assert f.calls == [
|
|
call()
|
|
]
|