Esempio n. 1
0
 def test_init_client_with_access_token(self):
     client = WeChatClient(self.corp_id, self.secret, access_token="abcdef")
     assert client
Esempio n. 2
0
class WeChatClientTestCase(unittest.TestCase):
    corp_id = "123456"
    secret = "123456"

    def setUp(self):
        self.client = WeChatClient(self.corp_id, self.secret)

    def test_init_client_with_access_token(self):
        client = WeChatClient(self.corp_id, self.secret, access_token="abcdef")
        assert client

    def test_fetch_access_token(self):
        with HTTMock(wechat_api_mock):
            token = self.client.fetch_access_token()
            self.assertEqual("1234567890", token["access_token"])
            self.assertEqual(7200, token["expires_in"])
            self.assertEqual("1234567890", self.client.access_token)

    def test_get_wechat_ips(self):
        with HTTMock(wechat_api_mock):
            res = self.client.misc.get_wechat_ips()
            self.assertEqual(["127.0.0.1"], res)

    def test_department_create(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.create("Test")
            self.assertEqual(2, res["id"])

    def test_department_update(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.update(2, "Test 1")
            self.assertEqual(0, res["errcode"])

    def test_department_delete(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.delete(2)
            self.assertEqual(0, res["errcode"])

    def test_department_get(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.get()
            self.assertEqual(2, len(res))

    def test_department_get_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.get_users(2)
            self.assertEqual(1, len(res))

    def test_department_get_users_detail(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.get_users(2, simple=False)
            self.assertEqual(1, len(res))

    def test_department_map_users(self):
        with HTTMock(wechat_api_mock):
            users = self.client.department.get_map_users(2, key="email")
            self.assertEqual(users,
                             {"*****@*****.**": "zhangthree-userid"})

            users = self.client.department.get_map_users(key="mobile")
            self.assertEqual(users, {"15723333333": "zhangthree-userid"})

    def test_tag_create(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.create("test")
            self.assertEqual("1", res["tagid"])

    def test_tag_update(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.update(1, "test")
            self.assertEqual(0, res["errcode"])

    def test_tag_delete(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.delete(1)
            self.assertEqual(0, res["errcode"])

    def test_tag_get_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.get_users(1)
            self.assertEqual(1, len(res["userlist"]))
            self.assertEqual(1, len(res["partylist"]))

    def test_tag_add_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.add_users(1, [1, 2, 3])
            self.assertEqual(0, res["errcode"])

    def test_tag_delete_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.delete_users(1, [1, 2, 3])
            self.assertEqual(0, res["errcode"])

    def test_tag_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.list()
            self.assertEqual(2, len(res))

    def test_batch_sync_user(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.sync_user("http://example.com", "123456",
                                              "123456", "12345678")
            self.assertEqual(0, res["errcode"])

    def test_batch_replace_user(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.replace_user("http://example.com",
                                                 "123456", "123456",
                                                 "12345678")
            self.assertEqual(0, res["errcode"])

    def test_batch_replace_party(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.replace_party("http://example.com",
                                                  "123456", "123456",
                                                  "12345678")
            self.assertEqual(0, res["errcode"])

    def test_batch_get_result(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.get_result("123456")
            self.assertEqual(0, res["errcode"])
            self.assertEqual(1, res["status"])

    def test_jsapi_get_ticket(self):
        with HTTMock(wechat_api_mock):
            result = self.client.jsapi.get_ticket()
            self.assertEqual(
                "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",  # NOQA
                result["ticket"],
            )
            self.assertEqual(7200, result["expires_in"])

    def test_jsapi_get_jsapi_signature(self):
        noncestr = "Wm3WZYTPz0wzccnW"
        ticket = "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg"  # NOQA
        timestamp = 1414587457
        url = "http://mp.weixin.qq.com?params=value"
        signature = self.client.jsapi.get_jsapi_signature(
            noncestr, ticket, timestamp, url)
        self.assertEqual("0f9de62fce790f9a083d5c99e95740ceb90c27ed", signature)

    def test_user_convert_to_openid(self):
        with HTTMock(wechat_api_mock):
            res = self.client.user.convert_to_openid("zhangsan")
            self.assertEqual("oDOGms-6yCnGrRovBj2yHij5JL6E", res["openid"])
            self.assertEqual("wxf874e15f78cc84a7", res["appid"])

    def test_user_convert_to_user_id(self):
        with HTTMock(wechat_api_mock):
            user_id = self.client.user.convert_to_user_id(
                "oDOGms-6yCnGrRovBj2yHij5JL6E")
            self.assertEqual("zhangsan", user_id)

    def test_upload_media(self):
        media_file = io.StringIO("nothing")
        with HTTMock(wechat_api_mock):
            media = self.client.media.upload("image", media_file)
            self.assertEqual("image", media["type"])
            self.assertEqual("12345678", media["media_id"])

    def test_reraise_requests_exception(self):
        @urlmatch(netloc=r"(.*\.)?qyapi\.weixin\.qq\.com$")
        def _wechat_api_mock(url, request):
            return {"status_code": 404, "content": "404 not found"}

        try:
            with HTTMock(_wechat_api_mock):
                self.client.user.convert_to_openid("zhangsan")
        except WeChatClientException as e:
            self.assertEqual(404, e.response.status_code)

    def test_service_get_provider_token(self):
        with HTTMock(wechat_api_mock):
            res = self.client.service.get_provider_token("provider_secret")

        self.assertEqual(7200, res["expires_in"])
        self.assertEqual("enLSZ5xxxxxxJRL", res["provider_access_token"])

    def test_service_get_login_info(self):
        with HTTMock(wechat_api_mock):
            res = self.client.service.get_login_info("enLSZ5xxxxxxJRL",
                                                     "auth_code")

        self.assertTrue(res["is_sys"])
        self.assertTrue(res["is_inner"])

    def test_external_contact_get_follow_user_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_follow_user_list()
            self.assertEqual(0, res["errcode"])

    def test_external_contact_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.list("userid")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get("external_userid")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_add_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.add_contact_way(
                1,
                1,
                1,
                "remark",
                True,
                "state",
                ["UserID1", "UserID2"],
                ["PartyID1", "PartyID2"],
            )
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_contact_way(
                "42b34949e138eb6e027c123cba77fad7")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_update_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.update_contact_way(
                "42b34949e138eb6e027c123cba77fad7",
                "渠道客户",
                True,
                1,
                "teststate",
                ["UserID1", "UserID2", "UserID3"],
                ["PartyID1", "PartyID2"],
            )
            self.assertEqual(0, res["errcode"])

    def test_external_contact_del_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.del_contact_way(
                "42b34949e138eb6e027c123cba77fad7")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_add_msg_template(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.add_msg_template({
                "external_userid": [
                    "woAJ2GCAAAXtWyujaWJHDDGi0mACas1w",
                    "wmqfasd1e1927831291723123109r712",
                ],
                "sender":
                "zhangsan",
                "text": {
                    "content": "文本消息内容"
                },
                "image": {
                    "media_id": "MEDIA_ID"
                },
            })
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_group_msg_result(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_group_msg_result(
                "msgGCAAAXtWyujaWJHDDGi0mACas1w")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_user_behavior_data(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_user_behavior_data(
                ["zhangsan", "lisi"], 1536508800, 1536940800)
            self.assertEqual(0, res["errcode"])

    def test_external_contact_send_welcome_msg(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.send_welcome_msg({
                "welcome_code":
                "CALLBACK_CODE",
                "text": {
                    "content": "文本消息内容"
                },
                "image": {
                    "media_id": "MEDIA_ID"
                },
                "link": {
                    "title": "消息标题",
                    "picurl": "https://example.pic.com/path",
                    "desc": "消息描述",
                    "url": "https://example.link.com/path",
                },
                "miniprogram": {
                    "title": "消息标题",
                    "pic_media_id": "MEDIA_ID",
                    "appid": "wx8bd80126147df384",
                    "page": "/path/index",
                },
            })
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_unassigned_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_unassigned_list(0, 100)
            self.assertEqual(0, res["errcode"])

    def test_external_contact_transfer(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.transfer(
                "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w", "zhangsan", "lisi")
            self.assertEqual(0, res["errcode"])
Esempio n. 3
0
 def setUp(self):
     self.client = WeChatClient(self.corp_id, self.secret)
Esempio n. 4
0
class WeChatClientTestCase(unittest.TestCase):
    corp_id = "123456"
    secret = "123456"

    def setUp(self):
        self.client = WeChatClient(self.corp_id, self.secret)

    def test_init_client_with_access_token(self):
        client = WeChatClient(self.corp_id, self.secret, access_token="abcdef")
        self.assertTrue(client)

    def test_fetch_access_token(self):
        with HTTMock(wechat_api_mock):
            token = self.client.fetch_access_token()
            self.assertEqual("1234567890", token["access_token"])
            self.assertEqual(7200, token["expires_in"])
            self.assertEqual("1234567890", self.client.access_token)

    def test_get_wechat_ips(self):
        with HTTMock(wechat_api_mock):
            res = self.client.misc.get_wechat_ips()
            self.assertEqual(["127.0.0.1"], res)

    def test_department_create(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.create("Test")
            self.assertEqual(2, res["id"])

    def test_department_update(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.update(2, "Test 1")
            self.assertEqual(0, res["errcode"])

    def test_department_delete(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.delete(2)
            self.assertEqual(0, res["errcode"])

    def test_department_get(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.get()
            self.assertEqual(2, len(res))

    def test_department_get_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.get_users(2)
            self.assertEqual(1, len(res))

    def test_department_get_users_detail(self):
        with HTTMock(wechat_api_mock):
            res = self.client.department.get_users(2, simple=False)
            self.assertEqual(1, len(res))

    def test_department_map_users(self):
        with HTTMock(wechat_api_mock):
            users = self.client.department.get_map_users(2, key="email")
            self.assertEqual(users,
                             {"*****@*****.**": "zhangthree-userid"})

            users = self.client.department.get_map_users(key="mobile")
            self.assertEqual(users, {"15723333333": "zhangthree-userid"})

    def test_tag_create(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.create("test")
            self.assertEqual("1", res["tagid"])

    def test_tag_create_with_invalid_tag_id(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(ValueError,
                              self.client.tag.create,
                              tag_id=-1,
                              name="xxx")

    def test_tag_create_with_invalid_tag_name(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(ValueError,
                              self.client.tag.create,
                              name="x" * 33)

    def test_tag_update(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.update(1, "test")
            self.assertEqual(0, res["errcode"])

    def test_tag_delete(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.delete(1)
            self.assertEqual(0, res["errcode"])

    def test_tag_get_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.get_users(1)
            self.assertEqual(1, len(res["userlist"]))
            self.assertEqual(1, len(res["partylist"]))

    def test_tag_add_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.add_users(1, [1, 2, 3])
            self.assertEqual(0, res["errcode"])

    def test_tag_add_users_with_depts(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.add_users(1, department_ids=[1, 2, 3])
            self.assertEqual(0, res["errcode"])

    def test_tag_add_users_with_empty_user_and_dept(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(
                ValueError,
                self.client.tag.add_users,
                tag_id=1,
            )

    def test_tag_add_users_with_too_more_users_or_depts(self):
        with HTTMock(wechat_api_mock):
            user_ids = [str(i) for i in range(1001)]
            department_ids = [i for i in range(101)]
            self.assertRaises(ValueError,
                              self.client.tag.add_users,
                              tag_id=1,
                              user_ids=user_ids)
            self.assertRaises(ValueError,
                              self.client.tag.add_users,
                              tag_id=1,
                              department_ids=department_ids)

    def test_tag_delete_users(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.delete_users(1, [1, 2, 3])
            self.assertEqual(0, res["errcode"])

    def test_tag_delete_users_with_delete_depts(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.delete_users(1, department_ids=[1, 2, 3])
            self.assertEqual(0, res["errcode"])

    def test_tag_delete_users_with_empty_users_and_depts(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(ValueError,
                              self.client.tag.delete_users,
                              tag_id=1)

    def test_tag_delete_users_with_too_more_user_or_dept(self):
        with HTTMock(wechat_api_mock):
            user_ids = [str(i) for i in range(1001)]
            department_ids = [i for i in range(101)]
            self.assertRaises(ValueError,
                              self.client.tag.delete_users,
                              tag_id=1,
                              user_ids=user_ids)
            self.assertRaises(ValueError,
                              self.client.tag.delete_users,
                              tag_id=1,
                              department_ids=department_ids)

    def test_tag_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.tag.list()
            self.assertEqual(2, len(res))

    def test_batch_sync_user(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.sync_user("http://example.com", "123456",
                                              "123456", "12345678")
            self.assertEqual(0, res["errcode"])

    def test_batch_replace_user(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.replace_user("http://example.com",
                                                 "123456", "123456",
                                                 "12345678")
            self.assertEqual(0, res["errcode"])

    def test_batch_replace_party(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.replace_party("http://example.com",
                                                  "123456", "123456",
                                                  "12345678")
            self.assertEqual(0, res["errcode"])

    def test_batch_get_result(self):
        with HTTMock(wechat_api_mock):
            res = self.client.batch.get_result("123456")
            self.assertEqual(0, res["errcode"])
            self.assertEqual(1, res["status"])

    def test_jsapi_get_ticket(self):
        with HTTMock(wechat_api_mock):
            result = self.client.jsapi.get_ticket()
            self.assertEqual(
                "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",  # NOQA
                result["ticket"],
            )
            self.assertEqual(7200, result["expires_in"])

    def test_jsapi_get_jsapi_signature(self):
        noncestr = "Wm3WZYTPz0wzccnW"
        ticket = "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg"  # NOQA
        timestamp = 1414587457
        url = "http://mp.weixin.qq.com?params=value"
        signature = self.client.jsapi.get_jsapi_signature(
            noncestr, ticket, timestamp, url)
        self.assertEqual("0f9de62fce790f9a083d5c99e95740ceb90c27ed", signature)

    def test_user_convert_to_openid(self):
        with HTTMock(wechat_api_mock):
            res = self.client.user.convert_to_openid("zhangsan")
            self.assertEqual("oDOGms-6yCnGrRovBj2yHij5JL6E", res["openid"])
            self.assertEqual("wxf874e15f78cc84a7", res["appid"])

    def test_user_convert_to_user_id(self):
        with HTTMock(wechat_api_mock):
            user_id = self.client.user.convert_to_user_id(
                "oDOGms-6yCnGrRovBj2yHij5JL6E")
            self.assertEqual("zhangsan", user_id)

    def test_user_get_active_stat(self):
        with HTTMock(wechat_api_mock):
            active_stat = self.client.user.get_active_stat("2020-03-27")
            self.assertEqual(active_stat, 100)

    def test_user_join_qrcode(self):
        with HTTMock(wechat_api_mock):
            qrcode_url = self.client.user.get_join_qrcode()
            self.assertIsNotNone(qrcode_url)

    def test_upload_media(self):
        media_file = io.StringIO("nothing")
        with HTTMock(wechat_api_mock):
            media = self.client.media.upload("image", media_file)
            self.assertEqual("image", media["type"])
            self.assertEqual("12345678", media["media_id"])

    def test_reraise_requests_exception(self):
        @urlmatch(netloc=r"(.*\.)?qyapi\.weixin\.qq\.com$")
        def _wechat_api_mock(url, request):
            return {"status_code": 404, "content": "404 not found"}

        try:
            with HTTMock(_wechat_api_mock):
                self.client.user.convert_to_openid("zhangsan")
        except WeChatClientException as e:
            self.assertEqual(404, e.response.status_code)

    def test_service_get_provider_token(self):
        with HTTMock(wechat_api_mock):
            res = self.client.service.get_provider_token("provider_secret")

        self.assertEqual(7200, res["expires_in"])
        self.assertEqual("enLSZ5xxxxxxJRL", res["provider_access_token"])

    def test_service_get_login_info(self):
        with HTTMock(wechat_api_mock):
            res = self.client.service.get_login_info("enLSZ5xxxxxxJRL",
                                                     "auth_code")

        self.assertTrue(res["is_sys"])
        self.assertTrue(res["is_inner"])

    def test_external_contact_get_follow_user_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_follow_user_list()
            self.assertEqual(0, res["errcode"])

    def test_external_contact_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.list("userid")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get("external_userid")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_add_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.add_contact_way(
                1,
                1,
                1,
                "remark",
                True,
                "state",
                ["UserID1", "UserID2"],
                ["PartyID1", "PartyID2"],
            )
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_contact_way(
                "42b34949e138eb6e027c123cba77fad7")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_update_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.update_contact_way(
                "42b34949e138eb6e027c123cba77fad7",
                "渠道客户",
                True,
                1,
                "teststate",
                ["UserID1", "UserID2", "UserID3"],
                ["PartyID1", "PartyID2"],
            )
            self.assertEqual(0, res["errcode"])

    def test_external_contact_del_contact_way(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.del_contact_way(
                "42b34949e138eb6e027c123cba77fad7")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_add_msg_template(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.add_msg_template({
                "external_userid": [
                    "woAJ2GCAAAXtWyujaWJHDDGi0mACas1w",
                    "wmqfasd1e1927831291723123109r712"
                ],
                "sender":
                "zhangsan",
                "text": {
                    "content": "文本消息内容"
                },
                "image": {
                    "media_id": "MEDIA_ID"
                },
            })
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_group_msg_result(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_group_msg_result(
                "msgGCAAAXtWyujaWJHDDGi0mACas1w")
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_user_behavior_data(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_user_behavior_data(
                ["zhangsan", "lisi"], 1536508800, 1536940800)
            self.assertEqual(0, res["errcode"])

    def test_external_contact_send_welcome_msg(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.send_welcome_msg({
                "welcome_code":
                "CALLBACK_CODE",
                "text": {
                    "content": "文本消息内容"
                },
                "image": {
                    "media_id": "MEDIA_ID"
                },
                "link": {
                    "title": "消息标题",
                    "picurl": "https://example.pic.com/path",
                    "desc": "消息描述",
                    "url": "https://example.link.com/path",
                },
                "miniprogram": {
                    "title": "消息标题",
                    "pic_media_id": "MEDIA_ID",
                    "appid": "wx8bd80126147df384",
                    "page": "/path/index",
                },
            })
            self.assertEqual(0, res["errcode"])

    def test_external_contact_get_unassigned_list(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.get_unassigned_list(0, 100)
            self.assertEqual(0, res["errcode"])

    def test_external_contact_transfer(self):
        with HTTMock(wechat_api_mock):
            res = self.client.external_contact.transfer(
                "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w", "zhangsan", "lisi")
            self.assertEqual(0, res["errcode"])

    def test_oa_get_dial_record(self):
        with HTTMock(wechat_api_mock):
            res = self.client.oa.get_dial_record(start_time=1536508800,
                                                 end_time=1536940800,
                                                 offset=0,
                                                 limit=100)
            self.assertIsInstance(
                res, dict, msg="the returned result should be dict type")
            self.assertEqual(0, res["errcode"])

    def test_os_get_dial_record_with_invalid_timestamp(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(
                ValueError,
                self.client.oa.get_dial_record,
                start_time=1536940800,
                end_time=1536508800,
                offset=0,
                limit=100,
            )

    def test_oa_get_checkin_data(self):
        with HTTMock(wechat_api_mock):
            res = self.client.oa.get_checkin_data(
                data_type=3,
                start_time=1492617600,
                end_time=1492790400,
                userid_list=["james", "paul"])
            self.assertIsInstance(
                res, dict, msg="the returned result should be dict type")
            self.assertEqual(0, res["errcode"])

    def test_oa_get_checkin_data_with_invalid_datatype(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(
                ValueError,
                self.client.oa.get_checkin_data,
                data_type=5,
                start_time=1492617600,
                end_time=1492790400,
                userid_list=["james", "paul"],
            )

    def test_oa_get_checkin_data_with_invalid_timestamp(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(
                ValueError,
                self.client.oa.get_checkin_data,
                data_type=5,
                start_time=1492790400,
                end_time=1492617600,
                userid_list=["james", "paul"],
            )

    def test_oa_get_checkin_option(self):
        with HTTMock(wechat_api_mock):
            res = self.client.oa.get_checkin_option(
                datetime=1511971200, userid_list=["james", "paul"])
            self.assertIsInstance(
                res, dict, msg="the returned result should be dict type")
            self.assertEqual(0, res["errcode"])

    def test_oa_get_open_approval_data(self):
        with HTTMock(wechat_api_mock):
            res = self.client.oa.get_open_approval_data(
                third_no="201806010001")
            self.assertIsInstance(
                res, dict, msg="the returned result should be dict type")
            self.assertEqual(0, res["errcode"])

    def test_invoice_get_info(self):
        with HTTMock(wechat_api_mock):
            res = self.client.invoice.get_info(card_id="CARDID",
                                               encrypt_code="ENCRYPTCODE")
            self.assertEqual(0, res["errcode"])

    def test_invoice_get_info_batch(self):
        with HTTMock(wechat_api_mock):
            item_list = [
                {
                    "card_id": "CARDID1",
                    "encrypt_code": "ENCRYPTCODE1"
                },
                {
                    "card_id": "CARDID2",
                    "encrypt_code": "ENCRYPTCODE2"
                },
            ]
            res = self.client.invoice.get_info_batch(item_list)
            self.assertEqual(0, res["errcode"])

    def test_invoice_get_info_batch_with_empty_item_list(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(ValueError,
                              self.client.invoice.get_info_batch,
                              item_list=[])

    def test_invoice_update_status(self):
        with HTTMock(wechat_api_mock):
            card_id = "CARDID"
            encrypt_code = "ENCRYPTCODE"
            reimburse_status = "INVOICE_REIMBURSE_INIT"
            res = self.client.invoice.update_status(card_id, encrypt_code,
                                                    reimburse_status)
            self.assertEqual(0, res["errcode"])

    def test_invoice_update_status_with_empty_status(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(
                ValueError,
                self.client.invoice.update_status,
                card_id="CARDID",
                encrypt_code="ENCRYPTCODE",
                reimburse_status="",
            )

    def test_invoice_update_status_with_invalid_status(self):
        with HTTMock(wechat_api_mock):
            self.assertRaises(
                ValueError,
                self.client.invoice.update_status,
                card_id="CARDID",
                encrypt_code="ENCRYPTCODE",
                reimburse_status="INVALID_STATUS",
            )

    def test_invoice_update_status_batch(self):
        with HTTMock(wechat_api_mock):
            openid = "OPENID"
            reimburse_status = "INVOICE_REIMBURSE_INIT"
            invoice_list = [
                {
                    "card_id": "cardid_1",
                    "encrypt_code": "encrypt_code_1"
                },
                {
                    "card_id": "cardid_2",
                    "encrypt_code": "encrypt_code_2"
                },
            ]
            res = self.client.invoice.update_status_batch(
                openid, reimburse_status, invoice_list)
            self.assertEqual(0, res["errcode"])

    def test_invoice_update_status_batch_with_invalid_status(self):
        with HTTMock(wechat_api_mock):
            openid = "OPENID"
            reimburse_status = ""
            invoice_list = [
                {
                    "card_id": "cardid_1",
                    "encrypt_code": "encrypt_code_1"
                },
                {
                    "card_id": "cardid_2",
                    "encrypt_code": "encrypt_code_2"
                },
            ]
            self.assertRaises(
                ValueError,
                self.client.invoice.update_status_batch,
                openid=openid,
                reimburse_status=reimburse_status,
                invoice_list=invoice_list,
            )

    def test_invoice_update_status_batch_with_empty_invoice_list(self):
        with HTTMock(wechat_api_mock):
            openid = "OPENID"
            reimburse_status = "INVOICE_REIMBURSE_INIT"
            invoice_list = []
            self.assertRaises(
                ValueError,
                self.client.invoice.update_status_batch,
                openid=openid,
                reimburse_status=reimburse_status,
                invoice_list=invoice_list,
            )