Exemplo n.º 1
0
    def test_custom(self):
        """测试自定义回复"""
        from ..models import WeChatApp

        def _get_handler(handler, app=None):
            return self._create_handler(replies=dict(
                type=Reply.MsgType.CUSTOM,
                program="wechat_django.tests.test_model_handler." + handler),
                                        app=app)

        sender = "openid"
        message = messages.TextMessage(dict(FromUserName=sender,
                                            content="xyz"))
        message = self._wrap_message(message)
        success_reply = "success"
        # 测试自定义回复
        handler = _get_handler("debug_handler")
        reply = handler.reply(message)
        self.assertIsInstance(reply, replies.TextReply)
        self.assertEqual(reply.content, success_reply)

        # 测试未加装饰器的自定义回复
        handler = _get_handler("forbidden_handler")
        self.assertRaises(MessageHandleError, lambda: handler.reply(message))

        # 测试不属于本app的自定义回复
        handler_success = _get_handler("app_only_handler")
        handler_fail = _get_handler("app_only_handler",
                                    WeChatApp.objects.get_by_name("test1"))
        reply = handler_success.reply(message)
        self.assertIsInstance(reply, replies.TextReply)
        self.assertEqual(reply.content, success_reply)
        message._app = WeChatApp.objects.get_by_name("test1")
        self.assertRaises(MessageHandleError,
                          lambda: handler_fail.reply(message))
Exemplo n.º 2
0
    def test_multireply(self):
        """测试多回复"""
        reply1 = "abc"
        reply2 = "def"
        replies = [dict(
            type=Reply.MsgType.TEXT,
            content=reply1
        ), dict(
            type=Reply.MsgType.TEXT,
            content=reply2
        )]
        handler_all = self._create_handler(
            replies=replies, strategy=MessageHandler.ReplyStrategy.REPLYALL)
        handler_rand = self._create_handler(
            replies=replies, strategy=MessageHandler.ReplyStrategy.RANDOM)

        # 随机回复
        api = "/cgi-bin/message/custom/send"
        sender = "openid"
        message = messages.TextMessage(dict(
            FromUserName=sender,
            content="xyz"
        ))
        message = self._wrap_message(message)
        with wechatapi_accesstoken(), wechatapi_error(api):
            reply = handler_rand.reply(message)
            self.assertEqual(reply.type, Reply.MsgType.TEXT)
            self.assertEqual(reply.target, sender)
            self.assertIn(reply.content, (reply1, reply2))

        # 回复一条正常消息以及一条客服消息
        counter = dict(calls=0)

        def callback(url, request, response):
            counter["calls"] += 1
            data = json.loads(request.body.decode())
            self.assertEqual(data["text"]["content"], reply1)
            self.assertEqual(data["touser"], sender)
        with wechatapi_accesstoken(), wechatapi(api, dict(errcode=0, errmsg=""), callback):
            reply = handler_all.reply(message)
            self.assertEqual(reply.type, Reply.MsgType.TEXT)
            self.assertEqual(reply.target, sender)
            self.assertEqual(reply.content, reply2)
            self.assertEqual(counter["calls"], 1)
Exemplo n.º 3
0
    def test_available(self):
        """测试handler有效性"""
        rule = dict(type=Rule.Type.ALL)
        now = timezone.now()
        day = timedelta(days=1)
        handler_not_begin = self._create_handler(rule, starts=now + day)
        handler_ended = self._create_handler(rule, ends=now - day)
        handler_disabled = self._create_handler(rule, enabled=False)
        handler_available = self._create_handler(
            rule, starts=now - day, ends=now + day)

        msg_info = self._msg2info(messages.TextMessage("abc"))
        self.assertFalse(handler_not_begin.is_match(msg_info))
        self.assertFalse(handler_ended.is_match(msg_info))
        self.assertFalse(handler_disabled.is_match(msg_info))
        self.assertTrue(handler_available.is_match(msg_info))

        matches = MessageHandler.matches(msg_info)
        self.assertEqual(len(matches), 1)
        self.assertEqual(matches[0], handler_available)
Exemplo n.º 4
0
    def test_send(self):
        """测试客服回复"""
        sender = "openid"
        message = messages.TextMessage(dict(
            FromUserName=sender,
            content="xyz"
        ))
        message = self._wrap_message(message)

        # 空消息转换
        empty_msg = replies.EmptyReply()
        empty_str = ""
        self.assertIsNone(Reply.reply2send(empty_msg)[0])
        self.assertIsNone(Reply.reply2send(empty_str)[0])

        client = self.app.client.message

        # 文本消息转换
        content = "test"
        msg_type = Reply.MsgType.TEXT
        reply = Reply(type=msg_type, content=content).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_text")
        self.assertEqual(reply.content, kwargs["content"])

        # 图片消息转换
        media_id = "media_id"
        msg_type = Reply.MsgType.IMAGE
        reply = Reply(type=msg_type, media_id=media_id).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_image")
        self.assertEqual(reply.media_id, kwargs["media_id"])

        # 声音消息转换
        msg_type = Reply.MsgType.VOICE
        reply = Reply(type=msg_type, media_id=media_id).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_voice")
        self.assertEqual(reply.media_id, kwargs["media_id"])

        # 视频消息转换
        title = "title"
        description = "desc"
        msg_type = Reply.MsgType.VIDEO
        reply = Reply(type=msg_type, media_id=media_id, title=title,
            description=description).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_video")
        self.assertEqual(reply.media_id, kwargs["media_id"])
        self.assertEqual(reply.title, kwargs["title"])
        self.assertEqual(reply.description, kwargs["description"])
        # 选填字段
        reply = Reply(type=msg_type, media_id=media_id).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_video")
        self.assertEqual(reply.media_id, kwargs["media_id"])
        self.assertIsNone(kwargs["title"])
        self.assertIsNone(kwargs["description"])

        # 音乐消息转换
        music_url = "music_url"
        hq_music_url = "hq_music_url"
        msg_type = Reply.MsgType.MUSIC
        reply = Reply(type=msg_type, thumb_media_id=media_id, title=title,
            description=description, music_url=music_url,
            hq_music_url=hq_music_url).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_music")
        self.assertEqual(reply.thumb_media_id, kwargs["thumb_media_id"])
        self.assertEqual(reply.music_url, kwargs["url"])
        self.assertEqual(reply.hq_music_url, kwargs["hq_url"])
        self.assertEqual(reply.title, kwargs["title"])
        self.assertEqual(reply.description, kwargs["description"])
        # 选填字段
        reply = Reply(type=msg_type, thumb_media_id=media_id).reply(message)
        funcname, kwargs = Reply.reply2send(reply)
        self.assertTrue(hasattr(client, funcname))
        self.assertEqual(funcname, "send_music")
        self.assertEqual(reply.thumb_media_id, kwargs["thumb_media_id"])
        self.assertIsNone(kwargs["url"])
        self.assertIsNone(kwargs["hq_url"])
        self.assertIsNone(kwargs["title"])
        self.assertIsNone(kwargs["description"])

        # 图文消息转换
        pass

        # 确认消息发送
        handler = self._create_handler(replies=dict(
            type=Reply.MsgType.TEXT,
            content=content
        ))

        def callback(url, request, response):
            data = json.loads(request.body.decode())
            self.assertEqual(data["touser"], sender)
            self.assertEqual(data["msgtype"], Reply.MsgType.TEXT)
            self.assertEqual(data["text"]["content"], content)

        with wechatapi_accesstoken(), wechatapi("/cgi-bin/message/custom/send", dict(
            errcode=0
        ), callback):
            handler.replies.all()[0].send(message)
Exemplo n.º 5
0
    def test_reply(self):
        """测试一般回复"""
        sender = "openid"
        message = messages.TextMessage(dict(
            FromUserName=sender,
            content="xyz"
        ))

        def _test_reply(type, **kwargs):
            reply = Reply(
                type=type,
                **{
                    k: v
                    for k, v in kwargs.items()
                    if v is not None
                }
            )
            reply_message = reply.normal_reply(message)
            self.assertEqual(reply_message.target, sender)
            self.assertEqual(reply_message.type, type)
            return reply_message

        # 测试文本回复
        content = "test"
        reply = _test_reply(Reply.MsgType.TEXT, content=content)
        self.assertEqual(reply.content, content)

        # 测试图片回复
        media_id = "media_id"
        reply = _test_reply(Reply.MsgType.IMAGE, media_id=media_id)
        self.assertEqual(reply.image, media_id)

        # 测试音频回复
        reply = _test_reply(Reply.MsgType.VOICE, media_id=media_id)
        self.assertEqual(reply.voice, media_id)

        # 测试视频回复
        title = "title"
        description = "desc"
        reply = _test_reply(
            Reply.MsgType.VIDEO, media_id=media_id, title=title,
            description=description)
        self.assertEqual(reply.media_id, media_id)
        self.assertEqual(reply.title, title)
        self.assertEqual(reply.description, description)
        # 选填字段
        reply = _test_reply(Reply.MsgType.VIDEO, media_id=media_id)
        self.assertEqual(reply.media_id, media_id)
        self.assertIsNone(reply.title)
        self.assertIsNone(reply.description)

        # 测试音乐回复
        music_url = "music_url"
        hq_music_url = "hq_music_url"
        reply = _test_reply(
            Reply.MsgType.MUSIC, thumb_media_id=media_id, title=title,
            description=description, music_url=music_url,
            hq_music_url=hq_music_url)
        self.assertEqual(reply.thumb_media_id, media_id)
        self.assertEqual(reply.title, title)
        self.assertEqual(reply.description, description)
        self.assertEqual(reply.music_url, music_url)
        self.assertEqual(reply.hq_music_url, hq_music_url)
        # 选填字段
        reply = _test_reply(Reply.MsgType.MUSIC, thumb_media_id=media_id)
        self.assertEqual(reply.thumb_media_id, media_id)
        self.assertIsNone(reply.title)
        self.assertIsNone(reply.description)
        self.assertIsNone(reply.music_url)
        self.assertIsNone(reply.hq_music_url)

        # 测试图文回复
        pass