def test_forwardable():
	# 전달하기 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-9
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"basicCard": {
					"title": "보물상자",
					"description": "보물상자 안에는 뭐가 있을까",
					"thumbnail": {
						"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg"
					},
					"profile": {
						"imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM",
						"nickname": "보물상자"
					},
					"forwardable": True
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	thumb = Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg')
	profile = Profile('보물상자', 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM')
	card = BasicCard(thumb, '보물상자', '보물상자 안에는 뭐가 있을까', profile=profile)
	card.set_forwardable(True)
	sb.append(card)
	assert(trueDict == sb.to_dict())
def test_commerceCard():
	# 커머스 카드 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-7
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"commerceCard": {
						"description": "따끈따끈한 보물 상자 팝니다",
						"price": 10000,
						"discount": 1000,
						"currency": "won",
						"thumbnails": [
							{
							"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg",
							"link": {
								"web": "https://store.kakaofriends.com/kr/products/1542"
								}
							}
						],
						"profile": {
							"imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM",
							"nickname": "보물상자 팝니다"
						},
						"buttons": [
							{
								"label": "구매하기",
								"action": "webLink",
								"webLinkUrl": "https://store.kakaofriends.com/kr/products/1542"
							},
							{
								"label": "전화하기",
								"action": "phone",
								"phoneNumber": "354-86-00070"
							},
							{
								"label": "공유하기",
								"action": "share"
							}
						]
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	thumbnails = [Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg',
							Link(web='https://store.kakaofriends.com/kr/products/1542'))]
	profile = Profile('보물상자 팝니다', 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM')
	btn1 = WeblinkButton('구매하기', 'https://store.kakaofriends.com/kr/products/1542')
	btn2 = PhoneButton('전화하기', '354-86-00070')
	btn3 = ShareButton('공유하기')
	buttons = [btn1, btn2, btn3]
	commerceCard = CommerceCard('따끈따끈한 보물 상자 팝니다', 10000, 'won', thumbnails, buttons, 1000, profile=profile)
	sb.append(commerceCard)
	assert(trueDict == sb.to_dict())
def test_basiccard():
	# 베이직 카드 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-6
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
			{
				"basicCard": {
					"title": "보물상자",
					"description": "보물상자 안에는 뭐가 있을까",
					"thumbnail": {
						"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg"
					},
					"profile": {
						"imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM",
						"nickname": "보물상자"
					},
					"social": {
						"like": 1238,
						"comment": 8,
						"share": 780
					},
					"buttons": [
						{
							"action": "message",
							"label": "열어보기",
							"messageText": "짜잔! 우리가 찾던 보물입니다"
						},
						{
							"action":  "webLink",
							"label": "구경하기",
							"webLinkUrl": "https://e.kakao.com/t/hello-ryan"
						}
					]
				}
			}
			]
		}
	}
	sb = SkillResponseBuilder()
	basicCard = BasicCard(
		thumbnail=Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg'),
		title='보물상자',
		description='보물상자 안에는 뭐가 있을까',
		profile=Profile('보물상자', 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM'),
		social=Social(1238, 8, 780),
		buttons=[
			MessageButton('열어보기', '짜잔! 우리가 찾던 보물입니다'),
			WeblinkButton('구경하기', 'https://e.kakao.com/t/hello-ryan')
		])
	sb.append(basicCard)
	assert(trueDict == sb.to_dict())
def test_data():
	# 데이터 테스트
	# https://i.kakao.com/docs/skill-block#step-1-%EC%8A%A4%ED%82%AC-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EC%9D%91%EB%8B%B5%EA%B0%92-%EC%84%A4%EC%A0%95
	# 스킬 서버에서 응답값 설정
	trueDict = {
		"version": "2.0",
		"data": {
			"msg": "HI",
			"name": "Ryan",
			"position": "Senior Managing Director"
		}
	}
	sb = SkillResponseBuilder()
	data = Data({'msg': 'HI', 'name': 'Ryan', 'position': 'Senior Managing Director'})
	sb.append(data)
	assert(trueDict == sb.to_dict())
def test_simpletext():
	# 간단 텍스트 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-4
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"simpleText": {
						"text": "간단한 텍스트 요소입니다."
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	sb.append(SimpleText('간단한 텍스트 요소입니다.'))
	assert(trueDict == sb.to_dict())
def test_simpleimage():
	# 간단 이미지 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-5
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"simpleImage": {
						"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg",
						"altText": "보물상자입니다"
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	sb.append(SimpleImage('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg', '보물상자입니다'))
	assert(trueDict == sb.to_dict())
def test_context():
	# 컨텍스트 컨트롤 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-3
	trueDict = {
		"version": "2.0",
		"context": {
			"values": [
				{
					"name": "abc",
					"lifeSpan": 10,
					"params": {
						"key1": "val1",
						"key2": "val2"
					}
				},
				{
					"name": "def",
					"lifeSpan": 5,
					"params": {
						"key3": "1",
						"key4": "true",
						"key5": "{\"jsonKey\": \"jsonVal\"}"
					}
				},
				{
					"name": "ghi",
					"lifeSpan": 0
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	cv1 = ContextValue('abc', 10, {'key1': 'val1', 'key2': 'val2'})
	cv2 = ContextValue('def', 5, {'key3': '1', 'key4': 'true', 'key5': '{"jsonKey": "jsonVal"}'})
	cv3 = ContextValue('ghi', 0)
	cc = ContextControl([cv1, cv2, cv3])
	sb.append(cc)
	assert(trueDict == sb.to_dict())
def test_carouselheader():
	# 케로셀 헤더 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-10
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"carousel": {
						"type": "commerceCard",
						"header": {
							"title": "커머스 카드\n케로셀 헤드 예제",
							"thumbnail": {
							"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg"
							}
						},
						"items": [
							{
								"description": "따끈따끈한 보물 상자 팝니다",
								"price": 10000,
								"discount": 1000,
								"currency": "won",
								"thumbnails": [
									{
										"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg",
										"link": {
											"web": "https://store.kakaofriends.com/kr/products/1542"
										}
									}
								],
								"profile": {
									"imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM",
									"nickname": "보물상자 팝니다"
								},
								"buttons": [
									{
										"label": "구매하기",
										"action": "webLink",
										"webLinkUrl": "https://store.kakaofriends.com/kr/products/1542"
									},
									{
										"label": "전화하기",
										"action": "phone",
										"phoneNumber": "354-86-00070"
									},
									{
										"label": "공유하기",
										"action": "share"
									}
								]
							},
							{
								"description": "따끈따끈한 보물 상자 팝니다",
								"price": 10000,
								"discount": 1000,
								"currency": "won",
								"thumbnails": [
									{
										"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg",
										"link": {
											"web": "https://store.kakaofriends.com/kr/products/1542"
										}
									}
								],
								"profile": {
									"imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM",
									"nickname": "보물상자 팝니다"
								},
								"buttons": [
									{
										"label": "구매하기",
										"action": "webLink",
										"webLinkUrl": "https://store.kakaofriends.com/kr/products/1542"
									},
									{
										"label": "전화하기",
										"action": "phone",
										"phoneNumber": "354-86-00070"
									},
									{
										"label": "공유하기",
										"action": "share"
									}
								]
							}
						]
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	cc = CommerceCard(description='따끈따끈한 보물 상자 팝니다',
					  price=10000,
					  discount=1000,
					  currency='won',
					  thumbnails=[Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg',
					  			  Link(web='https://store.kakaofriends.com/kr/products/1542'))],
					  profile=Profile('보물상자 팝니다', 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4BJ9LU4Ikr_EvZLmijfcjzQKMRCJ2bO3A8SVKNuQ78zu2KOqM'),
					  buttons=[
						  WeblinkButton('구매하기', 'https://store.kakaofriends.com/kr/products/1542'),
						  PhoneButton('전화하기', '354-86-00070'),
						  ShareButton('공유하기')
					  ])
	ch = CarouselHeader('커머스 카드\n케로셀 헤드 예제', None, thumbnail=Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg'))
	carousel = Carousel(items=[cc, cc], header=ch)
	sb.append(carousel)
	assert(trueDict == sb.to_dict())
def test_carousel():
	# 케로셀 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C%EC%BD%94%EB%93%9C
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"carousel": {
						"type": "basicCard",
						"items": [
							{
								"title": "보물상자",
								"description": "보물상자 안에는 뭐가 있을까",
								"thumbnail": {
									"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg"
								},
								"buttons": [
									{
										"action": "message",
										"label": "열어보기",
										"messageText": "짜잔! 우리가 찾던 보물입니다"
									},
									{
										"action":  "webLink",
										"label": "구경하기",
										"webLinkUrl": "https://e.kakao.com/t/hello-ryan"
									}
								]
							},
							{
								"title": "보물상자2",
								"description": "보물상자2 안에는 뭐가 있을까",
								"thumbnail": {
									"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg"
								},
								"buttons": [
									{
										"action": "message",
										"label": "열어보기",
										"messageText": "짜잔! 우리가 찾던 보물입니다"
									},
									{
										"action":  "webLink",
										"label": "구경하기",
										"webLinkUrl": "https://e.kakao.com/t/hello-ryan"
									}
								]
							},
							{
								"title": "보물상자3",
								"description": "보물상자3 안에는 뭐가 있을까",
								"thumbnail": {
									"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg"
								},
								"buttons": [
									{
										"action": "message",
										"label": "열어보기",
										"messageText": "짜잔! 우리가 찾던 보물입니다"
									},
									{
										"action":  "webLink",
										"label": "구경하기",
										"webLinkUrl": "https://e.kakao.com/t/hello-ryan"
										}
								]
							}
						]
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	bc1 = BasicCard(thumbnail=Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg'),
			  		title='보물상자',
			  		description='보물상자 안에는 뭐가 있을까',
			  		buttons=[
				  		MessageButton('열어보기', '짜잔! 우리가 찾던 보물입니다'),
				  		WeblinkButton('구경하기', 'https://e.kakao.com/t/hello-ryan')
			  		])
	bc2 = BasicCard(thumbnail=Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg'),
			  		title='보물상자2',
			  		description='보물상자2 안에는 뭐가 있을까',
			  		buttons=[
				  		MessageButton('열어보기', '짜잔! 우리가 찾던 보물입니다'),
				  		WeblinkButton('구경하기', 'https://e.kakao.com/t/hello-ryan')
			  		])
	bc3 = BasicCard(thumbnail=Thumbnail('http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg'),
			  		title='보물상자3',
			  		description='보물상자3 안에는 뭐가 있을까',
			  		buttons=[
				  		MessageButton('열어보기', '짜잔! 우리가 찾던 보물입니다'),
				  		WeblinkButton('구경하기', 'https://e.kakao.com/t/hello-ryan')
			  		])
	carousel = Carousel(items=[bc1, bc2, bc3])
	sb.append(carousel)
	assert(trueDict == sb.to_dict())
def test_listCard():
	# 리스트 카드 테스트
	# https://i.kakao.com/docs/skill-response-format#%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C-8
	trueDict = {
		"version": "2.0",
		"template": {
			"outputs": [
				{
					"listCard": {
						"header": {
							"title": "카카오 i 디벨로퍼스를 소개합니다"
						},
						"items": [
							{
								"title": "Kakao i Developers",
								"description": "새로운 AI의 내일과 일상의 변화",
								"imageUrl": "http://k.kakaocdn.net/dn/APR96/btqqH7zLanY/kD5mIPX7TdD2NAxgP29cC0/1x1.jpg",
								"link": {
									"web": "https://namu.wiki/w/%EB%9D%BC%EC%9D%B4%EC%96%B8(%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%94%84%EB%A0%8C%EC%A6%88)"
								}
							},
							{
								"title": "Kakao i Open Builder",
								"description": "카카오톡 채널 챗봇 만들기",
								"imageUrl": "http://k.kakaocdn.net/dn/N4Epz/btqqHCfF5II/a3kMRckYml1NLPEo7nqTmK/1x1.jpg",
								"link": {
									"web": "https://namu.wiki/w/%EB%AC%B4%EC%A7%80(%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%94%84%EB%A0%8C%EC%A6%88)"
								}
							},
							{
								"title": "Kakao i Voice Service",
								"description": "보이스봇 / KVS 제휴 신청하기",
								"imageUrl": "http://k.kakaocdn.net/dn/bE8AKO/btqqFHI6vDQ/mWZGNbLIOlTv3oVF1gzXKK/1x1.jpg",
								"link": {
									"web": "https://namu.wiki/w/%EC%96%B4%ED%94%BC%EC%B9%98"
								}
							}
						],
						"buttons": [
							{
							"label": "구경가기",
							"action": "webLink",
							"webLinkUrl": "https://namu.wiki/w/%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%94%84%EB%A0%8C%EC%A6%88"
							}
						]
					}
				}
			]
		}
	}
	sb = SkillResponseBuilder()
	item1 = ListItem('Kakao i Developers', '새로운 AI의 내일과 일상의 변화', 'http://k.kakaocdn.net/dn/APR96/btqqH7zLanY/kD5mIPX7TdD2NAxgP29cC0/1x1.jpg',
			 		 Link(web='https://namu.wiki/w/%EB%9D%BC%EC%9D%B4%EC%96%B8(%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%94%84%EB%A0%8C%EC%A6%88)'))
	item2 = ListItem('Kakao i Open Builder', '카카오톡 채널 챗봇 만들기', 'http://k.kakaocdn.net/dn/N4Epz/btqqHCfF5II/a3kMRckYml1NLPEo7nqTmK/1x1.jpg',
			 		 Link(web='https://namu.wiki/w/%EB%AC%B4%EC%A7%80(%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%94%84%EB%A0%8C%EC%A6%88)'))
	item3 = ListItem('Kakao i Voice Service', '보이스봇 / KVS 제휴 신청하기', 'http://k.kakaocdn.net/dn/bE8AKO/btqqFHI6vDQ/mWZGNbLIOlTv3oVF1gzXKK/1x1.jpg',
			 		 Link(web='https://namu.wiki/w/%EC%96%B4%ED%94%BC%EC%B9%98'))
	items = [item1, item2, item3]
	buttons = [WeblinkButton('구경가기', 'https://namu.wiki/w/%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%94%84%EB%A0%8C%EC%A6%88')]
	listCard = ListCard(ListItem('카카오 i 디벨로퍼스를 소개합니다'), items, buttons)
	sb.append(listCard)
	assert(trueDict == sb.to_dict())