/**
 * 
 */
package org.hamster.weixinmp.test.xml;

import org.dom4j.DocumentException;
import org.hamster.weixinmp.controller.util.WxXmlUtil;
import org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity;
import org.junit.Assert;
import org.junit.Test;


/**
 * @author [email protected]
 * @version Jul 28, 2013
 * 
 */
public class WxXMLUtilTest {

	public static final String MSG_TEXT_XML = "<xml>"
			+ "<ToUserName><![CDATA[toUser]]></ToUserName>"
			+ "<FromUserName><![CDATA[fromUser]]></FromUserName> "
			+ "<CreateTime>1348831860</CreateTime>"
			+ "<MsgType><![CDATA[text]]></MsgType>"
			+ "<Content><![CDATA[this is a test]]></Content>"
			+ "<MsgId>1234567890123456</MsgId>" + "</xml>";
	
	@Test
	public void testGetMsgText() throws DocumentException {
		WxMsgTextEntity msgText = WxXmlUtil.getMsgText(WxXmlUtil.toXML(MSG_TEXT_XML));
		assertBaseFieldsWithMsgId(msgText);
		Assert.assertEquals("this is a test", msgText.getContent());
	}
	
	public static final String MSG_IMG_XML = "<xml>"
			+ "<ToUserName><![CDATA[toUser]]></ToUserName>"
			+ "<FromUserName><![CDATA[fromUser]]></FromUserName>"
			+ "<CreateTime>1348831860</CreateTime>"
			+ "<MsgType><![CDATA[image]]></MsgType>"
			+ "<PicUrl><![CDATA[this is a url]]></PicUrl>"
			+ "<MediaId><![CDATA[media_id]]></MediaId>"
			+ "<MsgId>1234567890123456</MsgId>" + "</xml>";
	
	@Test
	public void testGetMsgImg() throws DocumentException {
		WxMsgImageEntity msgImg = WxXmlUtil.getMsgImage(WxXmlUtil.toXML(MSG_IMG_XML));
		assertBaseFieldsWithMsgId(msgImg);
		//Assert.assertEquals("this is a url", msgImg.getImage().getPicUrl());
	}
	
	public static final String MSG_LOC_XML = "<xml>"
			+ "<ToUserName><![CDATA[toUser]]></ToUserName>"
			+ "<FromUserName><![CDATA[fromUser]]></FromUserName>"
			+ "<CreateTime>1351776360</CreateTime>"
			+ "<MsgType><![CDATA[location]]></MsgType>"
			+ "<Location_X>23.134521</Location_X>"
			+ "<Location_Y>113.358803</Location_Y>" 
			+ "<Scale>20</Scale>"
			+ "<Label><![CDATA[位置信息]]></Label>"
			+ "<MsgId>1234567890123456</MsgId>" + "</xml> ";
	
	@Test
	public void testGetMsgLoc() throws DocumentException {
		WxMsgLocEntity msgLoc = WxXmlUtil.getMsgLoc(WxXmlUtil.toXML(MSG_LOC_XML));
		assertBaseFieldsWithMsgId(msgLoc);
		Assert.assertEquals(Double.valueOf(23.134521d), msgLoc.getLocationX());
		Assert.assertEquals(Double.valueOf(113.358803d), msgLoc.getLocationY());
		Assert.assertEquals(Double.valueOf(20), msgLoc.getScale());
		Assert.assertEquals("位置信息", msgLoc.getLabel());
	}
	
	public static final String MSG_LINK_XML = "<xml>"
			+ "<ToUserName><![CDATA[toUser]]></ToUserName>"
			+ "<FromUserName><![CDATA[fromUser]]></FromUserName>"
			+ "<CreateTime>1351776360</CreateTime>"
			+ "<MsgType><![CDATA[link]]></MsgType>"
			+ "<Title><![CDATA[公众平台官网链接]]></Title>"
			+ "<Description><![CDATA[公众平台官网链接123]]></Description>"
			+ "<Url><![CDATA[url]]></Url>" + "<MsgId>1234567890123456</MsgId>"
			+ "</xml> ";
	
	@Test
	public void testGetMsgLink() throws DocumentException {
		WxMsgLinkEntity msgLink = WxXmlUtil.getMsgLink(WxXmlUtil.toXML(MSG_LINK_XML));
		assertBaseFieldsWithMsgId(msgLink);
		Assert.assertEquals("公众平台官网链接", msgLink.getTitle());
		Assert.assertEquals("公众平台官网链接123", msgLink.getDescription());
		Assert.assertEquals("url", msgLink.getUrl());
	}
	
	public static final String MSG_EVENT_XML = "<xml>"
			+ "<ToUserName><![CDATA[toUser]]></ToUserName>"
			+ "<FromUserName><![CDATA[FromUser]]></FromUserName>"
			+ "<CreateTime>123456789</CreateTime>"
			+ "<MsgType><![CDATA[event]]></MsgType>"
			+ "<Event><![CDATA[EVENT]]></Event>"
			+ "<EventKey><![CDATA[EVENTKEY]]></EventKey>" + "</xml>";
	
	@Test
	public void testGetMsgEvent() throws DocumentException {
		WxMsgEventEntity msgEvent = WxXmlUtil.getMsgEvent(WxXmlUtil.toXML(MSG_EVENT_XML));
		assertBaseFields(msgEvent);
		Assert.assertEquals("EVENT", msgEvent.getEvent());
		Assert.assertEquals("EVENTKEY", msgEvent.getEventKey());
	}
	
	private void assertBaseFields(WxBaseMsgEntity entity) {
		Assert.assertNotNull(entity.getFromUserName()); 
		Assert.assertNotNull(entity.getToUserName()); 
		Assert.assertNotNull(entity.getCreateTime()); 
		Assert.assertNotNull(entity.getMsgType()); 
	}
	
	private void assertBaseFieldsWithMsgId(WxBaseMsgEntity entity) {
		assertBaseFields(entity);
		Assert.assertNotNull(entity.getMsgId()); 
	}

}