async def test_magic_return_value(self): def func(self) -> IntegerValue: return IntegerValue(42) inspect = magic_normalize(func) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, Empty) self.assertEqual(await inspect.invokable(None, Empty()), IntegerValue(42)) # NOTE: This uses converters. def func(self) -> int: return 42 inspect = magic_normalize(func, converters=[Int64ValueConverter(), Int32ValueConverter()]) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, Empty) self.assertEqual(await inspect.invokable(None, Empty()), IntegerValue(42)) def func(self) -> str: return 'foo' inspect = magic_normalize(func, converters=[IntegerValueConverter(), StringValueConverter()]) self.assertEqual(inspect.response, StringValue) self.assertEqual(inspect.request, Empty) self.assertEqual(await inspect.invokable(None, Empty()), StringValue('foo')) with self.assertRaises(RuntimeError): def func(self) -> int: return 42 inspect = magic_normalize(func, converters=[StringValueConverter()])
async def test_magic_request_message(self): def func(self, request: IntegerValue) -> IntegerValue: return IntegerValue(request.value) inspect = magic_normalize(func) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, IntegerValue) self.assertEqual(await inspect.invokable(None, IntegerValue(42)), IntegerValue(42))
def test_integer_value(self): protocol = JSONProtocol(IntegerValue) self.assertEqual(protocol.encode(IntegerValue(2)), 2) self.assertEqual(protocol.decode(2), IntegerValue(2)) with self.assertRaises(ValidationError): protocol.decode('hiss!')
async def test_magic_new_type_request_message(self): MyInt = NewType('MyInt', int) def func(self, value: MyInt) -> IntegerValue: return IntegerValue(value) inspect = magic_normalize(func, request=IntegerValue) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, IntegerValue) self.assertEqual(await inspect.invokable(None, IntegerValue(42)), IntegerValue(42))
def test_magic_request_message_autogenerate(self): # TODO def func(self, request: int) -> IntegerValue: return IntegerValue(request) inspect = magic_normalize(func) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, IntegerValue) self.assertEqual(inspect.invokable(None, IntegerValue(42)), IntegerValue(42))
async def test_service_proxy_mock_venom(self): """ Mocking of all undeclared services using ServiceProxy. RPC calls are always asynchronous and it is recommended to only pass messages. """ class BetweenRequest(Message): min = Integer() max = Integer() class ConspiracyService(Service): random = ServiceProxy('random') @rpc async def suspicious_area(self) -> str: x = await self.random.random(BetweenRequest(49, 100)) return 'Area {}'.format((await self.random.random(BetweenRequest(49, 100))).value) venom = MockVenom() venom.add(ConspiracyService) with venom.get_request_context(): conspiracy = venom.get_instance('conspiracy') conspiracy.random.random.side_effect = lambda request: IntegerValue(request.min + 2) self.assertIsInstance(conspiracy.random, MagicMock) self.assertEqual('Area 51', (await conspiracy.suspicious_area(Empty())).value)
async def test_magic_specified_resolver_args(self): Foo = namedtuple('Foo', ['service', 'request']) class FooResolver(Resolver): async def resolve(self, service, request): return Foo(service, request) def func(service_self, foo: Foo, request: IntegerValue) -> IntegerValue: self.assertEqual(service_self, None) self.assertEqual(foo.service, service_self) self.assertEqual(foo.request, request) return IntegerValue(request.value) inspect = magic_normalize(func, additional_args=(FooResolver,)) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, IntegerValue) self.assertEqual(await inspect.invokable(None, IntegerValue(42)), IntegerValue(42))
async def test_new_type_return_value(self): MyInt = NewType('MyInt', int) def func(self) -> MyInt: return 42 inspect = magic_normalize(func, converters=[Int64ValueConverter(), Int32ValueConverter()]) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, Empty) self.assertEqual(await inspect.invokable(None, Empty()), IntegerValue(42))
async def test_magic_request_message_auto_schema(self): @schema('a', minimum=5) def func(self, a: int) -> IntegerValue: return IntegerValue(a) inspect = magic_normalize(func, auto_generate_request=True) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(fields(inspect.request), ( Field(int, name='a'), )) self.assertEqual(inspect.request.a.schema, Schema(minimum=5)) self.assertEqual(await inspect.invokable(None, inspect.request(5)), IntegerValue(5))
async def test_magic_request_message_unpack(self): def func(self, value: int) -> IntegerValue: return IntegerValue(value) inspect = magic_normalize(func, request=IntegerValue) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, IntegerValue) self.assertEqual(await inspect.invokable(None, IntegerValue()), IntegerValue(0)) self.assertEqual(await inspect.invokable(None, IntegerValue(42)), IntegerValue(42)) def func(self) -> IntegerValue: return IntegerValue(42) inspect = magic_normalize(func, request=IntegerValue) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(inspect.request, IntegerValue) self.assertEqual(await inspect.invokable(None, IntegerValue(42)), IntegerValue(42)) class Snake(Message): name = String() size = Int64() def func(self, name: str, size: int, hungry: bool = True) -> Snake: return Snake(name, size - hungry) inspect = magic_normalize(func, request=Snake) self.assertEqual(inspect.response, Snake) self.assertEqual(inspect.request, Snake) self.assertEqual(await inspect.invokable(None, Snake('snek', 3)), Snake('snek', 2)) with self.assertRaises(RuntimeError): def func() -> IntegerValue: return IntegerValue(42) inspect = magic_normalize(func, request=IntegerValue)
async def test_service_proxy_mock_instance(self): """ ServiceProxy usage with mock_instance() which is as shorthand for setting up MockVenom with a service to test. """ class ConspiracyService(Service): random = ServiceProxy('random') @rpc async def suspicious_area(self) -> str: return 'Area {}'.format((await self.random.random(Empty())).value) with RequestContext(): conspiracy = mock_instance(ConspiracyService) conspiracy.random.random.return_value = IntegerValue(51) self.assertIsInstance(conspiracy.random, MagicMock) self.assertEqual('Area 51', (await conspiracy.suspicious_area(Empty())).value)
def func(self, a: int) -> IntegerValue: return IntegerValue(a)
def func(self) -> IntegerValue: return IntegerValue(42)
def func(self, request: IntegerValue) -> IntegerValue: return IntegerValue(request.value)
def func(service_self, foo: Foo, request: IntegerValue) -> IntegerValue: self.assertEqual(service_self, None) self.assertEqual(foo.service, service_self) self.assertEqual(foo.request, request) return IntegerValue(request.value)
def func(self, request: int) -> IntegerValue: return IntegerValue(request)
def func(self, value: int) -> IntegerValue: return IntegerValue(value)