Beispiel #1
0
    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()])
Beispiel #2
0
    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))
Beispiel #3
0
    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!')
Beispiel #4
0
    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))
Beispiel #5
0
    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))
Beispiel #6
0
    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)
Beispiel #7
0
    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))
Beispiel #8
0
    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))
Beispiel #9
0
    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))
Beispiel #10
0
    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)
Beispiel #11
0
    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)
Beispiel #12
0
 def func(self, a: int) -> IntegerValue:
     return IntegerValue(a)
Beispiel #13
0
 def func(self) -> IntegerValue:
     return IntegerValue(42)
Beispiel #14
0
 def func(self, request: IntegerValue) -> IntegerValue:
     return IntegerValue(request.value)
Beispiel #15
0
 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)
Beispiel #16
0
 def func(self, request: int) -> IntegerValue:
     return IntegerValue(request)
Beispiel #17
0
 def func(self, value: int) -> IntegerValue:
     return IntegerValue(value)