wechaty-puppet-wechat
Version:
Puppet WeChat for Wechaty
201 lines • 10.6 kB
JavaScript
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Wechaty - https://github.com/chatie/wechaty
*
* @copyright 2016-2018 Huan LI <zixia@zixia.net>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
const tstest_1 = require("tstest");
const config_js_1 = require("../src/config.js");
const PUPPET = __importStar(require("wechaty-puppet"));
const puppet_wechat_js_1 = require("../src/puppet-wechat.js");
// class WechatyTest extends Wechaty {
// public initPuppetAccessory (puppet: PuppetWeChat) {
// super.initPuppetAccessory(puppet)
// }
// }
class PuppetTest extends puppet_wechat_js_1.PuppetWeChat {
contactRawPayload(id) {
return super.contactRawPayload(id);
}
roomRawPayload(id) {
return super.roomRawPayload(id);
}
messageRawPayload(id) {
return super.messageRawPayload(id);
}
}
// class PuppetWeChatTest extends PuppetWeChat {
// public id?: string = undefined
// }
(0, tstest_1.test)('constructor()', async (t) => {
const puppet = new PuppetTest();
// const wechaty = new WechatyTest({ puppet })
// wechaty.initPuppetAccessory(puppet)
const MOCK_USER_ID = 'TEST-USER-ID';
const rawPayload = JSON.parse('{"MsgId":"179242112323992762","FromUserName":"@0bb3e4dd746fdbd4a80546aef66f4085","ToUserName":"@16d20edf23a3bf3bc71bb4140e91619f3ff33b4e33f7fcd25e65c1b02c7861ab","MsgType":1,"Content":"test123","Status":3,"ImgStatus":1,"CreateTime":1461652670,"VoiceLength":0,"PlayLength":0,"FileName":"","FileSize":"","MediaId":"","Url":"","AppMsgType":0,"StatusNotifyCode":0,"StatusNotifyUserName":"","RecommendInfo":{"UserName":"","NickName":"","QQNum":0,"Province":"","City":"","Content":"","Signature":"","Alias":"","Scene":0,"VerifyFlag":0,"AttrStatus":0,"Sex":0,"Ticket":"","OpCode":0},"ForwardFlag":0,"AppInfo":{"AppID":"","Type":0},"HasProductId":0,"Ticket":"","ImgHeight":0,"ImgWidth":0,"SubMsgType":0,"NewMsgId":179242112323992770,"MMPeerUserName":"@0bb3e4dd746fdbd4a80546aef66f4085","MMDigest":"test123","MMIsSend":false,"MMIsChatRoom":false,"MMUnread":true,"LocalID":"179242112323992762","ClientMsgId":"179242112323992762","MMActualContent":"test123","MMActualSender":"@0bb3e4dd746fdbd4a80546aef66f4085","MMDigestTime":"14:37","MMDisplayTime":1461652670,"MMTime":"14:37"}');
const EXPECTED = {
id: '179242112323992762',
talkerId: '@0bb3e4dd746fdbd4a80546aef66f4085',
};
const sandbox = tstest_1.sinon.createSandbox();
const mockMessagePayload = async ( /* _: string */) => {
const payload = {
id: EXPECTED.id,
listenerId: 'listenerId',
mentionIdList: [],
talkerId: EXPECTED.talkerId,
timestamp: Date.now(),
type: PUPPET.types.Message.Text,
};
return payload;
};
sandbox.stub(puppet, 'contactPayload').returns({});
// sandbox.stub(puppet, 'contactPayloadCache').returns({})
sandbox.stub(puppet, 'roomPayload').returns({});
// sandbox.stub(puppet, 'roomPayloadCache').returns({})
sandbox.stub(puppet, 'messagePayload').callsFake(mockMessagePayload);
// sandbox.stub(puppet, 'messagePayloadCache').callsFake(mockMessagePayload)
await puppet.login(MOCK_USER_ID);
const msgPayload = await puppet.messagePayload(rawPayload.MsgId);
t.equal(msgPayload.id, EXPECTED.id, 'id right');
t.equal(msgPayload.talkerId, EXPECTED.talkerId, 'talkerId right');
sandbox.restore();
});
// Issue #445
// XXX have to use test.serial() because mockGetContact can not be parallel
(0, tstest_1.test)('ready()', async (t) => {
// must different with other rawData, because Contact class with load() will cache the result. or use Contact.resetPool()
const rawPayload = JSON.parse('{"MsgId":"3009511950433684462","FromUserName":"@0748ee480711bf20af91c298a0d7dcc77c30a680c1004157386b81cf13474823","ToUserName":"@b58f91e0c5c9e841e290d862ddb63c14","MsgType":1,"Content":"哈哈","Status":3,"ImgStatus":1,"CreateTime":1462887888,"VoiceLength":0,"PlayLength":0,"FileName":"","FileSize":"","MediaId":"","Url":"","AppMsgType":0,"StatusNotifyCode":0,"StatusNotifyUserName":"","RecommendInfo":{"UserName":"","NickName":"","QQNum":0,"Province":"","City":"","Content":"","Signature":"","Alias":"","Scene":0,"VerifyFlag":0,"AttrStatus":0,"Sex":0,"Ticket":"","OpCode":0},"ForwardFlag":0,"AppInfo":{"AppID":"","Type":0},"HasProductId":0,"Ticket":"","ImgHeight":0,"ImgWidth":0,"SubMsgType":0,"NewMsgId":3009511950433684500,"MMPeerUserName":"@0748ee480711bf20af91c298a0d7dcc77c30a680c1004157386b81cf13474823","MMDigest":"哈哈","MMIsSend":false,"MMIsChatRoom":false,"MMUnread":false,"LocalID":"3009511950433684462","ClientMsgId":"3009511950433684462","MMActualContent":"哈哈","MMActualSender":"@0748ee480711bf20af91c298a0d7dcc77c30a680c1004157386b81cf13474823","MMDigestTime":"21:44","MMDisplayTime":1462887888,"MMTime":"21:44","_h":104,"_index":0,"_offsetTop":0,"$$hashKey":"098"}');
const expectedFromUserName = '@0748ee480711bf20af91c298a0d7dcc77c30a680c1004157386b81cf13474823';
const expectedToUserName = '';
const expectedFromNickName = 'From Nick Name';
const expectedToNickName = 'To Nick Name';
const expectedMsgId = '3009511950433684462';
// Mock
function mockContactRawPayload(id) {
config_js_1.log.silly('TestMessage', 'mocked getContact(%s)', id);
return new Promise(resolve => {
let obj = {};
switch (id) {
case expectedFromUserName:
obj = {
NickName: expectedFromNickName,
UserName: expectedFromUserName,
};
break;
case expectedToUserName:
obj = {
NickName: expectedToNickName,
UserName: expectedToUserName,
};
break;
default:
config_js_1.log.error('TestMessage', 'mocked getContact(%s) unknown', id);
t.fail(`mocked getContact(${id}) unknown`);
break;
}
config_js_1.log.silly('TestMessage', 'setTimeout mocked getContact');
setTimeout(() => {
config_js_1.log.silly('TestMessage', 'mocked getContact resolved');
return resolve(obj);
}, 100);
});
}
async function mockMessageRawPayload(id) {
if (id === rawPayload.MsgId) {
return rawPayload;
}
return {};
}
const sandbox = tstest_1.sinon.createSandbox();
const puppet = new PuppetTest();
// const wechaty = new WechatyTest({ puppet })
// wechaty.initPuppetAccessory(puppet)
sandbox.stub(puppet, 'contactRawPayload').callsFake(mockContactRawPayload);
sandbox.stub(puppet, 'messageRawPayload').callsFake(mockMessageRawPayload);
// const m = wechaty.Message.create(rawPayload.MsgId)
const msgPayload = await puppet.messagePayload(rawPayload.MsgId);
t.equal(msgPayload.id, expectedMsgId, 'id/MsgId right');
const talkerId = msgPayload.talkerId;
const listenerId = msgPayload.listenerId;
if (!talkerId || !listenerId) {
throw new Error('no talker or no listener');
}
const fromContactPayload = await puppet.contactPayload(talkerId);
const toContactPayload = await puppet.contactPayload(listenerId);
t.equal(talkerId, expectedFromUserName, 'contact ready for FromUserName');
t.equal(fromContactPayload.name, expectedFromNickName, 'contact ready for FromNickName');
t.equal(listenerId, expectedToUserName, 'contact ready for ToUserName');
t.equal(toContactPayload.name, expectedToNickName, 'contact ready for ToNickName');
sandbox.restore();
});
// test('find()', async t => {
// const puppet = new PuppetWeChat()
// // const wechaty = new WechatyTest({ puppet })
// // wechaty.initPuppetAccessory(puppet)
// const sandbox = sinon.createSandbox()
// sandbox.stub(puppet, 'contactPayload').resolves({})
// sandbox.stub(puppet, 'contactPayloadCache').returns({})
// const MOCK_USER_ID = 'TEST-USER-ID'
// await puppet.login(MOCK_USER_ID)
// const msg = await wechaty.Message.find({
// id: 'xxx',
// })
// t.ok(msg, 'Message found')
// t.ok(msg!.id, 'Message.id is ok')
// sandbox.restore()
// })
// test('findAll()', async t => {
// const puppet = new PuppetTest()
// const wechaty = new WechatyTest({ puppet })
// wechaty.initPuppetAccessory(puppet)
// const sandbox = sinon.createSandbox()
// sandbox.stub(puppet, 'contactPayload').resolves({})
// sandbox.stub(puppet, 'contactPayloadCache').returns({})
// const MOCK_USER_ID = 'TEST-USER-ID'
// await puppet.login(MOCK_USER_ID)
// const msgList = await wechaty.Message.findAll({
// from: 'yyy',
// })
// t.equal(msgList.length, 2, 'Message.findAll with limit 2')
// sandbox.restore()
// })
//# sourceMappingURL=puppeteer-message.spec.js.map