class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_upload_image(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00", "imageId": "test-1234-image-id" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual(res.image_id, "test-1234-image-id") counter() self.tested.upload_image('test_image_url.jpg', callback=test_callback) self.assertEqual(counter.call_count, 1)
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_request_profile(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual(payload.options, { "field": "nickname", "agreements": ["cellphone", "address"] }) counter() self.tested.request_profile('test_id', 'nickname', agreements=['cellphone', 'address'], callback=test_callback) self.assertEqual(counter.call_count, 1)
class TestNaverTalkActionEvent(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_typing_on(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00", }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual(payload.user, 'test_user_id') self.assertEqual(payload.event, 'action') self.assertEqual(payload.options, {"action": "typingOn"}) counter() self.tested.typing_on('test_user_id', callback=test_callback) self.assertEqual(counter.call_count, 1) @responses.activate def test_typing_off(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00", }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual(payload.user, 'test_user_id') self.assertEqual(payload.event, 'action') self.assertEqual(payload.options, {"action": "typingOff"}) counter() self.tested.typing_off('test_user_id', callback=test_callback) self.assertEqual(counter.call_count, 1)
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_send_text(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { "event": "product", "options": { "ids": [1002324883, 1002793763, 2265658394, 2299323502], "displayType": "list" }, "user": "******" }) counter() self.tested.product_message( 'test_user_id', ids=[1002324883, 1002793763, 2265658394, 2299323502], display_type='list', callback=test_callback) self.assertEqual(counter.call_count, 1)
#-*- encoding:utf-8 -*- """ Example code for nta See how it works: https://talk.naver.com/ct/wc4qdz """ import os from flask import Flask, request from nta import NaverTalkApi, Template, Button from nta import NaverTalkApiError, NaverTalkPaymentError, NaverTalkApiConnectionError app = Flask(__name__) ntalk = NaverTalkApi('/1pVqCZARvWp5ThJ0K6D') @app.route('/', methods=['POST']) def app_enterance(): print("*" * 40) req = request.get_data(as_text=True) print('* Recieved Data:') print(req) try: ntalk.webhook_handler(req) except NaverTalkApiError as e: print(e) except NaverTalkApiConnectionError as e: print(e) except NaverTalkPaymentError as e: return 400 print("*" * 40)
def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token')
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_send_composite(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload.as_json_dict(), { 'event': 'send', 'user': '******', 'compositeContent': { 'compositeList': [{ 'title': 'test_title', 'description': 'test_descript', 'image': { 'imageUrl': 'test_image' }, 'elementList': { 'type': 'LIST', 'data': [{ 'title': 'test_ed_title', 'description': 'test_ed_descript', 'subDescription': 'test_ed_subdescript', 'image': { 'imageUrl': 'test_ed_image' }, 'button': { 'type': 'TEXT', 'data': { 'title': 'test' } } }] }, 'buttonList': None }] }, 'options': { 'notification': False } }) counter() self.tested.send( 'test_user_id', message=CompositeContent(composite_list=[ Composite(title='test_title', description='test_descript', image='test_image', element_list=ElementList([ ElementData( title='test_ed_title', description='test_ed_descript', sub_description='test_ed_subdescript', image='test_ed_image', button=ButtonText('test')) ])) ]), callback=test_callback) self.assertEqual(counter.call_count, 1) @responses.activate def test_send_composite_with_quick_reply(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload.as_json_dict(), { 'event': 'send', 'user': '******', 'compositeContent': { 'compositeList': [{ 'title': 'test_title', 'description': None, 'elementList': None, 'buttonList': None }], 'quickReply': { 'buttonList': [{ 'data': { 'code': 'PAYLOAD', 'title': 'text' }, 'type': 'TEXT' }, { 'data': { 'mobileUrl': None, 'title': 'text', 'url': 'PAYLOAD' }, 'type': 'LINK' }] } }, 'options': { 'notification': False } }) counter() self.tested.send('test_user_id', message=CompositeContent( composite_list=[Composite(title='test_title')]), quick_reply=QuickReply([{ 'type': 'TEXT', 'title': 'text', 'value': 'PAYLOAD' }, { 'type': 'LINK', 'title': 'text', 'value': 'PAYLOAD' }]), callback=test_callback) self.assertEqual(counter.call_count, 1) self.tested.send('test_user_id', message=CompositeContent( composite_list=[Composite(title='test_title')], quick_reply=[ ButtonText('text', 'PAYLOAD'), ButtonLink('text', 'PAYLOAD') ]), callback=test_callback) self.assertEqual(counter.call_count, 2) @responses.activate def test_composite_with_calendar(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): target = { "event": "send", "user": "******", "compositeContent": { "compositeList": [{ "title": "톡톡 레스토랑", "description": "파스타가 맛있는집", 'elementList': None, "buttonList": [{ "type": "CALENDAR", "data": { "title": "방문 날짜 선택하기", "code": "code_for_your_bot", "options": { "calendar": { "placeholder": "방문 날짜를 선택해주세요.", "start": "20180301", "end": "20180430", "disables": "1,20180309,20180315-20180316" } } } }] }] }, 'options': { 'notification': False } } self.assertEqual(target, payload.as_json_dict()) counter() self.tested.send( "test_user_id", message=CompositeContent(composite_list=[ Composite(title="톡톡 레스토랑", description="파스타가 맛있는집", button_list=[ ButtonCalendar( title="방문 날짜 선택하기", code="code_for_your_bot", placeholder="방문 날짜를 선택해주세요.", start="20180301", end="20180430", disables="1,20180309,20180315-20180316") ]) ]), callback=test_callback) self.assertEqual(counter.call_count, 1)
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_send_image(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { 'event': 'send', 'user': '******', 'imageContent': { 'imageUrl': 'test.jpg', }, 'options': { 'notification': False } }) counter() self.tested.send('test_user_id', ImageContent('test.jpg'), callback=test_callback) self.assertEqual(counter.call_count, 1) counter2 = mock.MagicMock() def test_image_id_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { 'event': 'send', 'user': '******', 'imageContent': { 'imageId': '1234test', }, 'options': { 'notification': False } }) counter2() self.tested.send('test_user_id', ImageContent(image_id='1234test'), callback=test_image_id_callback) self.assertEqual(counter2.call_count, 1) @responses.activate def test_send_image_with_quick_reply(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { 'event': 'send', 'user': '******', 'imageContent': { 'imageUrl': 'test.jpg', 'quickReply': { 'buttonList': [{ 'data': { 'code': 'PAYLOAD', 'title': 'text' }, 'type': 'TEXT' }, { 'data': { 'mobileUrl': None, 'title': 'text', 'url': 'PAYLOAD' }, 'type': 'LINK' }] } }, 'options': { 'notification': False } }) counter() self.tested.send('test_user_id', ImageContent('test.jpg'), quick_reply=QuickReply([{ 'type': 'TEXT', 'title': 'text', 'value': 'PAYLOAD' }, { 'type': 'LINK', 'title': 'text', 'value': 'PAYLOAD' }]), callback=test_callback) self.assertEqual(counter.call_count, 1) self.tested.send('test_user_id', ImageContent('test.jpg', quick_reply=QuickReply([ ButtonText('text', 'PAYLOAD'), ButtonLink('text', 'PAYLOAD') ])), callback=test_callback) self.assertEqual(counter.call_count, 2)
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_persistent_menu(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200 ) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual( payload, { "event": "persistentMenu", "menuContent": [{ "menus": [{ "type": "TEXT", "data": { "title": "챗봇 안내", "code": "CHATBOT_GUIDE" } }, { "type": "LINK", "data": { "title": "이벤트 페이지", "url": "http://your-pc-url.com/event", "mobileUrl": "http://your-mobile-url.com/event" } }, { "type": "LINK", "data": { "title": "전화하기", "url": "tel:021234567", "mobileUrl": None } }, { "type": "NESTED", "data": { "title": "공지사항", "menus": [{ "type": "LINK", "data": { "title": "교환/환불 안내", "url": "http://your-pc-url.com/guide", "mobileUrl": "http://your-mobile-url.com/guide" } }] } }] }] } ) counter() self.tested.persistent_menu( menus=[ Button.ButtonText(title='챗봇 안내', code='CHATBOT_GUIDE'), Button.ButtonLink( title='이벤트 페이지', url='http://your-pc-url.com/event', mobile_url='http://your-mobile-url.com/event' ), Button.ButtonLink( title='전화하기', url='tel:021234567' ), Button.ButtonNested( title='공지사항', menus=[ Button.ButtonLink( title="교환/환불 안내", url="http://your-pc-url.com/guide", mobile_url="http://your-mobile-url.com/guide" ) ] ) ], callback=test_callback ) self.assertEqual(counter.call_count, 1) @responses.activate def test_persistent_menu_with_None(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200 ) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual( payload, { "event": "persistentMenu", "menuContent": [] } ) counter() self.tested.persistent_menu(callback=test_callback) self.assertEqual(counter.call_count, 1)
class TestNaverTalkApi(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_connection_error_handle(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "message": "Internal Server Error" }, status=500 ) try: self.tested.send('test_id', 'test message') except NaverTalkApiConnectionError as e: self.assertEqual(e.status_code, 500) self.assertEqual(e.message, '{"message": "Internal Server Error"}') @responses.activate def test_error_with_detail_handle(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ 'success': False, 'resultCode': "02", 'resultMessage': "request json 문자열 파싱 에러" }, status=200 ) try: self.tested.send('test_id', 'test message') except NaverTalkApiError as e: self.assertEqual(e.status_code, 200) self.assertEqual(e.result_code, "02") self.assertEqual(e.message, 'request json 문자열 파싱 에러') @responses.activate def test_error_handle_get_user_profile(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ 'success': False, 'resultCode': "02", 'resultMessage': "request json 문자열 파싱 에러" }, status=200 ) try: self.tested.request_profile('test_id', 'nickname') except NaverTalkApiError as e: self.assertEqual(e.status_code, 200) self.assertEqual(e.result_code, "02") self.assertEqual(e.message, 'request json 문자열 파싱 에러') self.assertEqual("%s" % e, "<NaverTalkApiError [request json 문자열 파싱 에러]>") @responses.activate def test_error_handle_upload_image_url(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ 'success': False, 'resultCode': "IMG-99", 'resultMessage': "이미지 업로드 중 에러" }, status=200 ) try: self.tested.upload_image('https://example.com/test.jpg') except NaverTalkApiError as e: self.assertEqual(e.status_code, 200) self.assertEqual(e.result_code, "IMG-99") self.assertEqual(e.message, "이미지 업로드 중 에러") self.assertEqual("%s" % e, "<NaverTalkApiError [이미지 업로드 중 에러]>") def test_callback_error(self): with self.assertRaises(ValueError): @self.tested.callback('Hello') def callback_test(event): pass def test_naver_pay(self): req = { "event": "pay_complete", "user": "******", "options": { "paymentResult": { "code" : "Success", "paymentId" : "20170811D3adfaasLL", "merchantPayKey" : "bot-custom-pay-key-1234", "merchantUserKey" : "al-2eGuGr5WQOnco1_V-FQ", } } } @self.tested.handle_pay_complete def pay_complete_fail_error(event): raise NaverTalkPaymentError('재고 없음') try: self.tested.webhook_handler(json.dumps(req)) except NaverTalkPaymentError as e: self.assertEqual(e.message, "재고 없음") self.assertEqual("%s" % e, "<NaverTalkPaymentError [재고 없음]>")
#-*- encoding:utf-8 -*- """ In Persistent Menu, Option Button is not allowed. Sad.. How to register persistent menu: python persistent_menu_example.py """ import os from nta import NaverTalkApi, Button NAVER_TALK_ACCESS_TOKEN = os.environ['naver_talk_access_token'] ntalk = NaverTalkApi(NAVER_TALK_ACCESS_TOKEN) def my_callback(res, payload): #callback function for showing result of send persistent menu payload print(res) ntalk.persistent_menu(menus=[ Button.ButtonText('고정 메뉴 테스트', 'PersistentMenu'), Button.ButtonLink('Link to NTA', 'https://github.com/HwangWonYo/naver_talk_sdk'), Button.ButtonNested(title='버튼을 품은 버튼 이라는데?', menus=[ Button.ButtonText('아무 의미 없는 버튼'), Button.ButtonText('카드뷰 보기', 'CardView'),
#-*- encoding:utf-8 -*- """ Example code for nta See how it works: https://talk.naver.com/ct/wc4qdz """ import os from flask import Flask, request from nta import NaverTalkApi, Template, Button from nta import NaverTalkApiError, NaverTalkPaymentError, NaverTalkApiConnectionError NAVER_TALK_ACCESS_TOKEN = os.environ['naver_talk_access_token'] app = Flask(__name__) ntalk = NaverTalkApi(NAVER_TALK_ACCESS_TOKEN) @app.route('/', methods=['POST']) def app_enterance(): print("*" * 40) req = request.get_data(as_text=True) print('* Recieved Data:') print(req) try: ntalk.webhook_handler(req) except NaverTalkApiError as e: print(e) except NaverTalkApiConnectionError as e: print(e) except NaverTalkPaymentError as e: return 400
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_thread_taking(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { 'event': 'handover', 'user': '******', 'options': { "control": "takeThread", "metadata": "" } }) counter() self.tested.take_thread(user_id='test_user_id', callback=test_callback) self.assertEqual(counter.call_count, 1) @responses.activate def test_thread_passing(self): responses.add(responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { 'event': 'handover', 'user': '******', 'options': { "control": "passThread", "targetId": 1 } }) counter() self.tested.pass_thread(user_id='test_user_id', callback=test_callback) self.assertEqual(counter.call_count, 1)
class TestNaverTalkAPI(unittest.TestCase): def setUp(self): self.tested = NaverTalkApi('test_naver_talk_access_token') @responses.activate def test_send_text(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200 ) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { 'event': 'send', 'user': '******', 'textContent': { 'text': 'test_str_message', 'code': None, 'inputType': None }, 'options': { 'notification': False } } ) counter() self.tested.send( 'test_user_id', 'test_str_message', callback=test_callback ) self.assertEqual(counter.call_count, 1) self.tested.send( user_id='test_user_id', message=TextContent('test_str_message'), callback=test_callback ) self.assertEqual(counter.call_count, 2) @responses.activate def test_send_with_quick_reply(self): responses.add( responses.POST, NaverTalkApi.DEFAULT_API_ENDPOINT, json={ "success": True, "resultCode": "00" }, status=200 ) counter = mock.MagicMock() def test_callback(res, payload): self.assertEqual(res.result_code, "00") self.assertEqual(res.success, True) self.assertEqual( payload, { "event": "send", "user": "******", "options": { "notification": False }, "textContent": { "code": None, "inputType": None, "quickReply": { "buttonList": [{ "data": { "code": "PAYLOAD", "title": "text"}, "type": "TEXT"}, { "data": { "mobileUrl": None, "title": "text", "url": "PAYLOAD"}, "type": "LINK"}]}, "text": "test_str_message"} } ) counter() self.tested.send( 'test_user_id', 'test_str_message', quick_reply=QuickReply( [ {'type': 'TEXT', 'title': 'text', 'value': 'PAYLOAD'}, {'type': 'LINK', 'title': 'text', 'value': 'PAYLOAD'} ] ), callback=test_callback ) self.assertEqual(counter.call_count, 1) self.tested.send( 'test_user_id', 'test_str_message', quick_reply=[ ButtonText('text', 'PAYLOAD'), ButtonLink('text', 'PAYLOAD') ], callback=test_callback ) self.assertEqual(counter.call_count, 2)