@@ -497,4 +497,78 @@ public void testIntelligentRobotMessage() {
497497 assertEquals (wxMessage .getRobotId (), "robot_id_123" );
498498 assertEquals (wxMessage .getSessionId (), "session_id_456" );
499499 }
500+
501+ /**
502+ * Test external chat change event
503+ * 测试企业微信群聊变更事件解析 - 群成员变更场景
504+ */
505+ public void testExternalChatChangeEvent () {
506+ // 测试群成员加入事件
507+ String xmlAddMember = "<xml>"
508+ + "<ToUserName><![CDATA[toUser]]></ToUserName>"
509+ + "<FromUserName><![CDATA[sys]]></FromUserName>"
510+ + "<CreateTime>1403610513</CreateTime>"
511+ + "<MsgType><![CDATA[event]]></MsgType>"
512+ + "<Event><![CDATA[change_external_chat]]></Event>"
513+ + "<ChangeType><![CDATA[update]]></ChangeType>"
514+ + "<ChatId><![CDATA[wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA]]></ChatId>"
515+ + "<UpdateDetail><![CDATA[add_member]]></UpdateDetail>"
516+ + "<JoinScene>1</JoinScene>"
517+ + "<MemChangeCnt>2</MemChangeCnt>"
518+ + "<MemChangeList><![CDATA[wmEJiCwAAA9KG2qlSq6rKwASSgAAAA,wmEJiCwAAA9KG2qlSq6rKwBBBBBBB]]></MemChangeList>"
519+ + "</xml>" ;
520+ WxCpXmlMessage wxMessage = WxCpXmlMessage .fromXml (xmlAddMember );
521+ assertEquals (wxMessage .getToUserName (), "toUser" );
522+ assertEquals (wxMessage .getFromUserName (), "sys" );
523+ assertEquals (wxMessage .getCreateTime (), Long .valueOf (1403610513L ));
524+ assertEquals (wxMessage .getMsgType (), WxConsts .XmlMsgType .EVENT );
525+ assertEquals (wxMessage .getEvent (), WxCpConsts .EventType .CHANGE_EXTERNAL_CHAT );
526+ assertEquals (wxMessage .getChangeType (), "update" );
527+ assertEquals (wxMessage .getChatId (), "wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA" );
528+ assertEquals (wxMessage .getUpdateDetail (), "add_member" );
529+ assertEquals (wxMessage .getJoinScene (), "1" );
530+ assertEquals (wxMessage .getMemChangeCnt (), "2" );
531+ assertEquals (wxMessage .getMemChangeList (), "wmEJiCwAAA9KG2qlSq6rKwASSgAAAA,wmEJiCwAAA9KG2qlSq6rKwBBBBBBB" );
532+
533+ // 测试群成员退出事件
534+ String xmlDelMember = "<xml>"
535+ + "<ToUserName><![CDATA[toUser]]></ToUserName>"
536+ + "<FromUserName><![CDATA[sys]]></FromUserName>"
537+ + "<CreateTime>1403610513</CreateTime>"
538+ + "<MsgType><![CDATA[event]]></MsgType>"
539+ + "<Event><![CDATA[change_external_chat]]></Event>"
540+ + "<ChangeType><![CDATA[update]]></ChangeType>"
541+ + "<ChatId><![CDATA[wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA]]></ChatId>"
542+ + "<UpdateDetail><![CDATA[del_member]]></UpdateDetail>"
543+ + "<QuitScene>1</QuitScene>"
544+ + "<MemChangeCnt>1</MemChangeCnt>"
545+ + "<MemChangeList><![CDATA[wmEJiCwAAA9KG2qlSq6rKwASSgAAAA]]></MemChangeList>"
546+ + "</xml>" ;
547+ WxCpXmlMessage wxMessage2 = WxCpXmlMessage .fromXml (xmlDelMember );
548+ assertEquals (wxMessage2 .getEvent (), WxCpConsts .EventType .CHANGE_EXTERNAL_CHAT );
549+ assertEquals (wxMessage2 .getChangeType (), "update" );
550+ assertEquals (wxMessage2 .getChatId (), "wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA" );
551+ assertEquals (wxMessage2 .getUpdateDetail (), "del_member" );
552+ assertEquals (wxMessage2 .getQuitScene (), "1" );
553+ assertEquals (wxMessage2 .getMemChangeCnt (), "1" );
554+ assertEquals (wxMessage2 .getMemChangeList (), "wmEJiCwAAA9KG2qlSq6rKwASSgAAAA" );
555+
556+ // 测试空MemChangeList场景(某些情况下可能没有成员变更列表)
557+ String xmlNoMemChangeList = "<xml>"
558+ + "<ToUserName><![CDATA[toUser]]></ToUserName>"
559+ + "<FromUserName><![CDATA[sys]]></FromUserName>"
560+ + "<CreateTime>1403610513</CreateTime>"
561+ + "<MsgType><![CDATA[event]]></MsgType>"
562+ + "<Event><![CDATA[change_external_chat]]></Event>"
563+ + "<ChangeType><![CDATA[update]]></ChangeType>"
564+ + "<ChatId><![CDATA[wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA]]></ChatId>"
565+ + "<UpdateDetail><![CDATA[change_name]]></UpdateDetail>"
566+ + "</xml>" ;
567+ WxCpXmlMessage wxMessage3 = WxCpXmlMessage .fromXml (xmlNoMemChangeList );
568+ assertEquals (wxMessage3 .getEvent (), WxCpConsts .EventType .CHANGE_EXTERNAL_CHAT );
569+ assertEquals (wxMessage3 .getChangeType (), "update" );
570+ assertEquals (wxMessage3 .getUpdateDetail (), "change_name" );
571+ // 当XML中没有MemChangeList元素时,字段应该为null而不是空字符串
572+ assertThat (wxMessage3 .getMemChangeList ()).isNull ();
573+ }
500574}
0 commit comments